From 9eee125f30feaa6a5070602a4a655365f94015b0 Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 13:33:40 +0000 Subject: [PATCH 1/2] =?UTF-8?q?ci(infra):=20stg=20=E3=83=87=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=A4=E5=BE=8C=E3=81=AB=20deploy-stg=20=E3=83=A9?= =?UTF-8?q?=E3=83=99=E3=83=AB=E3=82=92=E8=87=AA=E5=8B=95=E3=81=A7=E5=A4=96?= =?UTF-8?q?=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ラベルは「1 回の操作」のつもりで付けるのに、外すまで効き続けるので push の たびに再デプロイされていた(#1148 の作業中に 4 回走り、うち 1 回は docs だけの push だった)。外す作業を人間から取り上げる。 matrix の後に 1 回だけ走る cleanup ジョブを足し、成功・失敗どちらでも外す。 失敗時に残すと「直そうとして push するたびに走る」が復活するため。既に外れて いても失敗しない。 Refs #1173 Co-Authored-By: Claude Opus 5 (1M context) --- .claude/rules/autopilot/prompts.md | 3 +++ .claude/rules/infra/development.md | 2 ++ .github/workflows/deploy-infra-stg.yml | 35 +++++++++++++++++++++++++- docs/infra-deploy/README.md | 6 ++++- 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/.claude/rules/autopilot/prompts.md b/.claude/rules/autopilot/prompts.md index 3b48edb7351..9333bc6b6c3 100644 --- a/.claude/rules/autopilot/prompts.md +++ b/.claude/rules/autopilot/prompts.md @@ -116,6 +116,9 @@ worker は **`cdk deploy` を実行しない**(stg / prod とも)。stg は 2. `.github/workflows/deploy-infra-stg.yml` の完了を待つ(`gh run watch` / `gh pr checks`) 3. workflow が PR に残すコメントで「いまの stg が自分の SHA か」を確認してから DoD を行う +ラベルは **1 回きりの操作**で、run の完了時に workflow が自動で外す。**外す処理を自分で書かない** +(二重に外そうとして 404 になる)。再度載せたいときは付け直す。 + prod への反映は**人間の作業**。結果ファイルや PR 本文に「prod は人間が実施」と明記して終える (`.claude/rules/infra/development.md` の「デプロイ経路」)。 diff --git a/.claude/rules/infra/development.md b/.claude/rules/infra/development.md index 09481c32807..080a7aa9941 100644 --- a/.claude/rules/infra/development.md +++ b/.claude/rules/infra/development.md @@ -66,6 +66,8 @@ stg は**共有資源**で、人間と複数の autopilot worker が同時に触 - **worker はローカルから `cdk deploy` しない**(`.claude/rules/autopilot/prompts.md`)。 - stg に自分の変更を載せたいときは PR に `deploy-stg` ラベルを付け、Actions の完了を待つ。 + ラベルは **1 回きり**で、run の完了時に workflow が自動で外す(付けっぱなしだと push の + たびに再デプロイされるため)。再度載せたいときは付け直す。 - **stg は上書きされうる**。DoD をする前に、workflow が PR に残したコメントで 「いまの stg が自分の SHA か」を確認する。違えばラベルを付け直して再デプロイする。 - develop への infra push でも stg へデプロイが走るので、**マージ後は stg が develop に収束**する。 diff --git a/.github/workflows/deploy-infra-stg.yml b/.github/workflows/deploy-infra-stg.yml index 6e53dc7d7ca..688128a7ded 100644 --- a/.github/workflows/deploy-infra-stg.yml +++ b/.github/workflows/deploy-infra-stg.yml @@ -178,6 +178,39 @@ jobs: printf '| branch | `%s` |\n' "${HEAD_REF}" printf '| run | %s |\n\n' "${RUN_URL}" printf 'stg は共有環境です。**この SHA が載っている前提で** 動作確認してください。\n' - printf '別の PR があとからデプロイすると上書きされます(その場合はラベルを付け直して再デプロイ)。\n' + printf '別の PR があとからデプロイすると上書きされます。\n\n' + printf '`deploy-stg` ラベルはこの run の完了時に自動で外れます。' + printf 'もう一度 stg に載せたいときは**ラベルを付け直して**ください。\n' } > "${RUNNER_TEMP}/stg-deploy-comment.md" gh pr comment "${PR_NUMBER}" --body-file "${RUNNER_TEMP}/stg-deploy-comment.md" + + # ラベルは「1 回の操作」として扱う (#1173)。付けたら 1 回だけデプロイし、run の完了時に + # ワークフロー自身が外す。外し忘れると push のたびに再デプロイされてしまうため + # (実測で docs だけの push でも走った)、外す作業を人間から取り上げる。 + # + # deploy ジョブの中で外すと、対象プロジェクトが複数あるとき二重で外して片方が 404 になる。 + # matrix の後に 1 回だけ走らせる。 + cleanup-label: + name: deploy-stg ラベルを外す + needs: [select, deploy] + # 成功・失敗どちらでも外す。失敗時に残すと「次の push で勝手に再デプロイ」が復活して + # しまい、直そうとして push するたびに走ることになる。直したら付け直す運用にする。 + if: always() && github.event_name == 'pull_request' + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: ラベルを外す + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPO: ${{ github.repository }} + run: | + set -euo pipefail + # 既に外れている場合も成功させる(人間が先に外していることがある)。 + if gh api "repos/${REPO}/issues/${PR_NUMBER}/labels" --jq '.[].name' | grep -qx 'deploy-stg'; then + gh api --method DELETE "repos/${REPO}/issues/${PR_NUMBER}/labels/deploy-stg" --silent + echo "deploy-stg を外した" + else + echo "deploy-stg は付いていない(何もしない)" + fi diff --git a/docs/infra-deploy/README.md b/docs/infra-deploy/README.md index f0138072fe8..70505edf70e 100644 --- a/docs/infra-deploy/README.md +++ b/docs/infra-deploy/README.md @@ -27,7 +27,11 @@ prod は「いつ・誰が・何を出したか」を人間が握るべきなの 2. `Deploy Infra (stg)` が走り、**変更された infra プロジェクトだけ**が stg へ出る。 3. workflow が PR に「どの SHA を stg に出したか」をコメントする。 4. **そのコメントの SHA が自分の PR のものであることを確認してから**動作確認する。 - 別の PR があとからデプロイすると上書きされる(その場合はラベルを外して付け直す)。 + 別の PR があとからデプロイすると上書きされる(その場合は**もう一度ラベルを付ける**)。 + +> **ラベルは 1 回きりの操作**。run の完了時に workflow が自動で外す(成功・失敗どちらでも)。 +> 付けっぱなしだと push のたびに再デプロイされてしまうため、外す作業は人間に任せていない。 +> もう一度 stg に載せたいときは、そのつど付け直す。 ### マージ後 From 6bd570d6a9e604c11300d0ecf4987fa4c3df3bc7 Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Tue, 1 Sep 2026 13:35:09 +0000 Subject: [PATCH 2/2] =?UTF-8?q?fix(ci):=20=E3=83=A9=E3=83=99=E3=83=AB?= =?UTF-8?q?=E3=81=8C=E4=BB=98=E3=81=84=E3=81=A6=E3=81=84=E3=82=8B=20run=20?= =?UTF-8?q?=E3=81=A0=E3=81=91=20cleanup=20=E3=82=92=E8=B5=B0=E3=82=89?= =?UTF-8?q?=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 自己レビューで見つけた。always() だけだと、ラベルが付いていない PR(= デプロイを 要求していない)でも workflow 自体は起動するので、毎 push で「何もしない」ジョブが 動いてログが増える。ラベルの有無で絞る。 Refs #1173 Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/deploy-infra-stg.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-infra-stg.yml b/.github/workflows/deploy-infra-stg.yml index 688128a7ded..bc5d6329c6d 100644 --- a/.github/workflows/deploy-infra-stg.yml +++ b/.github/workflows/deploy-infra-stg.yml @@ -195,7 +195,12 @@ jobs: needs: [select, deploy] # 成功・失敗どちらでも外す。失敗時に残すと「次の push で勝手に再デプロイ」が復活して # しまい、直そうとして push するたびに走ることになる。直したら付け直す運用にする。 - if: always() && github.event_name == 'pull_request' + # + # ラベルが付いている run に限定する。付いていない PR(= デプロイを要求していない)でも + # この workflow 自体は起動するので、条件を絞らないと毎 push で無駄なジョブが動く。 + if: >- + always() && github.event_name == 'pull_request' && + contains(github.event.pull_request.labels.*.name, 'deploy-stg') runs-on: ubuntu-latest permissions: pull-requests: write