[petpisode] 왜 우리는 jira를 사용하게 되었는가?

rondido·2025년 1월 2일
0

projects

목록 보기
4/11

petpisode에서는 조금 더 프로젝트를 원활하게 관리하고 직관적인 일정관리를 위해 선택하게 되었습니다. 여러 협업 프로젝트를 진행하면서 Notion을 사용하여 일정관리 및 회의 내용 정리 등 다양한 것들을 기록하다보니 많은 하위 탭들이 존재하게 되고 내가 원하는 정보들을 찾기 위해 적지 않은 시간을 소요하게 되기도 합니다. 이를 계기로 회의 내용은 notion 정리하고 jiraf를 통해 보다 쉽고 직관적으로 일정을 관리할 수 있지 않을까라고 생각합니다.

github + jira issue 연동하여 자동화 만들기

Jira란?

JiraGithub actions에 연동을 알아보기 전 간단하게 jira에 대해 알아보고 넘어가도록 하겠습니다.

Jira는 Atlassian에서 개발한 이슈 및 프로젝트 관리 도구이며 애자일 방식으로 프로젝트를 관리하며 칸반,스크럼 등의 템플릿을 사용할 수 있습니다.

  1. 이슈 관리
  • 버그, 작업, 사용자 스토리 등의 이슈를 생성, 관리, 추적할 수 있습니다.
  • 각 이슈는 상태(예: To Do, In Progress, Done)와 우선순위로 관리됩니다.
  1. 프로젝트 관리
  • Agile 보드: Scrum 또는 Kanban 보드를 사용하여 팀의 작업 흐름을 시각화할 수 있습니다.
  • 백로그 관리: 계획 중인 작업 항목들을 백로그에서 정리하고 Sprint로 옮길 수 있습니다.
  1. 보고서와 대시보드
  • Burndown 차트, Velocity 차트 등 다양한 애자일 보고서를 제공하여 팀의 성과를 분석할 수 있습니다.
  • 사용자 정의 가능한 대시보드로 프로젝트 상태를 한눈에 파악할 수 있습니다.

❓ 애자일

소프트웨어 개발 및 프로젝트 관리 방법론 중 하나로, 빠르게 변화하는 요구 사항에 유연하게 대응하고, 지속적인 개선을 통해 최종 제품의 품질을 높이는 데 중점을 둡니다.

애자일의 핵심 키워드 우선순위입니다.

애자일한 조직문화는 ‘기민한’, ‘재빠른’, ‘민첩한’이라는 단어의 뜻에 맞게 부서 간 경계를 허물고, 팀원 개인에게 의사 권한을 부여하는 것을 말합니다.

Jira와 Github Actions 연동

Jira issue template 생성

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의 경우에는 issuetitle을 결정하는 코드입니다.
[]안에 있는 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가 자동으로 생성됩니다.
이로 인해 해당 브런치가 생성되면서 기존 가지고 있던 개발 컨벤션에 위배되면서 개발자가 직접 브런치를 생성하여 넣을 수 있게하여 브런치 이름을 변경하지 않고 사용하도록 하기 위해 만들었습니다. 이에 대한 사항은 아래에서 더 자세히 설명드리겠습니다.

Jira create template 생성

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_urlJira 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를 도입했으며, 이를 통해 일정 관리와 프로젝트 관리를 할 수 있다고 기대하고 있습니다.

profile
풋살을 좋아하는 프론트엔드 개발자

0개의 댓글