github+jira 연동

Noah-wilson·2025년 4월 6일

협업

목록 보기
2/4

github jira 연동하기

  1. 지라 로그인 - 앱 - 더 많은 앱 살펴보기

2.검색창에 github for jira 검색 후 클릭

  1. getapp을 하여 Atlassian과 github 연동하기

  1. add another organization - Select an organization in Git-Hub을 클릭 후 open할 repo를 선택한다.
  2. jira github 연동 결과

Jira 이슈와 GitHub 브랜치 연동

https://roll-over-program.tistory.com/78
위 블로그 참고하여 branch연동

이슈키를 포함하여 branch를 생성하고 git commit message에 이슈키를 포함하여 commit을 해야 jira에서
이슈 추적이 자동으로 된다
그러므로 git commit message template을 수정해야할듯

github action로 jira issue 자동화하기

참고 블로그: https://velog.io/@sangpok/Github-%ED%98%91%EC%97%85-%EC%84%A4%EC%A0%95Github-Issue-Jira-%EC%97%B0%EB%8F%99

1. github repository secret 등록하기

  1. secrets를 등록하고 싶은 github repo에 접속한 뒤에, "Settings>Security>Secrets and variables >Actions" 탭에 접근해 나오는 페이지에서 하단 "New repository secret"을 누른다.

Name에는 변수명을, Secret에는 값을 입력하고 "add secret"을 누른다.

GitHub에 저장된 Secrets 값은 워크플로우 파일 안에서 ${{ secrets.VARIABLE_NAME }} 형태로 불러올 수 있다.
예를 들어, Jira 로그인을 위해 아래와 같이 환경 변수를 설정하면 된다:

env:
  JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
  JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
  JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}

2. .github/ISSUE_TEMPLATE 작성

name: '이슈 생성'
description: 'Repo에 이슈를 생성하며, 생성된 이슈는 Jira와 연동됩니다.'
labels: [feat]
title: '이슈 이름을 작성해주세요'
body:
  - type: input
    id: parentKey
    attributes:
      label: '🎟️ 상위 작업 (Ticket Number)'
      description: '상위 작업의 Ticket Number를 기입해주세요'
      placeholder: 'INOUT-00'
    validations:
      required: true

  - type: input
    id: branch
    attributes:
      label: '🌳 브랜치명 (Branch)'
      description: '영어로 브랜치명을 작성해주세요'
    validations:
      required: true
      
  - type: input
    id: description
    attributes:
      label: '📝 상세 내용(Description)'
      description: '이슈에 대해서 간략히 설명해주세요'
    validations:
      required: true

  - type: textarea
    id: tasks
    attributes:
      label: '✅ 체크리스트(Tasks)'
      description: '해당 이슈에 대해 필요한 작업목록을 작성해주세요'
      value: |
        - [ ] Task1
        - [ ] Task2
    validations:
      required: true

3. .github/workflows/create-jira-issye.yml 작성

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.issueparser_parentKey }}'
          echo '${{ steps.issue-parser.outputs.__ticket_number }}'
          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: SKP
          issuetype: Task
          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: develop

      - name: Create branch with Ticket number
        run: |
          ISSUE_NUMBER="${{ steps.create.outputs.issue }}"
          ISSUE_TITLE="${{ steps.issue-parser.outputs.issueparser_branch}}"
          BRANCH_NAME="${ISSUE_NUMBER}-$(echo ${ISSUE_TITLE} | sed 's/ /-/g')"
          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: Add comment with Jira issue link
        uses: actions-cool/issues-helper@v3
        with:
          actions: 'create-comment'
          token: ${{ secrets.GITHUB_TOKEN }}
          issue-number: ${{ github.event.issue.number }}
          body: 'Jira Issue Created: [${{ steps.create.outputs.issue }}](${{ secrets.JIRA_BASE_URL }}/browse/${{ steps.create.outputs.issue }})'
      

issue가 close될떄도 처리하기 위한 close-jira-issue.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: Close Jira issue
        if: env.JIRA_KEY != ''
        uses: atlassian/gajira-transition@v3
        with:
          issue: ${{ env.JIRA_KEY }}
          transition: Done

4. Github Action 권한 설정

settings - Actions -General탭에 접근하여
Read and Write Permission 체크하기

5. github Actions 테스트

먼저 GitHub의 Issues 탭에 들어가서 새로운 이슈를 작성해준다.

이슈를 생성하면, 자동으로 실행되는 GitHub Actions를 Actions 탭에서 확인할 수 있다.

정상적으로 작동했다면, 아래와 같이 Jira에 자동으로 이슈가 생성된 것도 확인할 수 있다.

원래는 생성된 Jira 이슈 상태에 따라 작업 브랜치를 자동으로 상위 브랜치에 병합되도록 GitHub Actions로 자동화를 시도했었다.
예를 들어, Sub-task는 Task 브랜치로, Task는 Epic 브랜치로, 그리고 최종적으로 Epic은 master 브랜치로 병합되도록 하는 구조였는데,
아직 Git 사용에 익숙하지 않다 보니 현재는 브랜치 병합은 수동으로 진행하고 있다.
추후 Git 사용에 익숙해지면 이 부분도 다시 자동화할 예정!

Sub-task 생성 삽질기

위 글의 .github/workflows/create-jira-issye.yml를 보면 완성된 코드가 이미 들어가 있지만
task(모든 기타 표준 이슈 유형) 유형 이슈에서 Sub-task(모든 하위 작업 이슈 유형) 유형 이슈를 연동해주는 과정에서 발생한 에러에 대한 내용이다.

우선 jira의 이슈 계층 구조는 다음과 같다.

  1. Epic
    가장 상위 계층 (hierarchyLevel: -1)
    하위로는 표준 이슈 유형들만 가능 (예: Task, Story, Bug 등)
    ❌ Sub-task는 직접적으로 Epic 밑에 둘 수 없음

  2. Standard Issue Types (모든 기타 표준 이슈 유형)(hierarchyLevel: 0)
    예: Task, Story, Bug 등
    상위: Epic 가능 ✅
    하위: Sub-task 가능 ✅

  3. Sub-task(모든 하위 작업 이슈 유형) (hierarchyLevel: -1)
    반드시 표준 이슈 유형(Task, Story 등)의 하위로만 생성 가능
    ❌ Epic의 직접 하위가 될 수 없음

위 구조는 기본적으로 jira free tier에서 고정된 계층 구조이다. 그러므로 당연히 Sub-task가 Task와 연동 될 줄 알았다. issue를 만들어보면 다음과 같은 에러가 생긴다.

관리자 설정과 프로젝트 설정 모두 'Sub-task'를 설정해주어도 오류가 해결되지 않았지만 프로젝트 설정> 하위작업을 'Sub-task'로 통일하니깐 해결되었다(모든 name을 통일해 줘야 하는듯 왠래 '하위 작업'으로 표시되어 있었는데 같은 의미인줄 알고 내버려 둿었다.)

변경 후 실행 결과:

참고

1.설정되지 않은 issueType을 설정하면 이렇게 오류가 생긴다.

2. 존재하지 않는 branch를설정하면 생기는 오류

      - name: Checkout jiratest code
        uses: actions/checkout@v4
        with:
          ref: 존재하지 않는 branch

      - name: Checkout jiratest code
        uses: actions/checkout@v4
        with:
          ref: main

존재하는 branch로 수정하면 해결된다.

0개의 댓글