Repository navigation
feat(orchestrator): マージを merge_pull_request と msa squash-message に組み込み、リポジトリの script を消す - #243
Merged
Merged
Conversation
…み、リポジトリの script を消す #233 で手でのマージ用に置いた scripts/squash-message.ts merge と、CI の scripts/lint-squash-message.sh をやめる。マージのたびにリポジトリ独自の script の手順を 人やエージェントに覚えさせず、msa に組み込んだ道具でマージと検査をする。 方式は squash のままにした。rebase merge なら squash メッセージの組み立ては要らないが、 REST の rebase merge は commit_message を受け取らないので Msa-Merge の nonce を載せられず、 応答が返らなかったマージを自分のものと確かめる #235 の判定ができなくなるため。 - orchestrator に merge_pull_request を足した。PR 番号と確かめた head を受け取り、ハーネスと 同じ処理(pull-request-request.ts に移した head・タイトル・本文の照合、CI・BEHIND・衝突・ auto-merge の確認、squash-message.ts の組み立て、REST の merge と nonce の記録)を通る。 head が違う、CI が終わっていないなどのときはマージ要求を送らない。 - タスクの PR は、タスクが stopped・failed・completed の時だけマージし、記録をタスクの PR に 付けるので settleMerged がハーネスのマージと判定し、タスクは completed になって worktree と 枝が消える。他でマージされていれば stopped のまま理由を返す。running などは断る。 - タスクに紐づかない PR は、記録をその場で持ち、応答が無いときは trailer の nonce で判定する。 - msa squash-message <番号> <head> を足した。ハーネスと merge_pull_request が送るメッセージを 出す。CI の commits ジョブは、これを source から動かして commitlint にかける。ビルドしない CI でも動くよう、cli.ts と bun/cli.ts はこのコマンドを main.ts を読む前に振り分ける。 - reviewer への指示の「タイトルと本文が commit message になる」を、本文はコミットから作る という今の挙動に直した。 リポジトリの設定は allow_merge_commit と allow_rebase_merge を false にし、 squash_merge_commit_title=PR_TITLE、squash_merge_commit_message=BLANK にそろえた。 使い捨ての private リポジトリに同じ設定を置き、本文に 150 文字の行を含む PR(#183 と同じ形)を 素の gh pr merge --squash と、画面と同じ既定の REST merge で squash したところ、どちらも 「タイトル (#番号)」と Co-authored-by だけのメッセージになり、このリポジトリの commitlint を 通った。--merge と --rebase は GitHub が断った。merge commit も commitlint の既定の無視で 通ったが、ハーネスが使わない方式で main の履歴が PR ごとの 1 コミットでなくなるので外した。 確かめたあと使い捨てのリポジトリは削除した。 テスト: - orchestrator-merge-pull-request.test.ts(本物の Orchestrator と fake GitHub): 紐づかない PR を名指しの head でマージし、メッセージが commitlint を通る。head が違う・CI が走っている ときはマージ要求を送らない。応答が無くても trailer で自分のマージと判定し、断られた直後の 外部マージは自分のものとしない。running のタスクの PR は断る。stopped のタスクの PR を マージするとタスクが completed になり後片付けされ、外部でマージ済みなら stopped のまま。 head の照合を外す、タスクの記録を付けない、nonce を記録しないと、それぞれ該当のテストが落ちる ことを確かめた。 - tools/checks/squash-message-commitlint.test.ts: commits.yml の PR の手順が msa squash-message の出力を commitlint にかけ、長い行のコミット本文と別の head では落ちる。
merge_pull_request は state.exclusive を通らず、gh の応答を待つ間に rerun_task が割り込めた。 割り込んだ rerun の worktree を、あとから届いたマージの後片付けが消していた。 ハーネスのマージ(afterReview の squash と、既にマージ済みのときの settleMerged)も同じ形だった。 merge_pull_request は丸ごと exclusive で包む。中で exclusive を呼ぶ箇所が無いので詰まらない。 afterReview は CI を待つ間は排他の外に置き、マージを頼んでから後片付けまでを排他の中で行う。 排他に入った時点でスレッドが止められていれば何もしない。CI 待ちで他の操作を止めないため。 排他の後でも、マージと settle の間に stop が入ると settle は何もせず、マージ済みでも止まったまま残った。 settle が反映したかを返すようにし、反映しなかったときだけ afterInterrupt で決着を付ける。 afterInterrupt は、タスクに生きている run があれば触らない。止めた後の rerun の worktree を消さないため。 stop と read_task は、ハーネスのマージ中はそのマージが終わるまで待つ。 gh と git の呼び出しはどれも時間の上限があるので、待ちは有限で終わる。 既存のテストのうち、マージを止めたまま stop や read_task の完了を待っていたものは、 待たずに出してから止めを外す形に直した。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
変更
scripts/squash-message.ts・scripts/lint-squash-message.shと、それを使えという AGENTS.md の記述を消した。merge_pull_request(PR 番号と確かめた head)を足した。ハーネスと同じ処理(head・タイトル・本文の照合、CI・BEHIND・衝突・auto-merge の確認、squash メッセージの組み立て、REST の merge と nonce の記録・判定)を通る。タスクの PR は stopped・failed・completed の時だけマージし、タスクは completed になって後片付けされる。msa squash-message <番号> <head>を足し、CI の commits ジョブはその出力を commitlint にかける。merge_pull_requestとハーネスのマージ(マージ要求から後片付けまで)を、rerun・stop など他の操作と同じ排他の下に置いた。マージ中の stop・rerun・read_task はマージが終わるまで待つ。マージと settle の間に stop が入っても、マージ済みのタスクは afterInterrupt で決着し、その後の rerun の worktree は消さない。確認
gh pr merge --squashと既定の REST merge で squash し、どちらのメッセージもこのリポジトリの commitlint を通った(確認後に削除)。orchestrator-merge-pull-request.test.ts(本物の Orchestrator + fake GitHub)8 件。head 照合・タスクへの記録・nonce の記録を外すと該当テストが落ちることを確認。orchestrator-merge-rerun.test.ts(本物の Orchestrator)2 件。merge_pull_request と rerun_task を同時に出す場合と、ハーネスのマージ中に stop と rerun_task を出す場合。merge_pull_request の排他・ハーネスのマージの排他・afterInterrupt の生きた run の確認を、それぞれ外すと毎回落ちることを確認。tools/checks/squash-message-commitlint.test.ts、vp check、bundle のmsa squash-message。