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

하지만, 매번, Pull request
를 만들고 Release note
를 작성하거나, 배포전에 Git
의 히스토리를 보면서 Release note
를 작성할 수 없습니다.
이번 블로그 포스트에서는 GitHub Actions
의 Release Drafter
를 사용하여 Pull request
의 제목으로 Release note
를 자동으로 작성하는 방법에 대해서 알아보도록 하겠습니다.
블로그 시리즈
이 블로그는 시리즈로 제작되었습니다. 다음 링크를 통해 다른 블로그 포스트도 확인해 보시기 바랍니다.
- [GitHub Actions] Pull request 제목 검사
- Release Drafter를 사용하여 GitHub의 release 자동화 하기
- [GitHub Actions] Pull request 라벨 검사하기
- [GitHub Actions] Changelog 파일 자동 업데이트하기
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 note
의 Draft
를 작성하게 됩니다.
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
의 버전이 결정됩니다.
이 블로그 포스트에서는 이 버전이 아닌, Git
의 Tag
를 사용하여 최종 버전을 결정할 예정입니다.
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
의 내용을 다음과 같이 분류할 수 있습니다.

이 카테고리도 Pull request
의 라벨에 의해 결정됩니다. labels
옵션 하위에 설정된 라벨들이 title
카테고리 하위에 작성이 됩니다. 또한, collapse-after
옵션을 사용하여 작성 내용이 많은 경우, 접어서 표시할 수 있습니다.
autolabeler
categories
를 사용하여 Release note
에 작성된 내용을 분류할 수 있지만, 이는 Pull request
의 라벨에 의해 결정됩니다. 따라서, 실수로 라벨을 작성하지 않는다면, 해당 내용은 Release note
에 표시되지 않습니다.
이를 방지하기 위해서 Release Drafter
는 autolabeler
를 제공합니다.
...
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
브랜치를 사용하시는 분들은 commitish
에 main
을 설정하여 기본 브랜치가 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 note
는 draft
로 아직 배포되지 않은 상태입니다. 이렇게 작성된 Release note
를 Release 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 Drafter
의 autolabeler
가 Pull request
의 제목에 의해 자동으로 라벨을 붙이도록 하였습니다. 따라서 Pull request
를 만들 때, 자동으로 라벨을 붙이기 위해서 Pull request
의 제목을 검사할 필요가 있습니다.
이럴 때 사용할 수 있는 GitHub Actions
가 Conventional PR Title Action
입니다.
Conventional PR Title Action
를 설정하는 자세한 방법은 아래 링크를 참고하시기 바랍니다.
완료
이것으로 GitHub Actions
의 Release Drafter
을 사용하여 Pull request
의 제목으로 Release note
를 자동으로 작성하는 방법에 대해서 알아보았습니다. 오픈 소스를 운영하거나 Release note
를 잘 관리하고자 한다면 Release Drafter
의 도입을 추천해 드립니다.
만약, CHANGELOG.md
파일을 관리하는 프로젝트라면 GitHub Actions
를 사용하여 Release note
내용을 자동으로 CHANGELOG.md
파일에 기록할 수 있습니다. CHANGELOG.md
파일을 자동으로 업데이트하는 방법에 대해서는 다음 링크를 참고하시기 바랍니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku
가 개발한 앱을 한번 사용해보세요.Deku
가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.