github action을 사용하여 자동으로 Jira Ticket 이동하기

Chaeil·2022년 5월 14일
0
post-thumbnail

많은 사람들이 Jira를 통해 업무 및 일정관리를 하고 있고 내가 있는 곳 또한 Jira를 사용하고 있다. 작업 완료 후 Jira ticket을 일일이 직접 옮겼는데, 수동으로 옮기는 것은 까먹을 수도 있고 불편하다고 생각했다. 따라서 github action을 공부할 겸 해당 작업 branch가 merge 됐을 때 자동으로 ticket을 옮기는 작업을 해보았다. 백문이 불여일견, 코드를 직접 봐보자.

yml 파일 작성

내가 하는 작업은 기존에 작성돼있던 yml 파일에 추가 코드를 붙이는 작업이다. 이 파일의 trigger는 main에 push가 됐을 때이다.
보안상 상세한 내용은 생략을 하고, ticket 이동 위주로 살펴볼 것이며, 이후에 나오는 코드 또한 실제 프로젝트에 작성한 코드와는 다르며 참고한 문서에 나오는 예시를 위주로 진행할 것이다.

on:
	push:
		branches:
			- main

...

작업 순서(steps)

내가 추가한 작업은 해당파일의 jobs의 맨 마지막에 해당된다.

github action을 통해 작업하는 과정(steps)은 3가지로 이뤄진다.

  1. Jira에 login
  2. Jira ticket 획득하기
  3. Jira ticket 이동시키기

그럼 문서를 참고하며 자세히 살펴보자

1. Jira에 login

우선 첫 번째 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 }}

위의 예시 코드를 참조하되 사용하는 프로젝트에 맞게 jobs의 name, steps의 name 등을 변경하면 된다(앞으로도 마찬가지). 사실 위의 내용은 까다로울게 없고 secrets에 환경 변수를 잘 등록만 하면 되는 부분이었다.

환경 변수또한 다음과 같이 친절하게 설명이 나와있다.

  • 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 라고 나오는데 문제 없이 정상적으로 성공한 것이다.

2. Jira ticket 획득하기

다음은 이동하고자 하는 ticket을 찾는 작업이다.

https://github.com/atlassian/gajira-find-issue-key

위의 문서를 보면 issue-key라고 나와있는데 편의상 jira ticket으로 통일하여 진행할 것이다.

jira ticket를 찾는 방법은 with에 따라 나뉘게 된다.

  1. branch에서 찾거나
  2. commits 에서 찾거나 혹은
  3. string 을 사용하여 구체적으로 설정할 수 있다.

예시는 다음과 같다.

- name: Find in commit messages
  uses: atlassian/gajira-find-issue-key@master
  with:
    string: ${{ github.event.ref }}

처음에는 withbranch 를 사용하였다. 왜냐면 현재 작업 방식은 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말곤 다른 문자열이 들어있지 않기 때문에 실패할 수 밖에 없었다.


따라서 withcommits 로 바꾸고 작업을 했다. 우리 팀은 해당 branch에서 커밋을 할 때마다 commit의 description에 ticket 번호를 남기는 컨벤션이 있기 때문에 문제가 없을거라고 생각했다.

다행히 문제 없이 commits 를 사용하여 성공적으로 ticket을 획득할 수 있었다.

위의 문서에 나와있듯이 이 작업을 통해 획득한 ticket은 outputs을 통해 접근할 수 있고 이것은 3번 작업에서 사용된다.

3. Jira ticket 이동시키기

마지막으로 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에서 실행해볼 수 있다고 하는데, 그런 도구들을 잘 활용하는 공부도 필요하다는 생각이 들었다.

Reference

https://github.com/atlassian/gajira-login
https://github.com/atlassian/gajira-find-issue-key
https://github.com/atlassian/gajira-transition

profile
서글픈 너의 눈길은 나의 가슴을 아리게 한다

0개의 댓글