概要
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
を使うためには少なくとも1つ以上の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 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で開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。