Skip to content

リリースノートを正しく出力するために main ブランチへの squash merge を禁止する #5336

Description

@KentaHizume

概要

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"] を強制していたことです。developmain を 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-Beta15f5d1fa0、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 リリースパイプラインを修正する #5338fix/...main で、許可リスト(hotfix/* のみ)に含まれないため検証は失敗しますが、マージされています
  • 放置すると main に非正規のコミットが載り、merge commit に揃えた履歴が再び崩れます

リリースノートの直接原因(squash の強制)とは検証方法も影響範囲も異なるため、分離します。

完了条件

  • 既存 ruleset Protect default branch の対象から refs/heads/main が除外されている
  • main 用 ruleset が新設され、allowed_merge_methods["merge"] になっている
  • main 向けの PR で "Squash and merge" が選択できないことを確認できている
  • develop 向けの PR で、従来どおり "Squash and merge" のみが選択できることを確認できている
  • 次回 GA の一回限りの手順(リリースノートを previous tag = v2.1.0-Beta1 で再生成する、および PR 一覧に前バージョン分が混ざっていないか目視する)がリリース手順書に追記されている
  • ブランチ組み合わせ検証を required status check にする件が、別 Issue として起票されている

次回 GA でリリースノートが正しく出力されたことの確認は、完了条件に含めません。設定変更が効いたかどうかは上記 3・4 で即日検証でき、ノートの内容はリリース作業のチェック項目で担保します。

Metadata

Metadata

Labels

内部の改善機能更新やドキュメント更新ではない改善

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions