diff --git a/.claude/rules/autopilot/prompts.md b/.claude/rules/autopilot/prompts.md index 3b48edb735..9333bc6b6c 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 09481c3280..080a7aa994 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 6e53dc7d7c..bc5d6329c6 100644 --- a/.github/workflows/deploy-infra-stg.yml +++ b/.github/workflows/deploy-infra-stg.yml @@ -178,6 +178,44 @@ 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 するたびに走ることになる。直したら付け直す運用にする。 + # + # ラベルが付いている 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 + 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 f0138072fe..70505edf70 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 に載せたいときは、そのつど付け直す。 ### マージ後