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

하지만, 매번, Pull request
를 만들고 Release note
를 작성하거나, 배포전에 Git
의 히스토리를 보면서 Release note
를 작성할 수 없습니다.
이전 블로그 포스트에서는 Release Drafter를 사용하여 Pull request
의 제목에 따라 Release note
를 자동으로 작성하는 방법에 대해서 알아보았습니다.
이번 블로그 포스트에서는 GitHub Actions
에서 Release note API
를 사용하여 보다 간단한 Release note
를 자동으로 작성하는 방법에 대해서 알아보도록 하겠습니다.
- GitHub 공식 문서: Releases
GitHub personal access token
이번 블로그 포스트에서 소개할 방법은 GitHub
의 Personal access token
을 필요로 합니다. Personal access token
을 생성하기 위해 다음과 같이 GitHub
의 설정으로 이동한 후, Developer settings
를 선택합니다.

그런 다음 Personal access token
을 생성하기 위해 Personal access token (classic)
을 선택합니다.

그런 다음 repo
권한(permission)을 선택하여 Personal access token
을 생성합니다.

이렇게 생성한 Personal access token
을 Release note
의 자동화를 하고 싶은 저장소의 Settings > Secrets and variables > Repository secret
에 API_KEY
라는 이름으로 저장합니다.

GitHub Actions
이제 GitHub
의 API
를 사용하여 Release note
를 자동화해 봅시다. Release note
자동화를 위해 .github/workflows/release_note.yml
파일을 생성하고 다음과 같이 수정합니다.
name: Create release tag and release note
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
jobs:
create-release-note:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Get previous tag
id: pre_tag
run: |
echo "version=$(curl -L -H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.API_KEY }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/releases/latest \
| jq .tag_name \
| sed 's/"//g')" >> $GITHUB_OUTPUT
- name: Generate release tag
id: release_tag
run: echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
- name: Generate release note
id: release_note
run: |
echo "note=$(curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.API_KEY }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
-d '{"tag_name":"${{ steps.release_tag.outputs.version }}","target_commitish":"main","previous_tag_name":"${{ steps.pre_tag.outputs.version }}"}' \
| jq .body \
| sed 's/"//g')" >> $GITHUB_OUTPUT
- name: Create Release
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.API_KEY }}" \
-d "{ \"tag_name\": \"${{ steps.release_tag.outputs.version }}\", \"name\": \"${{ steps.release_tag.outputs.version }}\", \"body\": \"${{ steps.release_note.outputs.note }}\"}" \
https://api.github.com/repos/${{ github.repository }}/releases
코드를 좀 더 자세히 살펴봅시다.
...
on:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
...
이 GitHub Actions
는 GitHub
에 Semantic Versioning 형식의 tag
가 추가되면 실행됩니다.
...
- name: Get previous tag
id: pre_tag
run: |
echo "version=$(curl -L -H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.API_KEY }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/releases/latest \
| jq .tag_name \
| sed 's/"//g')" >> $GITHUB_OUTPUT
...
다음으로, 자동으로 Release note
를 생성하기 위해 /releases/latest API를 사용하여 이전 tag
를 가져옵니다.
이 API
는 직전의 Release note
에 사용된 tag
를 가져오므로, 이 GitHub Actions
를 사용하기 위해서는 최소한 한 개 이상의 Release note
가 존재해야 합니다. 만약, Release note
가 작성되지 않았고 여러 tag
가 있는 경우 최신 tag
를 사용한 Releate note
를 작성해 두는 것이 좋습니다.
...
- name: Generate release tag
id: release_tag
run: echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
...
그런 다음 현재 tag
를 Release note
에서 사용할 수 있도록 변수에 할당합니다.
...
- name: Generate release note
id: release_note
run: |
echo "note=$(curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.API_KEY }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/releases/generate-notes \
-d '{"tag_name":"${{ steps.release_tag.outputs.version }}","target_commitish":"main","previous_tag_name":"${{ steps.pre_tag.outputs.version }}"}' \
| jq .body \
| sed 's/"//g')" >> $GITHUB_OUTPUT
...
이렇게 준비한 tag
와 /releases/generate-notes API를 사용하여 Release note
내용을 생성합니다.
이 API
를 사용하면 다음과 같이 단순한 Release note
가 생성됩니다.
**Full Changelog**: https://github.com/dev-yakuza/release-note-test/compare/v0.0.1...v0.0.2
만약, 해당 API
로 생성되는 Release note
의 내용을 변경하고 싶다면, .github/release.yml
파일을 생성하고 다음과 같이 수정합니다.
changelog:
exclude:
labels:
- ignore-for-release
authors:
- octocat
categories:
- title: Breaking Changes 🛠
labels:
- Semver-Major
- breaking-change
- title: Exciting New Features 🎉
labels:
- Semver-Minor
- enhancement
- title: Other Changes
labels:
- "*"
자세한 내용은 아래의 공식 문서를 참고하시기 바랍니다.
- GitHub 공식 문서: Configuring automatically generated release notes
이번 블로그 포스트에서는 단순한 Release note
만을 생성하기 위해 .github/release.yml
는 생성하지 않고 진행하였습니다.
마지막으로 /releases API를 사용하여 Release ntoe
를 생성합니다.
...
- name: Create Release
run: |
curl -X POST \
-H "Authorization: token ${{ secrets.API_KEY }}" \
-d "{ \"tag_name\": \"${{ steps.release_tag.outputs.version }}\", \"name\": \"${{ steps.release_tag.outputs.version }}\", \"body\": \"${{ steps.release_note.outputs.note }}\"}" \
https://api.github.com/repos/${{ github.repository }}/releases
이것으로 GitHub API
를 사용하여 간단한 Release note
를 생성할 준비가 끝났습니다.
실행
이렇게 작성한 GitHub Actions
는 다음과 같이 Git
의 tag
를 추가하면 실행이 됩니다.
git tag v0.0.2
git push origin v0.0.2
이렇게 GitHub
에 tag
를 추가하면 앞서 만든 GitHub Actions
가 실행되고 다음과 같이 Release note
가 자동으로 생성되는 것을 확인할 수 있습니다.

클릭하면 다음과 같이 상세 내용을 확인할 수 있습니다.

완료
이것으로 GitHub Actions
에서 GitHub API
를 사용하여 간단한 Release note
를 자동으로 생성하는 방법에 대해서 알아보았습니다. 여러분도 간단한 Release note
생성을 생각중이시라면 이번 블로그 포스트를 참고하시기 바랍니다.
만약, 좀 더 체계적으로 Release note
를 관리하고 싶으시다면 아래의 블로그 포스트를 참고해 주시기 바랍니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku
가 개발한 앱을 한번 사용해보세요.Deku
가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.