많은 사람들이 Jira를 통해 업무 및 일정관리를 하고 있고 내가 있는 곳 또한 Jira를 사용하고 있다. 작업 완료 후 Jira ticket을 일일이 직접 옮겼는데, 수동으로 옮기는 것은 까먹을 수도 있고 불편하다고 생각했다. 따라서 github action을 공부할 겸 해당 작업 branch가 merge 됐을 때 자동으로 ticket을 옮기는 작업을 해보았다. 백문이 불여일견, 코드를 직접 봐보자.
내가 하는 작업은 기존에 작성돼있던 yml 파일에 추가 코드를 붙이는 작업이다. 이 파일의 trigger는 main에 push가 됐을 때이다.
보안상 상세한 내용은 생략을 하고, ticket 이동 위주로 살펴볼 것이며, 이후에 나오는 코드 또한 실제 프로젝트에 작성한 코드와는 다르며 참고한 문서에 나오는 예시를 위주로 진행할 것이다.
on:
push:
branches:
- main
...
내가 추가한 작업은 해당파일의 jobs의 맨 마지막에 해당된다.
github action을 통해 작업하는 과정(steps)은 3가지로 이뤄진다.
그럼 문서를 참고하며 자세히 살펴보자
우선 첫 번째 Jira에 login 작업이다.
https://github.com/atlassian/gajira-login
위의 문서를 보면 Login을 하는 예시코드가 다음처럼 나온다.
on: push
name: Jira Example
jobs:
build:
runs-on: ubuntu-latest
name: Jira Example
steps:
- name: Login
uses: atlassian/gajira-login@master
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
환경 변수또한 다음과 같이 친절하게 설명이 나와있다.
JIRA_BASE_URL
- URL of Jira instance. Example: https://<yourdomain>.atlassian.net
JIRA_API_TOKEN
- Access Token for Authorization. Example: HXe8DGg1iJd2AopzyxkFB7F2
(How To)JIRA_USER_EMAIL
- email of the user for which Access Token was created for . Example: human@example.com
다만 이제 action을 확인했을 때 Logged in as: undefined
라고 나오는데 문제 없이 정상적으로 성공한 것이다.
다음은 이동하고자 하는 ticket을 찾는 작업이다.
https://github.com/atlassian/gajira-find-issue-key
위의 문서를 보면 issue-key라고 나와있는데 편의상 jira ticket으로 통일하여 진행할 것이다.
jira ticket를 찾는 방법은 with에 따라 나뉘게 된다.
branch
에서 찾거나 commits
에서 찾거나 혹은 string
을 사용하여 구체적으로 설정할 수 있다.예시는 다음과 같다.
- name: Find in commit messages
uses: atlassian/gajira-find-issue-key@master
with:
string: ${{ github.event.ref }}
처음에는 with
에 branch
를 사용하였다. 왜냐면 현재 작업 방식은 jira ticket 번호를 따라 branch(예시: TLIVE-111-작업명)를 새로 파서 작업하고 main에 merge되는 방식이었기 때문이다.
하지만 이 방식은 예상치 못한 문제가 있었는데 다음과 같은 문제가 있었다.
Searching in string:
refs/heads/main
String does not contain issueKeys
No issue keys found.
trigger가 main에 push됐을 때라서 결국 main에서 jira ticket(issue key)를 찾으려 한다는 점이다. 하지만 main엔 말그대로 main말곤 다른 문자열이 들어있지 않기 때문에 실패할 수 밖에 없었다.
따라서 with
을 commits
로 바꾸고 작업을 했다. 우리 팀은 해당 branch에서 커밋을 할 때마다 commit의 description에 ticket 번호를 남기는 컨벤션이 있기 때문에 문제가 없을거라고 생각했다.
다행히 문제 없이 commits
를 사용하여 성공적으로 ticket을 획득할 수 있었다.
위의 문서에 나와있듯이 이 작업을 통해 획득한 ticket은 outputs을 통해 접근할 수 있고 이것은 3번 작업에서 사용된다.
마지막으로 2번 작업의 output 통해 획득한 ticket을 사용하여 이동시키기만 하면 된다.
https://github.com/atlassian/gajira-transition
위의 문서를 보면 예시는 다음과 같다.
1. 단순히 이동
2. github action 작업을 통해 얻은 ouput을 활용(2번 작업 후)
따라서 우린 2번 예시를 살펴보면 된다.
on:
push
name: Test Transition Issue
jobs:
test-transition-issue:
name: Transition Issue
runs-on: ubuntu-latest
steps:
- name: Login
uses: atlassian/gajira-login@master
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
- name: Create new issue
id: create
uses: atlassian/gajira-create@master
- name: Transition issue
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.create.outputs.issue }}
transition: "In progress"
위의 코드는 ticket(issue)를 생성하는 코드로 돼있지만 2번에서 작업한 코드를 Create new issue
부분에 갈아끼우면 된다.
그리고 우리가 여기서 볼 부분은 Transition issue
이다. 사실 크게 어려운 내용은 없고 다만 여기서 추가적으로 작업할 부분은 if 구문을 사용하여서 ticket이 있을 때만 해당 step이 실행되도록 한다.
- name: Transition issue
if: steps.2번 작업의 id.outputs.issue != ''
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.2번 작업의 id.outputs.issue }}
transition: ticket을 위치시키고자 하는 이름 (예시: "QA필요")
Transition issue
에서 이전의 작업을 통해 얻은 ticket은 steps.step의 id.outputs.issue
로 접근하게 된다.
이렇게 함으로써 우리가 원하는 작업은 마무리가 된다.
jobs:
test-transition-issue:
name: Transition Issue
runs-on: ubuntu-latest
steps:
- name: Login
uses: atlassian/gajira-login@master
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
- name: Find in Jira ticket
uses: atlassian/gajira-find-issue-key@master
id: jira-ticket
with:
from: commits
- name: Transition issue
if: steps.jira-ticket.outputs.issue != ''
uses: atlassian/gajira-transition@master
with:
issue: ${{ steps.jira-ticket.outputs.issue }}
transition: "QA필요"
기존에는 ci/cd 관련해서 github action을 들어보기만 했었다. 하지만 회사에 인턴으로 일하면서 github action 작업 코드를 실제로 처음 보았고, 작업도 처음 해봤다.
해보면서 느낀 점은 github action docs를 일일이 다 읽기보단 내가 필요로 하는 작업을 위주로 찾아보는 것이 훨씬 효율적이라고 생각했다. 또한 내가 하고자 하는 작업이 예시로 대부분 나와있기 때문에 내 프로젝트에 맞게 변경을 잘하면 생각만큼 어렵진 않겠다 라는 느낌이 들었다.
하지만 작업 특성상 테스트 해보는 것이 힘들었다. nektos/act 같은 것을 사용하여 local에서 실행해볼 수 있다고 하는데, 그런 도구들을 잘 활용하는 공부도 필요하다는 생각이 들었다.
https://github.com/atlassian/gajira-login
https://github.com/atlassian/gajira-find-issue-key
https://github.com/atlassian/gajira-transition