# GitHub Action - Release-Drafter

release-drafter

내가 지금 사용하고 있는 배포 방식은 Tag가 따지면 자동으로 Docker build 및 배포가 되는 깃헙 액션을 만들어 사용하고 있다. 이 때, Tag와 함께 Release도 함께 만들어 사용하고 있다.

깃헙 릴리즈를 사용하면, Repo에 들어왔을 때 가장 최근 배포된 릴리즈 버전 및 내용을 한번에 확인 할 수 있다. 또, compare 기능도 있어 웹 에서 바로 기존 릴리즈와 무엇이 바뀌었는지 확인이 편하다.

다만!!! 여기서 릴리즈 노트를 작성하는 것이 매우 귀찮다. 변경 Changes를 내가 일일이 찾는 것도 귀찮고.

릴리즈 노트를 자동으로 생성해주는 Release-Drafter를 사용해보자. 짧게 설명하자면,

  • 브랜치 혹은 title 규칙에 따라 PR내 자동 label 추가
  • label 규칙에 따라 릴리즈 노트 draft로 작성 및 업데이트

바로 이렇게!

# Release Drafter (opens new window)

# 설정 방법

.github/workflows/release-drafter.yml 파일을 다음과 같이 설정한다.

name: Release Drafter

on:
  push:
    # 어느 브랜치에 push가 되었을 때 작동할지 설정
    branches:
      - main
  # autolabeler 를 실행시킬 pull_request 이벤트를 설정
  pull_request:
    types: [opened, reopened, synchronize]

permissions:
  contents: read

jobs:
  update_release_draft:
    permissions:
      # write permission is required to create a github release
      contents: write
      # write permission is required for autolabeler
      # otherwise, read permission is required at least
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: release-drafter/release-drafter@v5
        # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml
        # with:
        #   config-name: my-config.yml
        #   disable-autolabeler: true
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}

위 파일에서 보면 GITHUB_TOKEN 설정이 필요하다. 이는 release draft를 생성하기 위한 깃헙 토큰으로, 리파지토리 > settings > security > secrets > actions 에 깃헙 토큰을 등록해주어야 한다.

깃헙 토큰 만드는 방법은 공식 문서 (opens new window)에서 참고 할 수 있다. expire와 scope는 아래와 같이 설정하면 된다.

  • expire : no expiration
  • scope : repo

다음은 실제 위 action이 run 할때 필요한 설정 파일을 만들어준다. 기본 path는 .github/release-drafter.yml 그대로 따르면 된다.

name-template: 'v$RESOLVED_VERSION 🌈' ## 릴리즈 제목 
tag-template: 'v$RESOLVED_VERSION' ## 태그 
categories:
  - title: '🚀 Features'
    labels:
      - 'feature'
      - 'enhancement'
  - title: '🐛 Bug Fixes'
    labels:
      - 'fix'
      - 'bugfix'
      - 'bug'
  - title: '🧰 Maintenance'
    label: 'chore'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
version-resolver:
  major:
    labels:
      - 'major'
  minor:
    labels:
      - 'minor'
  patch:
    labels:
      - 'patch'
  default: patch
template: | # 릴리즈 내용 
  ## Changes (v$RESOLVED_VERSION)

  $CHANGES
autolabeler: # PR에 자동으로 label 붙혀주는 규칙 
  - label: 'chore'
    files:
      - '*.md'
    branch:
      - '/docs{0,1}\/.+/'
    title:
      - '/chore/i'
  - label: 'bug'
    branch:
      - '/fix\/.+/'
    title:
      - '/fix/i'
      - '/hotfix/i'
      - '/bug/i'
  - label: 'feature'
    title:
      - '/feat/i'
    branch:
      - '/feature\/.+/'
      - '/feat\/.+/'

여기까지 하고 나면 설정은 끝. 이제 규칙에 따라 작업하면 릴리즈 노트가 자동으로 생성된다.

# 사용 방법

정해진 branch 명이나 PR 제목을 이용하게 되면 자동으로 label이 붙는다. (위 .github/release-drafter.yml 내 autolabeler 설정 참고)

PR이 main 브랜치로 머지되면 다음과 같이 릴리즈 노트가 생성된다.

릴리즈가 배포되고 나면 그 다음 release draft에서는 그 다음 버전으로 tag가 생성된다.

만약, major 버전을 올리고 싶다면 다음과 같이 PR에 major tag를 붙여주면 된다.

이 역시도 .github/release-drafter.yml 내 설정된 값으로 조정이 된다.

더 자세한 설정은 Release Drafter (opens new window)를 참고하면 된다.

# 예제 깃헙