petpisode에서는 조금 더 프로젝트를 원활하게 관리하고 직관적인 일정관리를 위해 선택하게 되었습니다. 여러 협업 프로젝트를 진행하면서 Notion
을 사용하여 일정관리 및 회의 내용 정리 등 다양한 것들을 기록하다보니 많은 하위 탭들이 존재하게 되고 내가 원하는 정보들을 찾기 위해 적지 않은 시간을 소요하게 되기도 합니다. 이를 계기로 회의 내용은 notion
정리하고 jira
f를 통해 보다 쉽고 직관적으로 일정을 관리할 수 있지 않을까라고 생각합니다.
Jira
와 Github actions
에 연동을 알아보기 전 간단하게 jira
에 대해 알아보고 넘어가도록 하겠습니다.
Jira는 Atlassian에서 개발한 이슈 및 프로젝트 관리 도구이며 애자일 방식으로 프로젝트를 관리하며 칸반,스크럼 등의 템플릿을 사용할 수 있습니다.
소프트웨어 개발 및 프로젝트 관리 방법론 중 하나로, 빠르게 변화하는 요구 사항에 유연하게 대응하고, 지속적인 개선을 통해 최종 제품의 품질을 높이는 데 중점을 둡니다.
애자일의 핵심 키워드 우선순위
입니다.
애자일한 조직문화는 ‘기민한’, ‘재빠른’, ‘민첩한’이라는 단어의 뜻에 맞게 부서 간 경계를 허물고, 팀원 개인에게 의사 권한을 부여하는 것을 말합니다.
Github Actions
를 연결하기 전 issue template
를 먼저 생성해줍니다.
name: 'Jira 연동 이슈 등록'
description: 'feature/design/setting/test 관련 이슈를 생성하며, 생성된 이슈는 Jira의 Task와 연동됩니다.'
labels: []
title: '[feature/design/setting/test] 이슈(Task) 제목'
body:
- type: markdown
attributes:
value: |
### 이슈 등록 확인사항
- 이슈 제목의 Prefix는 [feature], [design], [setting], [test] 중 하나를 선택하여 작성해주세요.
- 이슈의 Label은 Prefix에 맞게 자동으로 설정됩니다.
petpisode의 경우에는 issue
의 title
을 결정하는 코드입니다.
[]
안에 있는 Prefix
중 하나로 issue title
을 생성해야 합니다.
- type: input
id: parentKey
attributes:
label: '상위 에픽 Ticket Number'
description: '상위 에픽의 Ticket Number를 기입해주세요'
placeholder: 'PET-1'
validations:
required: true
task를 생성하기 위한 상위 에픽을 걸어줌으로써 상위 에픽 하위에 task를 생성할 수 있도록 설정해줍니다.
예를 들어 상위 에픽 ticket Number가 PET-1
에 로그인이라면 task 생성 시 PET-1
하위로 task가 생성할 수 있게 됩니다.
- type: input
id: branchName
attributes:
label: '자동으로 생성될 branch 이름'
description: 'ex) feature/login/PET-11 형식으로 생성됩니다.'
placeholder: 'login'
validations:
required: true
이슈 템플릿으로 이슈를 생성하고 이슈에 해당하는 ticket number
가 자동으로 생성됩니다.
이로 인해 해당 브런치가 생성되면서 기존 가지고 있던 개발 컨벤션에 위배되면서 개발자가 직접 브런치를 생성하여 넣을 수 있게하여 브런치 이름을 변경하지 않고 사용하도록 하기 위해 만들었습니다. 이에 대한 사항은 아래에서 더 자세히 설명드리겠습니다.
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 }}
env
의 경우 New repository secret
을 통해 생성하여 관리할 수 있습니다.
Api Token
의 경우 https://id.atlassian.com/manage-profile/security/api-tokens
User_Email
의 경우에는 API Token
을 만든 userId
입니다.
Base_url
은 Jira url
주소입니다.
- name: Determine Issue Type
id: determine-type
run: |
if [[ "${{ github.event.issue.title }}" =~ ^\[(feature|design|setting|test|fix)\] ]]; then
prefix=$(echo "${{ github.event.issue.title }}" | grep -o '^\[[^]]*\]' | tr -d '[]')
echo "prefix=$prefix" >> $GITHUB_ENV
if [[ "$prefix" == "fix" ]]; then
echo "type=Bug" >> $GITHUB_ENV
else
echo "type=Task" >> $GITHUB_ENV
fi
else
echo "Error: Issue title must start with [feature], [design], [setting], [test], or [fix]." >&2
exit 1
fi
issue
타이틀에 feature|design|setting|test|fix
에 값으로 시작하는지 확인하고 해당 하는 값이 있다면 $GITHUB_ENV
에 저장합니다.
- name: Checkout develop code
uses: actions/checkout@v4
with:
ref: develop
- name: Issue Parser
uses: stefanbuck/github-issue-praser@v3
id: issue-parser
with:
template-path: .github/ISSUE_TEMPLATE/1-task-sync-jira.yml
develop
을 기준으로 체크아웃을 진행하고 iusse_template
을 기준으로 파싱하는 기능을 제공합니다.
- name: Log Issue Parser and prefix
run: |
echo "Parsed branchName: ${{ steps.issue-parser.outputs.issueparser_branchName }}"
echo "Parsed prefix: ${{ env.prefix }}"
- 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
issue template
에서 잠깐 말씀드렸던 부분인데 해당 기능과 관련된 내용을 작성하고 이 코드에서 개발자가 작성한 기능에 대한 내용을 가져옵니다.
- name: Create Issue
id: create
uses: atlassian/gajira-create@v3
with:
project: projectkey
issuetype: '${{ env.type }}'
summary: '${{ github.event.issue.title }}'
description: '${{ steps.md2jira.outputs.output-text }}'
fields: |
{
"parent": {
"key": "${{ steps.issue-parser.outputs.issueparser_parentKey }}"
}
}
env.type
의 경우 issue template
에서 사용한 type을 판별하는데 저희 프로젝트의 경우 Bug
혹은 Task
인지를 판별합니다.
parent key
의 경우에는 해당 task
의 상위 에픽에 대한 ticket Number
을 가져옵니다.
- 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: develop
- name: Create branch with Ticket number
run: |
prefix="${{ env.prefix }}"
branch_name="${prefix}/${{ steps.issue-parser.outputs.issueparser_branchName }}/${{ steps.create.outputs.issue }}"
if ! [[ "$branch_name" =~ ^[a-zA-Z0-9/_-]+$ ]]; then
echo "Error: Invalid branch name $branch_name"
exit 1
fi
git checkout -b "$branch_name"
git push origin "$branch_name"
기존 개발 컨벤션에 맞는 브랜치 이름을 생성하기 위해 노력하던 중, GitHub에서 issue를 생성하면 ticket number를 포함해야 Jira가 정상적으로 작동한다는 점을 알게 되었습니다. 이에 따라, issue 타이틀에 작성된 feature, design 등의 키워드를 자동으로 추출하여 브랜치 이름의 앞부분에 추가하고, issue template에 작성된 기능 설명을 중간에 포함한 뒤, ticket number를 마지막에 추가하는 방식으로 브랜치 이름을 생성하도록 수정했습니다. 이를 통해 기존에 ticket number만으로 생성되던 브랜치 이름을 수정할 필요 없이 바로 사용할 수 있게 되었습니다.
Jira와 GitHub Actions를 활용하여 issue를 보다 편리하게 관리하고 자동화하는 설정을 시도해보았습니다. 특히 GitHub Actions를 통해 issue를 관리하는 과정이 처음에는 어렵게 느껴졌지만, 이를 프로젝트 상황에 맞게 브랜치 이름 생성 단계와 연동하여 설정하면서 많은 경험을 쌓을 수 있었습니다.
그동안 다양한 협업 사이드 프로젝트에서는 주로 노션을 활용해 간단한 타임라인으로 일정 관리와 공유를 진행했지만, 노션만으로 프로젝트를 체계적으로 관리하는 데에는 한계가 있다는 점을 느꼈습니다. 이러한 문제를 해결하기 위해 Jira를 도입했으며, 이를 통해 일정 관리와 프로젝트 관리를 할 수 있다고 기대하고 있습니다.