Skip to content

ci(infra): stg デプロイ後に deploy-stg ラベルを自動で外す - #1174

Merged
takaokouji merged 2 commits into
developfrom
topic/autopilot-1173
Sep 1, 2026
Merged

ci(infra): stg デプロイ後に deploy-stg ラベルを自動で外す#1174
takaokouji merged 2 commits into
developfrom
topic/autopilot-1173

Conversation

@smalruby3-editor-bot

Copy link
Copy Markdown

概要

deploy-stg ラベルは「いま stg に載せたい」という 1 回きりの意思表示のつもりで付けるのに、
外すまで効き続けるため push のたびに再デプロイされていた。PR #1148 の作業中に 4 回走り、
うち 1 回は docs だけの push だった(pull_requestpaths フィルタは PR の変更ファイル
全体に対して効くので、その push が infra を触っていなくても再実行される)。

利用者から「外すのを忘れそうで運用が難しい」というフィードバックを受けたので、
外す作業を人間から取り上げる

Closes #1173

変更

run の完了時に workflow 自身が deploy-stg を外すcleanup-label ジョブを追加)。

設計上の判断:

論点 判断 理由
どこで外すか matrix の後に 1 回だけ走る別ジョブneeds: [select, deploy] deploy ジョブ内で外すと、対象プロジェクトが複数のとき二重に外して片方が 404 になる
失敗時も外すか 外すif: always() 失敗時に残すと「直そうとして push するたびに走る」が復活し、今回の不満がそのまま残る。直したら付け直す
既に外れていたら 成功扱い(付いているか確認してから DELETE) 人間が先に外していることがある
権限 ジョブに pull-requests: write のみ 最小権限。GITHUB_TOKEN で足りる

あわせて PR コメントに「もう一度載せたいときはラベルを付け直してください」を追記し、
docs/infra-deploy/README.md / .claude/rules/infra/development.md /
.claude/rules/autopilot/prompts.md の記述を新しい挙動に合わせた
(worker 向けには「外す処理を自分で書かない」も明記)。

採らなかった案

却下理由
synchronize をトリガーから外す ラベルは残るが実態とズレる(push しても stg は古いまま)。「ラベルが付いている=最新が載っている」と誤解する事故のほうが痛い
/deploy-stg コメントコマンド 実装が増える。ラベルは GitHub の権限で自然に守られているが、コメントは誰でも書けるので発言者の権限確認が別途必要

検証

YAML 構造: js-yaml でパースし、cleanup-labelneeds / if / permissions を確認。
run スクリプトに ${{ }} の展開が無いこと(injection 対策)も確認済み。

ラベル除去ロジック: workflow から run スクリプトを抜き出して実際に実行した。

ケース 結果
ラベルが付いていない PR deploy-stg は付いていない(何もしない) → 成功終了
ラベルが付いている PR この PR 自体で確認(下記コメント参照)

この PR は infra/** を触らないので、ラベルを付けてもデプロイは走らないpaths フィルタ)。
実挙動の最終確認は、次に infra を触る PR で行う。

ラベルは「1 回の操作」のつもりで付けるのに、外すまで効き続けるので push の
たびに再デプロイされていた(#1148 の作業中に 4 回走り、うち 1 回は docs だけの
push だった)。外す作業を人間から取り上げる。

matrix の後に 1 回だけ走る cleanup ジョブを足し、成功・失敗どちらでも外す。
失敗時に残すと「直そうとして push するたびに走る」が復活するため。既に外れて
いても失敗しない。

Refs #1173

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@smalruby3-editor-bot smalruby3-editor-bot Bot added deploy-stg この PR の infra 変更を stg にデプロイする (#1162) and removed deploy-stg この PR の infra 変更を stg にデプロイする (#1162) labels Sep 1, 2026
自己レビューで見つけた。always() だけだと、ラベルが付いていない PR(= デプロイを
要求していない)でも workflow 自体は起動するので、毎 push で「何もしない」ジョブが
動いてログが増える。ラベルの有無で絞る。

Refs #1173

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@smalruby3-editor-bot

Copy link
Copy Markdown
Author

🤖 敵対的レビュー(自己レビュー): Must 1 件(修正済み)/ Question 2 件 / FYI 2 件

観点は正確性・セキュリティ・再利用/簡潔性・.claude/rules 準拠・DoD 整合。変更が
.github/workflows/**.claude/rules/infra|autopilot/** なので、
.claude/rules/infra/development.md(デプロイ経路)と .claude/rules/autopilot/prompts.md
(worker の禁止事項)を読んで、記述と実装が食い違わないことを確認した。

[Must] ラベルが無い PR でも cleanup が毎回走る(修正済み 最新コミット)

最初の実装は if: always() && github.event_name == 'pull_request' だけだった。しかし
この workflow はラベルの有無に関係なく起動するselect ジョブの if で仕事を止めているだけ)。
そのため、infra/** を含む PR に push するたびに「何もしない cleanup ジョブ」が動き、
ランナーとログを無駄に消費する。

contains(github.event.pull_request.labels.*.name, 'deploy-stg') を条件に足して、
デプロイを要求した run に限定した。

実地で確認したこと

workflow から run スクリプトを抜き出して、実際の PR に対して実行した。

ケース 結果
ラベルが付いている PR(この PR で実施) deploy-stg を外したラベル無しになった
直後にもう一度実行(冪等性) deploy-stg は付いていない(何もしない) → 成功終了
最初からラベルが無い PR 同上・成功終了

YAML / 権限: js-yaml でパースし needs: [select, deploy] / job 単位の
permissions: {pull-requests: write}(workflow 全体より狭い)を確認。run スクリプトに
${{ }} の展開が無いこと(injection 対策)も確認済み。

Question(判断が要る)

[Question] always() はキャンセル時も含む。 run を手動キャンセルしてもラベルが外れる。
「キャンセル=やり直したい」ならラベルが残るほうが親切だが、残すと次の push で勝手に
再デプロイ
が復活する(今回直したかった問題そのもの)。一貫性を優先して外す方に倒したが、
!cancelled() にする選択肢もある。

[Question] select[] を返したとき(対象プロジェクト無し)もラベルを外す。
paths フィルタで infra/** の変更は保証されるが、cdk.json を持たないディレクトリだけの
変更なら対象は空になる。この場合デプロイは起きないがラベルは外れる。「1 回の操作」という
意味では正しいが、「押したのに何も起きずラベルだけ消えた」と見える可能性はある。
PR コメントが出ないので気付きにくいかもしれない。

FYI

[FYI] この PR 自体ではデプロイは走らない。 infra/** を触っていないため paths フィルタに
かからない。実挙動(デプロイ → 自動でラベルが外れる)の確認は、次に infra を触る PR
できる。ラベル除去そのものは上記のとおり実地で確認済み。

[FYI] ドキュメント 3 箇所を同時に更新した。 docs/infra-deploy/README.md /
.claude/rules/infra/development.md /.claude/rules/autopilot/prompts.md。worker 向けには
外す処理を自分で書かない(二重に外そうとして 404 になる)」も明記した。

DoD 照合

  • ラベルを付けるとデプロイが 1 回走り、完了後に自動で外れる(除去ロジックは実地確認済み)
  • 複数プロジェクトでもラベル除去は 1 回だけ(matrix の後の単一ジョブ)
  • 失敗時も外れる(always()
  • ラベルが既に無くても失敗しない(冪等)
  • PR コメントから「再デプロイには付け直す」ことが分かる
  • docs / rules を新しい挙動に合わせた

@smalruby3-editor-bot smalruby3-editor-bot Bot added the 👥 human-review-required Bot 権限外パスを含む PR。本人以外の人間レビュー必須 label Sep 1, 2026
@takaokouji
takaokouji merged commit ed4ca86 into develop Sep 1, 2026
9 checks passed
@takaokouji
takaokouji deleted the topic/autopilot-1173 branch September 1, 2026 13:40
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

🚀 Preview deployed: https://smalruby.jp/smalruby3-editor/topic/autopilot-1173/

github-actions Bot pushed a commit that referenced this pull request Sep 1, 2026
…lot-1173

ci(infra): stg デプロイ後に deploy-stg ラベルを自動で外す
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

👥 human-review-required Bot 権限外パスを含む PR。本人以外の人間レビュー必須

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci(infra): stg デプロイ後に deploy-stg ラベルを自動で外す

1 participant