[GitHub Actions] Release Drafter를 사용하여 GitHub의 Release note 자동화 하기

[GitHub Actions] Release Drafter를 사용하여 GitHub의 Release note 자동화 하기

2023-08-31 hit count image

GitHub Actions의 Release Drafter을 사용하여 Pull request의 제목으로 Release note를 자동으로 작성하는 방법에 대해서 알아보도록 하겠습니다.

개요

GitHub에서 오픈 소스를 관리하거나, 버전을 관리할 때, Release note를 작성하게 됩니다.

GitHub Actions release-drafter: GitHub release note

하지만, 매번, Pull request를 만들고 Release note를 작성하거나, 배포전에 Git의 히스토리를 보면서 Release note를 작성할 수 없습니다.

이번 블로그 포스트에서는 GitHub ActionsRelease Drafter를 사용하여 Pull request의 제목으로 Release note를 자동으로 작성하는 방법에 대해서 알아보도록 하겠습니다.

블로그 시리즈

이 블로그는 시리즈로 제작되었습니다. 다음 링크를 통해 다른 블로그 포스트도 확인해 보시기 바랍니다.

Release Drafter 설정 파일

Release Drafter를 사용하여 Release note를 자동으로 작성하기 위해서는, Release Drafter 설정 파일이 main(master) 브랜치에 존재해야 합니다.

Release Drafter의 설정 파일을 만들기 위해 .github/release-drafter.yml 파일을 생성하고 다음과 같이 수정합니다.

name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
version-resolver:
  major:
    labels:
      - 'major'
  minor:
    labels:
      - 'minor'
  patch:
    labels:
      - 'patch'
  default: patch
categories:
  - title: '⚠️ Breaking changes'
    labels:
      - 'breaking change'
  - title: '🚀 Features'
    labels:
      - 'feature'
  - title: '🐛 Bug Fixes'
    labels:
      - 'bug'
  - title: '📃 Documents'
    labels:
      - 'docs'
  - title: '🧩 Dependency Updates'
    labels:
      - 'deps'
      - 'dependencies'
      - 'bump'
      - 'chore'
    collapse-after: 5
  - title: '🔬 Others'
    labels:
      - 'style'
      - 'refactor'
      - 'test'
      - 'ci'
    collapse-after: 5
autolabeler:
  - label: 'breaking change'
    title:
      - '/!:/i'
  - label: 'feature'
    title:
      - '/feat:/i'
  - label: 'bug'
    title:
      - '/fix:/i'
  - label: 'style'
    title:
      - '/style:/i'
  - label: 'refactor'
    title:
      - '/refactor:/i'
  - label: 'test'
    title:
      - '/test:/i'
  - label: 'chore'
    title:
      - '/chore:/i'
  - label: 'docs'
    title:
      - '/docs:/i'
  - label: 'ci'
    title:
      - '/ci:/i'
  - label: 'dependencies'
    title:
      - '/deps:/i'
      - '/dependencies:/i'
      - '/bump:/i'
commitish: main
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&'
template: |
  $CHANGES

Release Drafter 설정 파일을 좀 더 자세히 살펴보도록 하겠습니다.

버전

Release Drafter는 기본적으로 Pull request의 라벨을 사용하여 동작하게 됩니다. Release Drafter는 이전에 배포된 Release note의 버전을 보고 Release noteDraft를 작성하게 됩니다.

name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
version-resolver:
  major:
    labels:
      - 'major'
  minor:
    labels:
      - 'minor'
  patch:
    labels:
      - 'patch'
  default: patch
...

이때, 이전 버전보다 높은 버전의 Draft를 작성하게 되는데, 이전보다 높은 버전의 Draft를 작성하기 위해서 version-resolver을 사용하게 됩니다.

Pull request의 라벨에 patch, minor, major를 설정하면, Release Drafter가 이를 인식하고 Draft의 버전을 올리게 됩니다. 만약, Pull request의 라벨이 설정되지 않은 경우 default값이 설정되게 됩니다. 이번 예제에서는 patch를 기본값으로 설정되었으므로, 라벨이 설정이 되지 않으면, patch의 버전을 올리게 됩니다.

Pull request마다 계속 버전이 올라가는게 아니라, 마지막에 병합(Merge)된 Pull request의 라벨에 따라 Release note의 버전이 결정됩니다.

이 블로그 포스트에서는 이 버전이 아닌, GitTag를 사용하여 최종 버전을 결정할 예정입니다.

categories

categories 옵션을 사용하면, Release note에 작성될 내용을 분류하여 작성할 수 있습니다.

...
categories:
  - title: '⚠️ Breaking changes'
    labels:
      - 'breaking change'
  - title: '🚀 Features'
    labels:
      - 'feature'
  - title: '🐛 Bug Fixes'
    labels:
      - 'bug'
  - title: '📃 Documents'
    labels:
      - 'docs'
  - title: '🧩 Dependency Updates'
    labels:
      - 'deps'
      - 'dependencies'
      - 'bump'
      - 'chore'
    collapse-after: 5
  - title: '🔬 Others'
    labels:
      - 'style'
      - 'refactor'
      - 'test'
      - 'ci'
    collapse-after: 5
...

categories 옵션을 사용하면, Release note의 내용을 다음과 같이 분류할 수 있습니다.

GitHub Actions release-drafter: categories

이 카테고리도 Pull request의 라벨에 의해 결정됩니다. labels 옵션 하위에 설정된 라벨들이 title 카테고리 하위에 작성이 됩니다. 또한, collapse-after 옵션을 사용하여 작성 내용이 많은 경우, 접어서 표시할 수 있습니다.

autolabeler

categories를 사용하여 Release note에 작성된 내용을 분류할 수 있지만, 이는 Pull request의 라벨에 의해 결정됩니다. 따라서, 실수로 라벨을 작성하지 않는다면, 해당 내용은 Release note에 표시되지 않습니다.

이를 방지하기 위해서 Release Drafterautolabeler를 제공합니다.

...
autolabeler:
  - label: 'breaking change'
    title:
      - '/!:/i'
  - label: 'feature'
    title:
      - '/feat:/i'
  - label: 'bug'
    title:
      - '/fix:/i'
  - label: 'style'
    title:
      - '/style:/i'
  - label: 'refactor'
    title:
      - '/refactor:/i'
  - label: 'test'
    title:
      - '/test:/i'
  - label: 'chore'
    title:
      - '/chore:/i'
  - label: 'docs'
    title:
      - '/docs:/i'
  - label: 'ci'
    title:
      - '/ci:/i'
  - label: 'dependencies'
    title:
      - '/deps:/i'
      - '/dependencies:/i'
      - '/bump:/i'
...

autolabeler를 사용하여 Pull request의 제목, 본문, 파일, 브랜치로 Pull request의 라벨을 자동으로 설정할 수 있습니다.

commitish

Release Drafter는 기본적으로 refs/heads/master을 기준으로 동작합니다. 따라서 저처럼 main 브랜치를 사용하시는 분들은 commitishmain을 설정하여 기본 브랜치가 master가 아닌 main임을 Release Drafter에 알려줘야 합니다.

...
commitish: main
...

작성 내용

Release note의 작성 내용을 결정하는 옵션들입니다. change-template의 형태로 변경 사항이 작성되며, template 옵션으로 변경 내용 이외의 내용들을 추가로 표시할 수 있습니다.

...
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&'
template: |
  $CHANGES

또한, change-title-escapes 옵션을 사용하여 Pull request의 제목에서 제외하고자 하는 문자들을 추가할 수 있습니다.

GitHub Actions

이제 Release Drafter를 사용하기 위한 준비가 완료되었습니다. 이제 Release Drafter를 실행할 GitHub Actions을 작성해 봅시다.

.github/workflows/release-drafter.yml 파일을 생성하고 다음과 같이 수정합니다.


name: Release Drafter

on:
  push:
    branches:
      - main
  pull_request:
    types:
      - opened
      - reopened
      - edited
      - synchronize

permissions:
  contents: read

jobs:
  update_release_draft:
    permissions:
      contents: write
      pull-requests: write
      checks: write
    runs-on: ubuntu-latest
    steps:
      - uses: release-drafter/release-drafter@v5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

이렇게 GitHub Actions를 추가하면, Pull request가 생성될 때, Pull request의 제목에 따라 라벨이 자동으로 생성되는 것을 확인할 수 있으며, 병합(Merge)이 되면 자동으로 Release note가 업데이트 되는 것을 확인할 수 있습니다.

Git tag를 사용하여 Release note 배포하기

Release Drafter를 사용하면 작성한 Release notedraft로 아직 배포되지 않은 상태입니다. 이렇게 작성된 Release noteRelease Drafter를 사용하여 배포할 수 있습니다.

draft 상태인 Release note를 배포하기 위해 .github/workflows/release.yml 파일을 만들고 다음과 같이 수정합니다.


name: Release

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  release:
    permissions:
      contents: write
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - name: Get semantic version
        id: semver
        run: echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"
      - uses: release-drafter/release-drafter@v5
        with:
          tag: ${{ steps.semver.outputs.version }}
          name: ${{ steps.semver.outputs.version }}
          version: ${{ steps.semver.outputs.version }}
          publish: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

다음과 같이 Git tag를 작성하면 이 GitHub Actions를 사용할 수 있습니다.

# git checkout main
git tag v1.0.0
git push origin v1.0.0

Conventional PR Title Action

이번 블로그 포스트에서는 Release DrafterautolabelerPull request의 제목에 의해 자동으로 라벨을 붙이도록 하였습니다. 따라서 Pull request를 만들 때, 자동으로 라벨을 붙이기 위해서 Pull request의 제목을 검사할 필요가 있습니다.

이럴 때 사용할 수 있는 GitHub ActionsConventional PR Title Action입니다.

Conventional PR Title Action를 설정하는 자세한 방법은 아래 링크를 참고하시기 바랍니다.

완료

이것으로 GitHub ActionsRelease Drafter을 사용하여 Pull request의 제목으로 Release note를 자동으로 작성하는 방법에 대해서 알아보았습니다. 오픈 소스를 운영하거나 Release note를 잘 관리하고자 한다면 Release Drafter의 도입을 추천해 드립니다.

만약, CHANGELOG.md 파일을 관리하는 프로젝트라면 GitHub Actions를 사용하여 Release note 내용을 자동으로 CHANGELOG.md 파일에 기록할 수 있습니다. CHANGELOG.md 파일을 자동으로 업데이트하는 방법에 대해서는 다음 링크를 참고하시기 바랍니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

스무디 한 잔 마시며 끝내는 React Native 책을 출판한지 벌써 2년이 다되었네요.
이번에도 좋은 기회가 있어서 스무디 한 잔 마시며 끝내는 리액트 + TDD 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts