概要
Gitに保存された変更履歴をローカルLLMに読ませ、GitHubのリリースノートやPull Requestの説明文を自動作成するGitHub Actionsを作りました。
v2.0.1のようなtagをpushしたときに前回のリリースとの差分をまとめる使い方と、Pull Requestを作成・更新したときにマージ元とマージ先の差分を説明する使い方ができます。
なぜ作ったのか
変更の数が増えると、リリースノートやPull Requestの説明を書くために、複数人の作業や過去の変更を振り返る必要があります。コミットのタイトルを並べるだけでは、利用者やレビュアーに変更の要点が伝わらない場合もあります。
そこで、前回のリリースやマージ先との最終的な差分を調べ、変更内容の説明からGitHubへの反映までを自動化しました。途中で追加したあとに取り消された変更ではなく、最終的に残った内容をもとに文章を作ることを重視しています。
作成したGitHub Actionについて
auto-generate-release-noteには以下の機能があります。
- tag間または任意のbranch・commit間の差分を比較
- ソースコードの変更点を整理し、OllamaでMarkdownを生成
- 日本語、英語、日英両方の出力
- GitHub Releaseの作成・更新
- Markdownテンプレートを使ったPull Request本文の生成
- AIの処理に失敗した場合の簡易的な文章への切り替え
使用している技術
このプロジェクトで使用している主な技術は以下の通りです。
| 技術 | このプロジェクトでの役割 |
|---|---|
| TypeScript | |
| Node.js | スクリプトの実行 |
| Ollama | ローカルLLM実行環境内のAIモデルを動かす |
| Qwen2.5-Coder | ソースコードの変更内容を読み、Markdownの文章を生成する既定のAIモデル(今回の用途、実行環境に最も適しているモデル) |
GitHub ActionsからNode.jsの処理を起動し、Gitの差分を解析します。整理した変更内容からOllamaで文章を生成し、GitHub REST APIまたはGitHub CLIでGitHubへ反映する構成です。
どのように実現しているのか
全体の処理の流れを図にすると以下のようになります。
2つの時点をGitで比較する
最初にGitから変更されたcommitとファイルを取得します。リリースノートでは現在と前回のtag、Pull Requestではマージ先のbase SHAとマージ元のhead SHAを比較します。
AIへ渡す前に差分を整理する
変更された関数、設定項目、公開機能、処理条件、テストなどを抽出し、差分をコンパクトな意味情報へ変換します。画像や動画などは本文を解析せず、変更されたファイルとして記録します。commitも最終的な差分と関係するものだけを補助情報にします。
テンプレートを保ったまま文章を挿入する
template-fileを指定すると、見出し、注意書き、チェックボックスなどを残し、説明を書く場所だけへ生成結果を挿入します。
生成結果の出力先を切り替える
-
dry-run: 'false'の場合は、対象tagのGitHub Releaseを作成または更新する -
dry-run: 'true'の場合は、GitHub Releaseを変更せずMarkdownファイルへ出力する
Pull Requestでは、出力したMarkdownをgh pr editへ渡して本文を更新します。
使い方
GitHub Actionsの設定ファイルを作成する
利用するプロジェクトに.github/workflows/release.ymlを作成します。
name: Create release notes
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Generate release notes
uses: TakuKobayashi/auto-generate-release-note@v2
with:
language: ja
fetch-depth: 0で過去の履歴とtagを取得し、contents: writeでGitHub Releaseへの書き込みを許可します。
tagを作成してGitHubへ送る
設定をGitHubへ反映したあと、リリースしたい時点でtagを作成してpushします。
git tag v1.0.0
git push origin v1.0.0
tagのpushをきっかけにGitHub Actionsが起動し、前回のtagとの差分からGitHub Releaseを作成します。
出力を変更する
日本語と英語を同時に作成する
bilingualを追加すると、日本語と英語を同時に併記した形で生成できます。
- name: Generate release notes
uses: TakuKobayashi/auto-generate-release-note@v2
with:
language: ja
bilingual: 'true'
公開せずに内容だけ確認する
dry-runを指定すると、GitHub Releaseを変更せずMarkdownファイルへ出力できます。
- name: Preview release notes
uses: TakuKobayashi/auto-generate-release-note@v2
with:
language: ja
dry-run: 'true'
output-file: release-notes-preview.md
Pull Requestの説明文を自動作成する
Pull Requestの変更が多い場合、「何を変更したのか」を本文へまとめる作業にも時間がかかります。
本ツールのcomparison-baseとcomparison-targetへPull Requestのbase(マージ先)とhead(マージ元)を指定すると、マージ先に対してマージ元で何が変わったのかをAIが読み取り、Pull Requestの本文へ反映できます。
実際に使用しているworkflowはこちらです。
Pull Requestが作成されたときと、その後に新しいcommitが追加されたときに本文を更新する部分は以下のようになっています。
name: Create or update pull request
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
jobs:
update-pull-request:
runs-on: ubuntu-latest
steps:
- name: Checkout pull request revision
uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Generate pull request body from the branch difference
uses: TakuKobayashi/auto-generate-release-note@v2
with:
comparison-base: ${{ github.event.pull_request.base.sha }}
comparison-target: ${{ github.event.pull_request.head.sha }}
release-name: ${{ github.event.pull_request.title }}
language: ja
dry-run: 'true'
template-file: .github/PULL_REQUEST_TEMPLATE/release.md
output-file: ${{ runner.temp }}/pull-request-body.md
- name: Update pull request body
env:
GH_TOKEN: ${{ github.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
BODY_FILE: ${{ runner.temp }}/pull-request-body.md
run: gh pr edit "$PR_NUMBER" --body-file "$BODY_FILE"
opened、synchronize、reopenedを指定しているため、Pull Requestの作成時だけでなく、新しいcommitが追加された場合にも最新の差分から本文を作り直します。
また、template-fileを指定すると、チェックリストや注意事項など、もともとのPull Requestテンプレートを残したまま、説明を書く場所へ生成結果を挿入します。
release-pr.ymlには、GitHub Actionsの画面で任意のマージ元branchとマージ先branchを指定し、Pull Requestそのものを作成または更新する処理も含めています。
まとめ
auto-generate-release-noteを使うと、Gitの差分からGitHub ReleaseやPull Requestの本文を自動作成できます。tagによるリリースと、branch間の変更確認のどちらにも同じ仕組みを利用できます。
変更内容をまとめる作業を効率化したいプロジェクトで試してもらえればと思います。