概要
git-flow にした影響で、GA 版のリリース時にリリースノートの PR 一覧が正しく出ないので、修正します。
v2.1.0 では PR が 5 件しか出力されなかったため、リリースノートは手作業でコピーして対処しました。
原因
release/* → main が squash merge されるため、GA タグから見た main の履歴に develop 側の PR コミットが存在しません。GitHub のリリースノート自動生成は「タグ間のコミット範囲 → 各コミットに紐づく PR」で一覧を作るため、squash された PR 群がすべて欠落します。
generate-notes API の実測結果です。
入力
出力される PR 件数
tag=v2.1.1(previous 省略)
5 件
tag=v2.1.1, previous=v2.0.5
5 件
tag=v2.1.2(未作成), previous=v2.0.5, target=develop
49 件
tag=v2.1.2(未作成), previous=v2.0.5, target=main
5 件
また、既存タグに対しては target_commitish が無視されます。そのため、タグを push した後にワークフロー側で対象範囲を指定しても修正できません。
真の原因は git-flow の導入自体ではなく、ruleset Protect default branch (id: 2802479) が main に対しても allowed_merge_methods: ["squash"] を強制していたことです。develop と main を 1 つの ruleset で保護しているため、develop 向けに妥当な設定が main にも適用されていました。
対応方針
ワークフロー (build-and-release-documents.yml) は変更しません。generate_release_notes: true のままで、main の履歴が繋がれば正しく出力されます。
1. ruleset を develop 用と main 用に分割する
allowed_merge_methods は ruleset の pull_request ルールのパラメータなので、ref 単位で別の値を持たせるには ruleset を分ける必要があります。
既存 Protect default branch (id: 2802479) を develop 専用にする
conditions.ref_name.include:
- ["~DEFAULT_BRANCH", "refs/heads/main"]
+ ["~DEFAULT_BRANCH"]
他のルールは変更しません(allowed_merge_methods: ["squash"] のまま)。
main 用 ruleset を新設する
項目
値
name
Protect main branch
target / enforcement
branch / active
include
refs/heads/main
bypass_actors
なし
rules
deletion, non_fast_forward
pull_request: allowed_merge_methods: ["merge"], required_approving_review_count: 1, required_review_thread_resolution: true, その他は既存踏襲
copilot_code_review: review_draft_pull_requests: false, review_on_push: false
allowed_merge_methods 以外を既存と同一にすることで、main の保護が意図せず変わる副作用を避けます。
copilot_code_review は残します。hotfix/* → main は develop を経由しないため、レビューの価値があります。release/* → main ではノイズになりますが、発生は毎リリース 1 回で、hotfix/* のレビュー漏れのほうが影響が大きいと判断します。
なお required_linear_history は設定されていないため、merge commit を許可すればそのまま通ります。
2. 次回 GA のリリースノートのみ、previous tag を明示して再生成する
現在の v2.1.1 (98aee6e5) は develop 上の 49 コミットを祖先に持ちません(#5328 が squash されたため)。そのため最初の merge commit リリースでは、v2.1.0 で公開済みの約 50 件が再掲されます。git は squash 済みであることを判別できないため、これは避けられません。
次回 GA のみ、previous tag に v2.1.0-Beta1 (5f5d1fa0、develop の履歴上のコミット)を指定してリリースノートを再生成します。範囲が 5f5d1fa0..v2.2.0 に縮み、余分に載るのは #5329 と #5348 の 2 件だけになります。
2 回目以降は自動生成のままで正しく出力されます。GA タグが main の merge commit 上に載るため、次の GA タグとの merge-base が前回の GA タグになり、範囲が新規コミットのみに収まります。
3. 記録
「main は merge commit のみ」という制約と、その理由(squash するとリリースノートの PR 一覧が欠落する)をリリース手順書に記載します。今回の事象は理由を知らないまま squash に統一されたことで発生したため、理由を残すことが再発防止の要点です。
この Issue で対応しないこと
validate-pr-branch-combination が required status check になっていない問題は、別 Issue として起票します。
どの ruleset にも required_status_checks ルールがないため、ブランチ組み合わせの検証が失敗してもマージできます
実際に PR リリースパイプラインを修正する #5338 は fix/... → main で、許可リスト(hotfix/* のみ)に含まれないため検証は失敗しますが、マージされています
放置すると main に非正規のコミットが載り、merge commit に揃えた履歴が再び崩れます
リリースノートの直接原因(squash の強制)とは検証方法も影響範囲も異なるため、分離します。
完了条件
次回 GA でリリースノートが正しく出力されたことの確認は、完了条件に含めません。設定変更が効いたかどうかは上記 3・4 で即日検証でき、ノートの内容はリリース作業のチェック項目で担保します。
概要
git-flow にした影響で、GA 版のリリース時にリリースノートの PR 一覧が正しく出ないので、修正します。
v2.1.0 では PR が 5 件しか出力されなかったため、リリースノートは手作業でコピーして対処しました。
原因
release/*→mainが squash merge されるため、GA タグから見たmainの履歴に develop 側の PR コミットが存在しません。GitHub のリリースノート自動生成は「タグ間のコミット範囲 → 各コミットに紐づく PR」で一覧を作るため、squash された PR 群がすべて欠落します。generate-notesAPI の実測結果です。tag=v2.1.1(previous 省略)tag=v2.1.1,previous=v2.0.5tag=v2.1.2(未作成),previous=v2.0.5,target=developtag=v2.1.2(未作成),previous=v2.0.5,target=mainまた、既存タグに対しては
target_commitishが無視されます。そのため、タグを push した後にワークフロー側で対象範囲を指定しても修正できません。真の原因は git-flow の導入自体ではなく、ruleset
Protect default branch(id: 2802479) がmainに対してもallowed_merge_methods: ["squash"]を強制していたことです。developとmainを 1 つの ruleset で保護しているため、develop向けに妥当な設定がmainにも適用されていました。対応方針
ワークフロー (
build-and-release-documents.yml) は変更しません。generate_release_notes: trueのままで、mainの履歴が繋がれば正しく出力されます。1. ruleset を develop 用と main 用に分割する
allowed_merge_methodsは ruleset のpull_requestルールのパラメータなので、ref 単位で別の値を持たせるには ruleset を分ける必要があります。既存
Protect default branch(id: 2802479) を develop 専用にする他のルールは変更しません(
allowed_merge_methods: ["squash"]のまま)。main 用 ruleset を新設する
Protect main branchrefs/heads/maindeletion,non_fast_forwardpull_request:allowed_merge_methods: ["merge"],required_approving_review_count: 1,required_review_thread_resolution: true, その他は既存踏襲copilot_code_review:review_draft_pull_requests: false,review_on_push: falseallowed_merge_methods以外を既存と同一にすることで、mainの保護が意図せず変わる副作用を避けます。copilot_code_reviewは残します。hotfix/*→mainは develop を経由しないため、レビューの価値があります。release/*→mainではノイズになりますが、発生は毎リリース 1 回で、hotfix/*のレビュー漏れのほうが影響が大きいと判断します。なお
required_linear_historyは設定されていないため、merge commit を許可すればそのまま通ります。2. 次回 GA のリリースノートのみ、previous tag を明示して再生成する
現在の
v2.1.1(98aee6e5) は develop 上の 49 コミットを祖先に持ちません(#5328 が squash されたため)。そのため最初の merge commit リリースでは、v2.1.0 で公開済みの約 50 件が再掲されます。git は squash 済みであることを判別できないため、これは避けられません。次回 GA のみ、previous tag に
v2.1.0-Beta1(5f5d1fa0、develop の履歴上のコミット)を指定してリリースノートを再生成します。範囲が5f5d1fa0..v2.2.0に縮み、余分に載るのは #5329 と #5348 の 2 件だけになります。2 回目以降は自動生成のままで正しく出力されます。GA タグが
mainの merge commit 上に載るため、次の GA タグとのmerge-baseが前回の GA タグになり、範囲が新規コミットのみに収まります。3. 記録
「
mainは merge commit のみ」という制約と、その理由(squash するとリリースノートの PR 一覧が欠落する)をリリース手順書に記載します。今回の事象は理由を知らないまま squash に統一されたことで発生したため、理由を残すことが再発防止の要点です。この Issue で対応しないこと
validate-pr-branch-combinationが required status check になっていない問題は、別 Issue として起票します。required_status_checksルールがないため、ブランチ組み合わせの検証が失敗してもマージできますfix/...→mainで、許可リスト(hotfix/*のみ)に含まれないため検証は失敗しますが、マージされていますmainに非正規のコミットが載り、merge commit に揃えた履歴が再び崩れますリリースノートの直接原因(squash の強制)とは検証方法も影響範囲も異なるため、分離します。
完了条件
Protect default branchの対象からrefs/heads/mainが除外されているallowed_merge_methodsが["merge"]になっているv2.1.0-Beta1で再生成する、および PR 一覧に前バージョン分が混ざっていないか目視する)がリリース手順書に追記されている次回 GA でリリースノートが正しく出力されたことの確認は、完了条件に含めません。設定変更が効いたかどうかは上記 3・4 で即日検証でき、ノートの内容はリリース作業のチェック項目で担保します。