๐ ๊ฐ์
์ด๋ฒ ํ๋ก์ ํธ์์ Jira๋ฅผ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ๋ค.
GitHub์์ Issue๋ฅผ ์์ฑํ์ ๋, ์๋์ผ๋ก Jira์๋ ์ด์๊ฐ ์์ฑ๋๊ณ
GitHub์์ Issue๋ฅผ close ํ์ ๋, Jira์ ์ด์๋ ์๋์ผ๋ก ์๋ฃ ์ํ๋ก ๋ฐ๋๊ฒ ์ ์ฉํ๋ค.
Jira๋ฅผ ํตํด ๊ฐ๋ฐ ์งํ ์ํฉ์ ์ฒดํฌํ๊ณ ,
๋ฒ๋ค์ด ์ฐจํธ๋ฅผ ํ์ฉํ์ฌ ์คํ๋ฆฐํธ ํ๊ณ ๊น์ง ํด๋ณด๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Jira์ GitHub ์ฐ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ,
๋ค์ ํฌ์คํ ์์ Jira ๊ฐ๋จ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
๐ Jira์ GitHub ์ฐ๋ํ๊ธฐ
์ด ๋ธ๋ก๊ทธ๋ฅผ ๋ฐ๋ผ ํด๋ณด์๊ณ ,
Jira UI๊ฐ ๋ฐ๋ ๋ถ๋ถ์ด ๋ง์ ๋ด ๋ธ๋ก๊ทธ์๋ ๊ณผ์ ์ ๋จ๊ฒจ๋ณด์๋ค.
(์ด ํฌ์คํ ์ ์ฐธ๊ณ ํ ๋, ๋ UI๊ฐ ๋ฐ๋์ด ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.)
Jira์ ์ ์ํ์ฌ ์๋จ ์ฑ → ๋ ๋ง์ ์ฑ ์ดํด๋ณด๊ธฐ๋ก ์ด๋
GitHub for Jira๋ฅผ ๊ฒ์ํ์ฌ ํด๋ฆญ
๋ง์ฝ ์์ง ๋ค์ด์ด ์๋ ์ํ๋ฉด Try it free
๋ Get it now
๋ฒํผ์ ๋๋ฌ ๋ค์ด ๋ฐ์์ฃผ๊ณ ,
๋ค์ด์ด ์๋ฃ๋ ์ํ๋ผ๋ฉด Get Started
๋ฒํผ์ ๋๋ฌ์ค
๋๋ ์ด๋ฏธ ์ฐ๊ฒฐ๋ organization์ด ์๊ธฐ ๋๋ฌธ์ organization ๋ชฉ๋ก์ด ๋จ๋๋ฐ,
์ฐ๊ฒฐ๋ organization์ด ์๋ค๋ฉด ์ฐ๊ฒฐํ๋ผ๋ ์ฐฝ์ด ๋ฌ๋ค.
์ถ๊ฐ๋ก organization์ ์ฐ๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ์๋จ์ Connect a GitHub organization
๋ฒํผ์ ๋๋ฅด๋ฉด ๋๋ค.
๊ทธ๋ผ ๋ ์ค์ ์ด๋ ๊ฑธ๋ก ์ฐ๊ฒฐํ ์ง ์ ํํด์ผ ํ๋ค.
์ค๋ฅธ์ชฝ์ ๋ฌผ์ํ์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค ๋์ด ๋ฌด์จ ์ฐจ์ด์ธ์ง ํ์ธํด๋ณด๋
Cloud๋ GitHub organization URL์ด http://github.com
์ผ๋ก ์์ํ๋ ๊ฒฝ์ฐ์ ์ ํํ๊ณ ,
Server๋ ์จํ๋ ๋ฏธ์ค ๋ฒ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ์ ์ ํํ๋ผ๊ณ ๋์์๋ค.
๋๋ Cloud๋ฅผ ์ ํํด์คฌ๋ค.
Continue
๋ฅผ ๋๋ฌ์ฃผ๊ณ
๋ ๋ค์ Cloud๋ Server๋ ์ ํํ๋ผ๋ ์ฐฝ์ด ๋ฌ๋ค.
๋ค์ GitHub Cloud
๋ฅผ ์ ํ ํ Next
๋ฅผ ๋๋ฌ์ค๋ค.
Select an organization in GitHub
๋ฒํผ์ ๋๋ฌ organization์ ์ ํํด์ฃผ๋ฌ ๊ฐ๋ค.
organization ๋ชฉ๋ก ์ค ์ฐ๊ฒฐํ๊ณ ์ถ์ organization ์ ํ
๋ง์ฝ organization์ ๊ถํ์ด ์๋ค๋ฉด ํด๋น ์์ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ฌ๊ธฐ์ ๊ณ์ ๋งํ๋ค๋ฉด organization ๊ถํ์ ํ์ธํด๋ณด์.
All repositories
๋ก organization์ ๋ชจ๋ repository๋ฅผ ์ ํํ ์ ์๊ณ ,
Only select repositories
๋ก ์ผ๋ถ repository๋ค๋ง ์ ํํ ์ ์๋ค.
๋๋ ๋ค๋ฅธ ํ์ repository๋ฅผ ํจ๋ถ๋ฌ ๊ฑด๋๋ฆฌ๋ฉด ์๋๋ Only select repositories
๋ก ์ฐ๋ฆฌ repository๋ค๋ง ์ถ๊ฐํด์ฃผ์๋ค.
์ฐ๊ฒฐํ๊ณ ์ถ์ repository๋ฅผ ์ ํํ๋ค๋ฉด
Install
ํน์ Request
๋ฒํผ ํด๋ฆญ
์ด์ Jira์ ์ฑ ํญ์ GitHub for Jira → Configure์์ ์ฐ๋๋ organization์ ํ์ธํ ์ ์๋ค.
๋ํ GitHub organization์ Settings์์
Third-party Access → GitHub Apps → Jira configure → Repository access์์
์ฐ๋๋ repository๋ฅผ ํ์ธํ ์ ์๋ค.
๐ Jira ํ๋ก์ ํธ ์์ฑํ๊ธฐ
์ด์ Jira์์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด์.
์๋จ์ ํ๋ก์ ํธ → ํ๋ก์ ํธ ๋ง๋ค๊ธฐ ์ ํ
ํ ํ๋ฆฟ ์ ํ์์ ์ํํธ์จ์ด ๊ฐ๋ฐ → ์คํฌ๋ผ์ ์ ํํด์ฃผ์๋ค.
์ฃผ๋ก ์นธ๋ฐ๊ณผ ์คํฌ๋ผ์ ๋ง์ด ์ ํํ๋ค๊ณ ํ๋ค.
ํ๋ณ๋ก ์ด๋ค ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฅ ํ ํ๋ฆฟ์ผ ๋ฟ, ์ดํ์ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํ ์ ์์ผ๋ ์๋ฌด๊ฑฐ๋ ๊ณจ๋ผ๋ ๋ ๊ฒ ๊ฐ๋ค.
ํ๋ก์ ํธ ์ ํ์ ํ์์ ๊ด๋ฆฌ๋ฅผ ์ ํ
์ด๋ฆ์ ํ๋ก์ ํธ๋ช ์ผ๋ก ํด์คฌ๋ค.
ํค๋ ๋์ค์ ํฐ์ผ ๋ฒํธ์ ํ์ฉ๋๋๋ฐ,
ํค๋ฅผ TXPM์ผ๋ก ์ง์๋ค๋ฉด TXPM-001 ์ด๋ฐ ์์ผ๋ก ํฐ์ผ ๋ฒํธ๊ฐ ์์ฑ๋๋ค.
๋ณดํต ํ๋ก์ ํธ๋ช ์ด๋์ ๋ก ํ๋ค๊ณ ๋ค ํ๋ค.
๋๋ ํ๋ช ์ ๋ฐ์ TK๋ก ํ๋ค.
์์ธ์ค๋ ์งํ ์ค์ผ๋ก ์ ํ
ํด๋น ํ๋ก์ ํธ์์ ๊ด๋ฆฌํ repository๋ฅผ ์ฐ๊ฒฐ
์ดํ Jira์์ ์์ฑํ ์ด์์ ํฐ์ผ ๋ฒํธ๋ฅผ ํฌํจํ์ฌ branch๋ฅผ ์์ฑํ๊ฑฐ๋ commit message๋ฅผ ์์ฑํ๋ฉด
Jira์ ์ด์์ ์ฐ๊ฒฐ์ํฌ ์ ์๋ค.
๐ GitHub action์ ํตํด Issue ์์ฑ ์ Jira ์ด์ ์๋ ์์ฑ&์ฐ๊ฒฐํ๊ธฐ
๋จผ์ , ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ค.
๊ฑฐ์ ๋์ผํ๊ฒ ๋ง๋ค๋, ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์ ์ฉํ๊ธฐ ์ํด ์ด์ง์ฉ ๋ฐ๊ฟ์ฃผ์๋ค.
๐ Issue form ๋ง๋ค๊ธฐ
repository ์๋จ์ .github/ISSUE_TEMPLATE/issue_form.yml ๊ฒฝ๋ก๋ก yml ํ์ผ์ ๋ง๋ค์ด ์ฃผ์๋ค.
name: 'WithBeeTravel-BE-Banking ์ด์ ์์ฑ'
description: 'WithBeeTravel-BE-Banking Repo์ ์ด์๋ฅผ ์์ฑํ๋ฉฐ, ์์ฑ๋ ์ด์๋ Jira์ ์ฐ๋๋ฉ๋๋ค.'
labels: []
title: '์ด์ ์ด๋ฆ์ ์์ฑํด์ฃผ์ธ์'
body:
- type: input
id: parentKey
attributes:
label: '์์ ์์
Ticket Number'
description: '์์ ์์
์ Ticket Number๋ฅผ ๊ธฐ์
ํด์ฃผ์ธ์'
placeholder: 'ex. TK-00'
validations:
required: true
- type: input
id: description
attributes:
label: '์ด์ ๋ด์ฉ(Description)'
description: '์ด์์ ๋ํด์ ๊ฐ๋ตํ ์ค๋ช
ํด์ฃผ์ธ์'
validations:
required: true
- type: textarea
id: details
attributes:
label: '์์ธ ๋ด์ฉ(Details)'
description: '์ด์์ ๋ํด์ ์์ธํ ์ค๋ช
ํด์ฃผ์ธ์'
value: |
- About Details
validations:
required: true
- type: textarea
id: tasks
attributes:
label: '์ฒดํฌ๋ฆฌ์คํธ(Tasks)'
description: 'ํด๋น ์ด์์ ๋ํด ํ์ํ ์์
๋ชฉ๋ก์ ์์ฑํด์ฃผ์ธ์'
value: |
- [ ] Task1
- [ ] Task2
validations:
required: true
- type: textarea
id: references
attributes:
label: '์ฐธ์กฐ(References)'
description: 'ํด๋น ์ด์๊ณผ ๊ด๋ จ๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์'
value: |
- Reference1
validations:
required: false
์ ๋ธ๋ก๊ทธ์์ ๊ฐ์ ธ์จ ์ด์ ํ ํ๋ฆฟ์ด๊ณ , ํด๋น ๊ฒฝ๋ก์ ์ด ํ์ผ์ ์ ์ฅํ๋ฉด Issue๋ฅผ ๋ง๋ค ๋ ๋ค์๊ณผ ๊ฐ์ด ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ ์๋ค.
Get started
๋ฒํผ์ ๋๋ฌ ์์์ ์์ฑํ ์ด์ ํ
ํ๋ฆฟ ์ฌ์ฉ
์ ํ ํ๋ฆฟ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๊ณ , ์ฐธ์กฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฐ๋ค์ ํ์ ์ ๋ ฅ ์ฌํญ์ด๋ฏ๋ก ๋ค ์์ฑํด์ฃผ์ด์ผ issue๋ฅผ ์์ฑํ ์ ์๋ค.
ํนํ, ์ด ๋ฐฉ๋ฒ์ ๋ฐ๋ผ GitHub Issue๋ฅผ ๋ง๋ค๋ฉด Jira์ ์ด์๋ฅผ Subtask๋ก ์์ฑํ๋ค.
์ฆ, Jira์ Story ํน์ Task ์์ ์์ ๋ฐ์ Subtask๋ก ์ด์๊ฐ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์
์์ ์์ ์ ํด๋นํ๋ Story ํน์ Task์ ํฐ์ผ ๋๋ฒ๋ฅผ ์ ์ด์ฃผ์ด์ผ ํ๋ค.
(Story, Task, Subtask์ ๋ํ ๋ด์ฉ์ ๋ค์ ํฌ์คํ ์์ ๋ค๋ค๋ณด๋ ค๊ณ ํ๋ค.)
๐ GitHub action ํ์ผ ๋ง๋ค๊ธฐ
์ด์ ์ค์ง์ ์ผ๋ก GitHub Issue๋ฅผ ์์ฑํ์ ๋
์ด ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์๋์ผ๋ก Jira์ ์ด์๋ฅผ ์์ฑํด์ฃผ๋ action ํ์ผ์ ๋ง๋ค๊ฒ ๋ค.
.github/workflows/create-jira-issue.yml
๊ฒฝ๋ก๋ก yml ํ์ผ์ ๋ง๋ค์ด์ฃผ์๋ค.
ํด๋น ํ์ผ๋ ๋ธ๋ก๊ทธ์ ์ฝ๋๋ฅผ ๊ฑฐ์ ๋์ผํ๊ฒ ์์ฑํ๋, ์ฐ๋ฆฌ ํ๋ก์ ํธ ์ํฉ์ ๋ง๊ฒ ์ด์ง์ฉ ์์ ํ๋ค.
์ฝ๋์ ๋ํ ์์ธํ ์ค๋ช ์ ๋ธ๋ก๊ทธ์ ์์ฃผ ์ ์ค๋ช ๋์ด ์์ผ๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๊ณ ,
๋ธ๋ก๊ทธ๋ง์ผ๋ก๋ ์ค๋ช ์ด ๋ถ์กฑํ ๋ถ๋ถ์ด ์๋ ๊ฒ ๊ฐ๋ค๋ฉด GPT์๊ฒ ์ฝ๋๋ฅผ ์ค๋ช ํด๋ฌ๋ผ๊ณ ํ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค.
name: Create Jira issue
on:
issues:
types:
- opened
jobs:
create-issue:
name: Create Jira issue
runs-on: ubuntu-latest
steps:
- name: Login
uses: atlassian/gajira-login@v3
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
- name: Checkout main code
uses: actions/checkout@v4
with:
ref: main
- name: Issue Parser
uses: stefanbuck/github-issue-praser@v3
id: issue-parser
with:
template-path: .github/ISSUE_TEMPLATE/issue_form.yml
- name: Log Issue Parser
run: |
echo '${{ steps.issue-parser.outputs.jsonString }}'
- name: Convert markdown to Jira Syntax
uses: peter-evans/jira2md@v1
id: md2jira
with:
input-text: |
### Github Issue Link
- ${{ github.event.issue.html_url }}
${{ github.event.issue.body }}
mode: md2jira
- name: Create Issue
id: create
uses: atlassian/gajira-create@v3
with:
project: TK
issuetype: Subtask
summary: "${{ github.event.issue.title }}"
description: "${{ steps.md2jira.outputs.output-text }}"
fields: |
{
"parent": {
"key": "${{ steps.issue-parser.outputs.issueparser_parentKey }}"
}
}
- name: Log created issue
run: echo "Jira Issue ${{ steps.issue-parser.outputs.parentKey }}/${{ steps.create.outputs.issue }} was created"
- name: Checkout develop code
uses: actions/checkout@v4
with:
ref: dev
- name: Create branch with Ticket number
run: |
# GitHub ์ด์ ์ ๋ชฉ์์ ํน์ ๋ฌธ์ ์ ๊ฑฐ ๋ฐ ๊ณต๋ฐฑ์ ํ์ดํ์ผ๋ก ๋ณ๊ฒฝ
CLEANED_TITLE=$(echo "${{ github.event.issue.title }}" | LC_CTYPE=C sed 's/[^a-zA-Z0-9๊ฐ-ํฃ ]//g' | sed 's/ /-/g')
BRANCH_NAME="feat/${{ steps.create.outputs.issue }}-${CLEANED_TITLE}"
# ๋ธ๋์น ์์ฑ ๋ฐ push
git checkout -b "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
- name: Update issue title
uses: actions-cool/issues-helper@v3
with:
actions: "update-issue"
token: ${{ secrets.GITHUB_TOKEN }}
title: "${{ steps.create.outputs.issue }} ${{ github.event.issue.title }}"
๋ณ๊ฒฝํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ๋ค.
- name: Create Issue
id: create
uses: atlassian/gajira-create@v3
with:
project: TK
issuetype: Subtask
summary: "${{ github.event.issue.title }}"
description: "${{ steps.md2jira.outputs.output-text }}"
fields: |
{
"parent": {
"key": "${{ steps.issue-parser.outputs.issueparser_parentKey }}"
}
}
with.project
์๋ ๋์ Jira ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ํค๋ฅผ ์ ์ด์ฃผ์๊ณ ,
Jira์ ์๋์ผ๋ก ์์ฑํ ์ด์ ํ์
์ with.issutype
์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
๋ง์ฝ ์ด ๋ถ๋ถ์์ ์๊พธ action์ด ์คํจํ๋ค๋ฉด with.project
์ with.issuetype
์ ํ์ธํด์ฃผ์.
๋์ ๊ฒฝ์ฐ Jira์์ ์ด์ ํ์ ์ด ์์ด๋ก Subtask๊ฐ ์๋๋ผ ํ๊ธ๋ก ์ ํ์์ด์ ์๋ฌ๊ฐ ๋ฌ์๋ค.
Jira์์ ์ด์ ํ์ ๋ช ์ Subtask๋ก ๋ฐ๊ฟ์ฃผ๋ ์ ๋์๊ฐ๋ค.
- name: Checkout develop code
uses: actions/checkout@v4
with:
ref: dev
๋ค์์ผ๋ก ๋ณ๊ฒฝํด์ค ๋ถ๋ถ์with.ref
์ด๋ค.
์ฐ๋ฆฌ ํ์ ๊ฐ๋ฐ ๋ธ๋์น ๋ช
์ develop
์ด ์๋ dev
๋ก ๋ง๋ค์ด์ฃผ์๊ธฐ ๋๋ฌธ์,
with.ref
๋ฅผ dev
๋ก ์์ ํด์ฃผ์๋ค.
- name: Create branch with Ticket number
run: |
# GitHub ์ด์ ์ ๋ชฉ์์ ํน์ ๋ฌธ์ ์ ๊ฑฐ ๋ฐ ๊ณต๋ฐฑ์ ํ์ดํ์ผ๋ก ๋ณ๊ฒฝ
CLEANED_TITLE=$(echo "${{ github.event.issue.title }}" | LC_CTYPE=C sed 's/[^a-zA-Z0-9๊ฐ-ํฃ ]//g' | sed 's/ /-/g')
BRANCH_NAME="feat/${{ steps.create.outputs.issue }}-${CLEANED_TITLE}"
# ๋ธ๋์น ์์ฑ ๋ฐ push
git checkout -b "$BRANCH_NAME"
git push origin "$BRANCH_NAME"
๋ค์์ผ๋ก ์์ ํด์ค ๋ถ๋ถ์ด๋ค.
ํด๋น ์ฝ๋๋ Jira์์ ์์ฑ๋ ์ด์์ ํฐ์ผ ๋๋ฒ๋ฅผ ๋ธ๋์น๋ช ์ผ๋ก ์ฌ์ฉํด์ ๋ธ๋์น๋ฅผ ์์ฑํด์ฃผ๋ ๋ถ๋ถ์ธ๋ฐ,
ํฐ์ผ ๋๋ฒ๋ก๋ง ๋ธ๋์น๋ช ์ด ๋ง๋ค์ด์ ธ ๋ธ๋์น๋ค์ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค๋ ํ์์ ์๊ฒฌ์ ์๋ ดํ์ฌ
{ํฐ์ผ ๋๋ฒ}-{์ด์ ํ์ดํ}
๋ก ๋ธ๋์น๋ช
์ ๋ง๋ค๋๋ก ์์ ํ์๋ค.
๋ธ๋์น๋ช ์ ํน์๋ฌธ์์ ๊ณต๋ฐฑ์ ํฌํจํ ์ ์๊ธฐ ๋๋ฌธ์
์ด์ ํ์ดํ์ ํฌํจ๋ ํน์๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ ๊ณต๋ฐฑ์ ํ์ดํ(-)์ผ๋ก ๋ฐ๊ฟ ์์ฑํ์๋ค.
ํด๋น ๋ฐฉ๋ฒ์ ์ ์ฉํ๋ฉด
์ด์ ํ์ดํ์ ๋๋ฌด ๊ธธ๊ฒ ์ ์ ๊ฒฝ์ฐ ๋ธ๋์น๋ฅผ ๋ณ๊ฒฝํ ๋ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ผ๋,
๋๋๋ก์ด๋ฉด ์ด์ ํ์ดํ์ ๊ฐ๊ฒฐํ๊ฒ ์ ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
๐ GitHub secret key ์ค์
์์ action ํ์ผ์์ JIRA_API_TOKEN
, JIRA_BASE_URL
, JIRA_USER_EMAIL
secret key๊ฐ ํ์ํ๋ค.
์ด secret key๋ GitHub Repository → Settings → Secrets and variables → Actions → Repository secrets์์
New repository secret
๋ฒํผ์ ํตํด ์ถ๊ฐํ ์ ์๋ค.
JIRA_API_TOKEN
: ์ฌ๊ธฐ์ API ํ ํฐ์ ๋ง๋ค ์ ์๋ค.
JIRA_BASE_URL
: Jira ํ๋ก์ ํธ ์ฃผ์ https://<yourdomain>/atlassian.net
JIRA_USER_EMAIL
: Jira์ ๋ฑ๋ก๋ email
๐ GitHub Issue ์์ฑ
์ด์ Jira์์ ์์ ์์ ์ธ Story๋ Task๋ฅผ ์์ฑํ ํ,
GitHub Issue๋ฅผ ์์ฑํ ๋ ์์ ์์ ์ ํฐ์ผ ๋๋ฒ๋ฅผ ์์ฑํด์ฃผ๋ฉด
์์ ์์ ์ ํ์ ์์ ์ผ๋ก Jira ์ด์๊ฐ ์๋ ์์ฑ๋๊ณ
์ด๋ ๊ฒ ์์ฑ๋ ์ด์์ ํฐ์ผ ๋๋ฒ๊ฐ GitHub Issue์ ํ์ดํ ์์ ์๋์ผ๋ก ์ถ๊ฐ๋์ด ์์ฑ๋๋ค!
๋ํ ์์ฑ๋ ์ด์์ ํฐ์ผ๋๋ฒ์ ์ด์ ํ์ดํ์ ์ด๋ฆ์ผ๋ก ๋ธ๋์น๋ ์์ฑ๋๋ฏ๋ก,
ํด๋น ๋ธ๋์น์์ ๊ฐ๋ฐ์ ์งํํ๋ฉด ๋๋ค~
๐ GitHub action์ ํตํด Issue close ์ Jira ์ด์ ์๋ ์๋ฃ ์ํ ๋ณ๊ฒฝํ๊ธฐ
๊ทธ๋ ๋ค๋ฉด ์์์ ์์ฑํ GitHub Issue์ ๋ํ ๊ฐ๋ฐ์ด ๋ง๋ฌด๋ฆฌ๋์ด Issue๋ฅผ closeํ๋ฉด
์ฐ๊ฒฐ๋ Jira์ ์ด์๋ ์๋์ผ๋ก ์๋ฃ ์ํ๋ก ๋ณ๊ฒฝ๋๋๋ก ํด๋ณด์!
์ด๋ฒ์๋ ์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๊ณ , ์ฐ๋ฆฌ ํ๋ก์ ํธ ์ํฉ์ ๋ง๊ฒ ํ์ผ์ ์์ ํด์ฃผ์๋ค.
๐ GitHub Action ํ์ผ ๋ง๋ค๊ธฐ
.github/workflows/close-jira-issue.yml
๊ฒฝ๋ก๋ก yml ํ์ผ์ ๋ง๋ค์ด์ฃผ์๋ค.
name: Close Jira Issue
on:
issues:
types:
- closed
jobs:
close-issue:
name: Close Jira Issue
runs-on: ubuntu-latest
steps:
- name: Login to Jira
uses: atlassian/gajira-login@v3
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
- name: Extract Jira issue key from GitHub issue title
id: extract-key
run: |
ISSUE_TITLE="${{ github.event.issue.title }}"
JIRA_KEY=$(echo "$ISSUE_TITLE" | grep -oE '[A-Z]+-[0-9]+')
echo "JIRA_KEY=$JIRA_KEY" >> $GITHUB_ENV
- name: Transition Jira Issue to Done
if: env.JIRA_KEY != ''
uses: atlassian/gajira-transition@v3
with:
issue: ${{ env.JIRA_KEY }}
transition: ์๋ฃ
- name: Log completed transition
run: echo "Jira Issue ${{ steps.issue-parser.outputs.issueparser_parentKey }} was transitioned to Done."
์ด๋ฒ์ ๋ณ๊ฒฝํ ๋ถ๋ถ์ ์ด ๋ถ๋ถ์ด๋ค.
- name: Transition Jira Issue to Done
if: env.JIRA_KEY != ''
uses: atlassian/gajira-transition@v3
with:
issue: ${{ env.JIRA_KEY }}
transition: ์๋ฃ
์ด ๋ถ๋ถ์์ ์๊พธ action์ด ์คํจํ๋ค.
๋์ Jira ํ๋ก์ ํธ์์๋ ์ด์ ์ํ๊ฐ ์์ด๋ก Done์ด ์๋๋ผ ์๋ฃ๋ก ๋์ด์๋ ๊ฒ ๊ฐ๋ค.
Jira flow?์์ ๋ดค์ ๋๋ Done์ด๋ผ๊ณ ์ค์ ๋์ด ์์ด์ ์ด๋๊ฐ ์๋ชป ๋๋์ง ํ์ฐธ ์ฐพ๋ค๊ฐ
action ํ์ผ์ with.transition
์ ์๋ฃ๋ก ๋ฐ๊ฟ๋ณด์๋๋ ์ฑ๊ณตํ๋ค.
์ด๊ฑด ์ด์ ์ํ๋ ์ด๋์์ ๋ฐ๊พธ๋์ง ๋ชฐ๋ผ action ํ์ผ์ ๋ฐ๊ฟ๋ฒ๋ ธ๋ค.
๐ GitHub Issue close ํ๊ธฐ
์ด์ , PR message์ closeํ Issue ๋ฒํธ๋ฅผ ์ ์ด์ฃผ๊ณ ,
ํด๋น PR์ Mergeํ ๋ ์๋์ Issue๊ฐ close๋๋ฉฐ
Jira์ ์ด์๋ ์๋ฃ ์ํ๋ก ๋ฐ๋ ์ ์๊ฒ ๋๋ค!!
'Collaboration Tools' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Collaboration Tools] Jira ์๊ฐ์ ๊ฐ๋จ ์ฌ์ฉ๋ฒ (0) | 2024.11.08 |
---|---|
[Collaboration Tools] Slack ์ฑ๋๊ณผ GitHub ์๊ฒฉ ์ ์ฅ์ ์ฐ๋ (0) | 2024.11.07 |