#9 Release Drafterでリリースノート自動生成 - Python OSS開発記録
python 19 min read

#9 Release Drafterでリリースノート自動生成 - Python OSS開発記録

avatar-m-1

karrinn

著者

リリースのたびに「v0.1.0で何変えたっけ?」とPRを漁るの、めちゃくちゃ面倒じゃないですか?
Release Drafterを使えば、PRラベルから自動でリリースノートを生成してくれます。今回はwagtail-reusable-blocksでの設定を振り返ります。

KEY TAKEAWAYS

この記事でわかること

  • Release Drafterの仕組みと自動化できること
  • release-drafter.ymlの設定(categories・autolabeler・version-resolver)
  • 実際のリリースノート生成フロー

用語の定義

TERM 01

Release Drafter

GitHub ActionsでリリースノートとRelease Draftを自動生成するツール。PRのラベルやタイトルから変更履歴をまとめ、セマンティックバージョニングも自動推定します。

TERM 02

Release Draft

GitHubのReleases機能で作成される下書きです。公開前にリリースノートを確認・編集でき、公開ボタンを押すまで外部には見えません。

TERM 03

Autolabeler

PRのブランチ名・変更ファイルから自動的にラベルを付与する機能です。feature/xxxブランチなら「enhancement」、fix/xxxなら「bug」などを自動判定します。

TERM 04

セマンティックバージョニング

バージョン番号の付け方の規約(major.minor.patch)です。破壊的変更はmajor、新機能はminor、バグ修正はpatchを上げます。Release Drafterが自動推定できます。

Source: Semantic Versioning 2.0.0

Release Drafterとは何か

Release Drafterは、PRがマージされるたびに、自動でRelease Draftを更新してくれるGitHub Actionsです。

what-release-drafter

何を自動化してくれるのか

1. 変更履歴の収集

マージされたPRのタイトル・ラベルを自動収集します。
「v0.1.0で何変わったっけ?」を手動で調べなくて済みます。

2. カテゴリ分類

PRのラベルから「Features」「Bug Fixes」などに自動分類します。
見やすいリリースノートに整形してくれます。

3. バージョン番号の推定

ラベルからmajor/minor/patchを自動判定します。
「次は0.2.0?0.1.1?」と迷う必要がなくなります。

4. Release Draftの作成

GitHubのReleasesページに下書きを作成します。
最終確認してPublishするだけでリリース完了です。

つまり: リリース時に「PRを漁ってコピペして...」という手作業が完全になくなります

Source: Release Drafter - GitHub

手動でリリースノートを作る問題

Release Drafterを使わないと、リリースのたびにこんな作業が発生します。

よくある手動リリースの悲劇

  1. 前回のタグから今回までのPRを全部確認
    GitHubのPRリストをスクロールして、「あれ、v0.0.9の次はどこだっけ?」
  2. PRタイトルをコピペしてカテゴリ分け
    「これはFeature、これはBug Fix...」と手動で分類。めちゃくちゃ面倒です。
  3. バージョン番号を考える
    「新機能あったからminor上げて...0.1.0かな?」と毎回悩みます。
  4. リリースノートをMarkdownで書く
    フォーマットを整えて、リンクを貼って...時間がかかります。
  5. 見落としや誤字のリスク
    「あ、このPR書き忘れた!」「typoってた!」→ 公開後に修正は恥ずかしいですよね。

リリースのたびに30分〜1時間かかる

Release Drafterを使えば、この作業が完全自動化されます。
リリース時にやることは、「Release Draftを確認してPublishボタンを押す」だけです。

実装: Release Drafterの設定

wagtail-reusable-blocksでの実際の設定を見ていきましょう。2つのファイルが必要です。

ファイル1: GitHub Actions workflow

場所:.github/workflows/release-drafter.yml

これがいつRelease Drafterを実行するかを定義します。

この設定のポイント

  • push: mainへのpush時に実行
  • pull_request_target: PRのopen/reopen/更新時にAutolabelerが動作
  • permissions: Release作成とPRラベル付けに必要な権限
  • config-name: 次に説明する設定ファイルを指定
release-drafter.yml
name: Release Drafter

on:
push:
branches:
- main
pull_request_target:
types: [opened, reopened, synchronize]

permissions:
contents: write
pull-requests: write

jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v6
with:
    config-name: release-drafter.yml
env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

ファイル2: Release Drafter config

場所:.github/release-drafter.yml

これがどうリリースノートを生成するかの詳細設定です。wagtail-reusable-blocksの実際の設定を見ていきましょう。

セクション1: バージョン設定

リリース名とタグ名を「v0.1.0」形式で自動生成します。$RESOLVED_VERSIONは後述のversion-resolverで決定されます。

YAML
name-template: "v$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"

セクション2: カテゴリ分類

PRのラベルから変更をカテゴリ分類します。
「enhancement」ラベルのPRは「Features」セクションに、「bug」ラベルは「Bug Fixes」に自動振り分けされます。

YAML
categories:
- title: "Features"
labels:
- "enhancement"
- "implementation"
- title: "Bug Fixes"
labels:
- "bug"
- title: "Documentation"
labels:
- "documentation"
- "documentation-org"
- title: "Maintenance"
labels:
- "cleanup"
- "organization"
- "automation"

セクション3: 除外ラベル

「skip-changelog」ラベルのPRはリリースノートから除外されます。内部的なリファクタリングなどに便利です。

YAML
exclude-labels:
- "skip-changelog"

セクション4: 変更項目のフォーマット

各PRを「- Add ReusableBlock model @kkm-horikawa (#11)」形式で表示します。
Markdown特殊文字はエスケープされます。

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

セクション5: バージョン番号の自動推定

ルール:

  • 「priority:critical」ラベル → major(1.0.0 → 2.0.0)
  • 「enhancement」「implementation」 → minor(0.1.0 → 0.2.0)
  • 「bug」「documentation」など → patch(0.1.0 → 0.1.1)
  • どれもない場合 → patch(デフォルト)
YAML
version-resolver:
major:
labels:
- "priority:critical"
minor:
labels:
- "enhancement"
- "implementation"
patch:
labels:
- "bug"
- "documentation"
- "cleanup"
- "organization"
default: patch

セクション6: Autolabeler(自動ラベル付け)

自動ラベル付けルール:

  • feature/xxxブランチ → 「enhancement」ラベル自動付与
  • fix/xxxブランチ → 「bug」ラベル自動付与
  • *.mdファイル変更 → 「documentation」ラベル自動付与
  • 手動でラベル付けしなくてもいい
YAML
autolabeler:
- label: "documentation"
files:
- "*.md"
- "docs/**/*"
branch:
- "/docs\\/.+/"
- label: "bug"
branch:
- "/fix\\/.+/"
- "/bugfix\\/.+/"
- label: "enhancement"
branch:
- "/feat\\/.+/"
- "/feature\\/.+/"
- label: "automation"
branch:
- "/chore\\/.+/"

セクション7: リリースノートのテンプレート

$CHANGESにカテゴリ分類された変更リストが挿入されます。
フッターには前回タグとの比較リンクを自動生成します。

YAML
template: |
## What's Changed

$CHANGES

footer: |

**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION

Source: Release Drafter README.md

実際の動作フロー

Release Drafterが実際にどう動くか、具体例で見ていきましょう。

動作の流れ

  1. PR作成: feature/11-reusable-block-model
    → Autolabelerが「enhancement」ラベルを自動付与
  2. PRマージ → mainブランチにpush
    → Release Drafter workflowがトリガー
  3. Release Drafterが実行
    ・PRのラベル「enhancement」を確認
    ・version-resolverで「minor」と判定
    ・次のバージョンを「v0.1.0」と推定
    ・「Features」カテゴリに追加
  4. Release Draftが更新される
    GitHubのReleasesページで下書きを確認できます
  5. リリース時: Publishボタンをクリック
    → リリースノートが公開されます

生成されるリリースノートの例

カテゴリごとに整理され、PRへのリンク付きです。
最後にFull Changelogリンクも自動生成されます。

Markdown
## What's Changed

Features
- Add ReusableBlock model @kkm-horikawa (#11)
- Implement slot system @kkm-horikawa (#15)

Bug Fixes
- Fix circular reference detection @kkm-horikawa (#12)

Documentation
- Update README with installation guide @kkm-horikawa (#14)

**Full Changelog**: https://github.com/kkm-horikawa/wagtail-reusable-blocks/compare/v0.0.1...v0.1.0

トピック#4・#6との相乗効果: 完全自動化のチェーン

Release Drafterの真価は、ブランチ命名規則の強制(トピック#6)と組み合わせた時に発揮されます。

3つのトピックが連携する仕組み

1. Git Flow

トピック#4

ブランチ命名規則を決定
feature/xxx
fix/xxx
chore/xxx
docs/xxx

2. Rulesets

トピック#6

ブランチ命名を強制
規則外のブランチ名は作れない
→ 100%規則通りのブランチ名

3. Release Drafter

トピック#9

ブランチ名から自動ラベル
→ 自動カテゴリ分類
→ 自動バージョン推定
→ リリースノート自動生成

完全自動化のチェーン

この3つが連携すると、開発者は何も考えずにブランチを切ってPRを出すだけ
リリースノートは勝手に生成され、バージョン番号も勝手に決まります。人間の手作業ゼロです。

実際の自動化フロー

新機能開発の例

  1. 開発者: feature/11-reusable-block-modelブランチ作成
    → Rulesetsが「feature/」を確認、OK
  2. 開発者: PRを作成
    → Release Drafter autolabelerが実行
    → ブランチ名「feature/」を検知
    → 「enhancement」ラベルを自動付与
  3. PRマージ → mainへpush
    → Release Drafterが実行
    → 「enhancement」ラベルを確認
    → version-resolverで「minor」と判定
    → 「Features」カテゴリに追加
    → 次のバージョンを「v0.1.0」と推定
  4. リリース時: Publishボタンをクリック
    → リリースノート完成、v0.1.0として公開

開発者がやったこと

  1. git checkout -b feature/11-reusable-block-model
  2. コード書く
  3. PR作成
  4. 以上!

自動で行われたこと

  • ブランチ名の検証(Rulesets)
  • ラベル付与(Autolabeler)
  • カテゴリ分類(Release Drafter)
  • バージョン番号推定(Version resolver)
  • リリースノート生成(Release Drafter)

Rulesetsがないと何が起きるか

もしトピック#6のRulesetsでブランチ命名を強制していないと、こうなります:

悪い例: ブランチ名がバラバラ

  • add-reusable-block ← プレフィックスなし
  • feat/reusable-block ← featはGit Flowにない
  • reusable-block-feature ← ルール無視
  • makoto/reusable-block ← 個人名

結果:

  • Autolabelerが機能しない
  • 手動でラベル付け必要
  • ラベル付け忘れ発生
  • リリースノートが不正確

Rulesetsで強制 = Autolabelerが100%機能

トピック#6でブランチ命名を技術的に強制すれば、全てのブランチが規則通り。
→ Autolabelerが100%正確に動作する。
→ リリースノートも100%正確。
人間の記憶や注意に頼らない

OSS vs 企業プロジェクト: Release Drafterの価値

OSS: ユーザーへの透明性とメンテナンスコスト削減

OSSプロジェクトでは、リリースノートがユーザーとのコミュニケーション手段です。
「v0.2.0で何が変わったの?」をすぐに伝える必要があります。

Release Drafterのメリット

  • 透明性: 全ての変更が自動的にリリースノートに記録される
  • 一貫性: フォーマットが統一され、見やすい
  • 時間節約: リリースのたびに手作業でまとめる必要がない
  • 見落とし防止: マージされたPRは全て自動収集される

ユーザーに優しい: リリースノートが充実していると、「このプロジェクト、ちゃんとメンテされてるな」という信頼感につながります。

企業: リリース作業の標準化と属人化の排除

企業プロジェクトでは、「リリース担当者がいないとリリースできない」という状況が起きがちです。

よくある問題

  • リリース担当者が休むとリリースできない → 属人化
  • リリースノート作成に時間がかかる → 「今日はリリース無理」
  • 人によってフォーマットが違う → 一貫性がない
  • 変更の見落とし → 「あの修正、リリースノートに書き忘れた!」

Release Drafterによる解決

Release Drafterを導入すれば、誰でもリリースできるようになります。

  • リリースノートは自動生成 → 担当者の知識不要
  • フォーマット統一 → 誰がやっても同じ品質
  • 見落としゼロ → システムが全PRを収集
  • バージョン番号も自動推定 → 「次は0.2.0?0.1.1?」と悩まない

システムで標準化:リリース作業を誰でもできるようにすることで、属人化を防ぎ、休暇も取りやすくなります。
これは心理的安全性にもつながります。

実例: 手動デプロイ + Excel管理の問題

過去に関わったDjangoプロジェクトで、リリース作業に丸一日かかるという現場がありました。

Excelリリースノート管理の問題点

  • 書き方のルールが人によってブレる
    → Aさんは詳細に書く、Bさんは簡潔、Cさんは技術用語満載...
  • リンクを貼るのが大変
    → PR番号を手動でコピペ、URLを手動で作成...
  • リンク先が人によってバラバラ
    → Aさんはコミットリンク、Bさんはプルリクエストリンク、CさんはRedmineチケットリンク...
    → Backlogに移行したら、ある時点より前のリンクが全てリンク切れ
    過去のリリースノートが使い物にならない
  • 見落としが発生
    → 「あのPR、リリースノートに書き忘れた!」

本来、システムで担保すべきこと

時点システムで担保すべきこと手動だとどうなるか
コード変更時 ・ブランチ命名規則の強制(Rulesets)
・自動テスト実行(CI)
・自動ラベル付け(Autolabeler)
「ブランチ名はfeature/で」と口頭指示
→ 忘れる、守らない
PR作成時 ・必須レビュアー設定(CODEOWNERS)
・CIチェック必須(Rulesets)
・リリースノート自動収集(Release Drafter)
「誰かレビューして」と依頼
→ 見落とし、スキップ
リリース時 ・タグによるバージョン管理
・自動デプロイ(GitHub Actions)
・自動ロールバック機能
手動コマンド実行
→ タイポ、手順ミス、ロールバック失敗

きちっとシステムで整備すれば、こういうことは起きない

どの時点で何が担保されているかをルール・システム上で明確にしておけば:
・ブランチ命名ミス → システムが弾く
・レビュー漏れ → システムが弾く
・mainへの直push → システムが弾く
・デプロイミス → 自動化されているので起きない

「今日は失敗でした、また明日やります」が起きない

Release Drafter導入後: リリース作業が15分に

何が変わったか

  • リリースノートは自動生成済み → Release Draftを確認するだけ
  • フォーマット統一 → 誰が書いても同じ品質
  • リンクも自動 → PR番号から自動でURL生成
  • 見落としゼロ → マージされたPRは全て収集
  • Excelとお別れ → GitHubのReleasesで管理

リリース作業の流れ(導入後)

  1. GitHubのReleasesページを開く(1分)
  2. Release Draftを確認(5分)
  3. 必要なら微修正(5分)
  4. Publishボタンをクリック(1分)
  5. GitHub Actionsが自動デプロイ(3分)

合計: 約15分 (従来: 1日 = 8時間 = 480分)

よくある質問

A: はい、完全無料です。

Release DrafterはGitHub Actionsで動作するため、GitHub Actionsの無料枠内で使えます。
Publicリポジトリなら無制限、Privateリポジトリでも月2,000分の無料枠があります(トピック#1参照)。

A: はい、Publish前なら自由に編集できます。

Release Drafterが生成した内容は下書きです。
GitHubのReleasesページで編集して、最終確認してからPublishしてください。
「この表現もっと詳しく書きたい」などの調整は自由にできます。

A: PRで手動でラベルを変更できます。

Autolabelerはあくまで自動付与なので、間違っていたら手動で修正してください。
PRマージ時のラベルが最終的にRelease Draftに反映されます。

A: はい、自動でまとめられます。

Release DrafterはPublishするまで下書きに追加し続けます
例: PR #11, #12, #13をマージ → Release Draftに全て追加される → Publishで一度にリリース。

A: Release Draft編集時に変更できます。

Release Drafterの推定が「v0.1.1」でも、Publish前にタグ名を「v0.2.0」に変更できます。
version-resolverは推定値なので、最終判断は人間がします。

A: はい、workflowのbranchesを変更すれば可能です。

wagtail-reusable-blocksではmainブランチのみで動作するように設定していますが、developでも動かせます。

YAML
on:
push:
branches:
- main
- develop  # 追加

ただし、リリースはmainブランチから行うので、wagtail-reusable-blocksではmainのみにしています。

参考リンク

関連トピック

コメント (0)

まだコメントはありません。最初のコメントを残しませんか?

コメントを投稿

メールアドレスが公開されることはありません。必須項目には * が付いています