diff --git a/.github/scripts/terragrunt-release/test.sh b/.github/scripts/terragrunt-release/test.sh index 9c18da7a..59bb7f4e 100755 --- a/.github/scripts/terragrunt-release/test.sh +++ b/.github/scripts/terragrunt-release/test.sh @@ -332,22 +332,22 @@ YAML test_deploy_trigger_applies_only_merge_targets() { local expected="\${{ matrix.target.stack == 'terragrunt' && (github.event_name == 'pull_request' && 'plan' || (matrix.target.apply_trigger == 'merge' && 'apply' || '')) || '' }}" local actual - actual="$(yq '.jobs.deploy-terragrunt.with.action-type' "${repo_root}/.github/workflows/auto-label--deploy-trigger.yaml")" + actual="$(yq '.jobs.deploy-terragrunt.with.action-type' "${repo_root}/.github/workflows/label-base-deploy--resolver.yaml")" assert_eq "${expected}" "${actual}" } test_deploy_trigger_excludes_shared_targets() { local job stack for job in deploy-terragrunt deploy-kubernetes; do - stack="$(yq ".jobs.${job}.strategy.matrix.exclude[] | select(.target.stack == \"terragrunt-shared\") | .target.stack" "${repo_root}/.github/workflows/auto-label--deploy-trigger.yaml")" + stack="$(yq ".jobs.${job}.strategy.matrix.exclude[] | select(.target.stack == \"terragrunt-shared\") | .target.stack" "${repo_root}/.github/workflows/label-base-deploy--resolver.yaml")" assert_eq "terragrunt-shared" "${stack}" done } test_release_workflows_skip_empty_targets() { local expected="needs.resolve.outputs.targets != '[]'" - assert_eq "${expected}" "$(yq '.jobs.plan.if' "${repo_root}/.github/workflows/auto-release--plan.yaml")" - assert_eq "${expected}" "$(yq '.jobs.apply.if' "${repo_root}/.github/workflows/auto-release--trigger.yaml")" + assert_eq "${expected}" "$(yq '.jobs.plan.if' "${repo_root}/.github/workflows/release--plan.yaml")" + assert_eq "${expected}" "$(yq '.jobs.apply.if' "${repo_root}/.github/workflows/release--deploy.yaml")" } test_repository_config_excludes_production() { diff --git a/.github/workflows/ci-gatekeeper.yaml b/.github/workflows/ci-gatekeeper.yaml index 54f6aa87..a68a8daa 100644 --- a/.github/workflows/ci-gatekeeper.yaml +++ b/.github/workflows/ci-gatekeeper.yaml @@ -1,3 +1,4 @@ +# Waits for every other workflow on a pull request so that one required check gates the merge. name: 'CI Gatekeeper' on: diff --git a/.github/workflows/auto-label--label-dispatcher.yaml b/.github/workflows/label-base-deploy--dispatcher.yaml similarity index 91% rename from .github/workflows/auto-label--label-dispatcher.yaml rename to .github/workflows/label-base-deploy--dispatcher.yaml index b5073c6c..6e9f35c2 100644 --- a/.github/workflows/auto-label--label-dispatcher.yaml +++ b/.github/workflows/label-base-deploy--dispatcher.yaml @@ -1,4 +1,5 @@ -name: 'Auto Label - Label Dispatcher' +# Adds deploy:{service} labels to a pull request from the stack paths it changes. +name: 'Label Base Deploy - Dispatcher' on: pull_request: diff --git a/.github/workflows/auto-label--deploy-trigger.yaml b/.github/workflows/label-base-deploy--resolver.yaml similarity index 78% rename from .github/workflows/auto-label--deploy-trigger.yaml rename to .github/workflows/label-base-deploy--resolver.yaml index a0c2753b..2c35809b 100644 --- a/.github/workflows/auto-label--deploy-trigger.yaml +++ b/.github/workflows/label-base-deploy--resolver.yaml @@ -1,4 +1,5 @@ -name: 'Auto Label - Label Resolver' +# Resolves deploy labels into targets, plans them on pull requests, and applies apply_trigger: merge targets on push to main. +name: 'Label Base Deploy - Resolver' on: pull_request: @@ -15,12 +16,12 @@ permissions: pull-requests: write concurrency: - group: deploy-trigger-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }} + group: label-base-deploy-resolver-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: - deploy-trigger: - name: 'Deployment Trigger' + resolve: + name: 'Resolve Targets' runs-on: ubuntu-latest outputs: targets: ${{ steps.resolver.outputs.targets }} @@ -59,10 +60,10 @@ jobs: kubernetes-targets-group: name: 'Group Kubernetes Targets by Environment' - needs: deploy-trigger + needs: resolve if: | - needs.deploy-trigger.outputs.has-targets == 'true' && - contains(needs.deploy-trigger.outputs.targets, '"stack":"kubernetes"') + needs.resolve.outputs.has-targets == 'true' && + contains(needs.resolve.outputs.targets, '"stack":"kubernetes"') runs-on: ubuntu-latest outputs: environments: ${{ steps.group.outputs.environments }} @@ -70,7 +71,7 @@ jobs: - name: Group by environment id: group env: - TARGETS: ${{ needs.deploy-trigger.outputs.targets }} + TARGETS: ${{ needs.resolve.outputs.targets }} run: | set -euo pipefail grouped=$(echo "$TARGETS" | jq -c ' @@ -97,13 +98,13 @@ jobs: deploy-terragrunt: name: 'Deploy Terragrunt (${{ matrix.target.service }}:${{ matrix.target.environment }})' - needs: deploy-trigger + needs: resolve if: | - needs.deploy-trigger.outputs.has-targets == 'true' && - contains(needs.deploy-trigger.outputs.targets, '"stack":"terragrunt"') + needs.resolve.outputs.has-targets == 'true' && + contains(needs.resolve.outputs.targets, '"stack":"terragrunt"') strategy: matrix: - target: ${{ fromJson(needs.deploy-trigger.outputs.targets) }} + target: ${{ fromJson(needs.resolve.outputs.targets) }} exclude: - target: stack: terragrunt-shared @@ -122,13 +123,13 @@ jobs: deploy-kubernetes: name: 'Deploy Kubernetes (${{ matrix.target.service }}:${{ matrix.target.environment }})' - needs: [deploy-trigger, deploy-kubernetes-hydrate] + needs: [resolve, deploy-kubernetes-hydrate] if: | - needs.deploy-trigger.outputs.has-targets == 'true' && - contains(needs.deploy-trigger.outputs.targets, '"stack":"kubernetes"') + needs.resolve.outputs.has-targets == 'true' && + contains(needs.resolve.outputs.targets, '"stack":"kubernetes"') strategy: matrix: - target: ${{ fromJson(needs.deploy-trigger.outputs.targets) }} + target: ${{ fromJson(needs.resolve.outputs.targets) }} exclude: - target: stack: terragrunt @@ -145,8 +146,8 @@ jobs: deployment-summary: name: 'Deployment Summary' - needs: [deploy-trigger, deploy-terragrunt, deploy-kubernetes-hydrate, deploy-kubernetes] - if: always() && needs.deploy-trigger.outputs.has-targets == 'true' + needs: [resolve, deploy-terragrunt, deploy-kubernetes-hydrate, deploy-kubernetes] + if: always() && needs.resolve.outputs.has-targets == 'true' runs-on: ubuntu-latest steps: - name: Summary @@ -154,9 +155,9 @@ jobs: echo "📊 Deployment Summary" echo "Event: ${{ github.event_name }}" echo "Branch: ${{ github.ref_name }}" - echo "Environment: ${{ needs.deploy-trigger.outputs.target-environment }}" - echo "Safety Status: ${{ needs.deploy-trigger.outputs.safety-status }}" - echo "Targets: ${{ needs.deploy-trigger.outputs.targets }}" + echo "Environment: ${{ needs.resolve.outputs.target-environment }}" + echo "Safety Status: ${{ needs.resolve.outputs.safety-status }}" + echo "Targets: ${{ needs.resolve.outputs.targets }}" echo "Terragrunt Job Status: ${{ needs.deploy-terragrunt.result }}" echo "Kubernetes Job Status: ${{ needs.deploy-kubernetes.result }}" echo "Kubernetes Hydrate Job Status: ${{ needs.deploy-kubernetes-hydrate.result }}" diff --git a/.github/workflows/lint-actions.yml b/.github/workflows/lint-actions.yml index 5bfcfb87..9d7bb5ad 100644 --- a/.github/workflows/lint-actions.yml +++ b/.github/workflows/lint-actions.yml @@ -1,3 +1,4 @@ +# Checks that every action is pinned to a full commit SHA. name: Lint GitHub Actions on: diff --git a/.github/workflows/auto-release--trigger.yaml b/.github/workflows/release--deploy.yaml similarity index 90% rename from .github/workflows/auto-release--trigger.yaml rename to .github/workflows/release--deploy.yaml index a649273a..ff758128 100644 --- a/.github/workflows/auto-release--trigger.yaml +++ b/.github/workflows/release--deploy.yaml @@ -1,4 +1,5 @@ -name: 'Auto Release - Trigger' +# Applies a service's apply_trigger: release environments when its release is published or its tag is dispatched. +name: 'Release - Deploy' on: release: @@ -16,7 +17,7 @@ permissions: pull-requests: write concurrency: - group: auto-release-trigger-${{ github.event.release.tag_name || inputs.tag }} + group: release-deploy-${{ github.event.release.tag_name || inputs.tag }} cancel-in-progress: false jobs: diff --git a/.github/workflows/auto-release--plan.yaml b/.github/workflows/release--plan.yaml similarity index 91% rename from .github/workflows/auto-release--plan.yaml rename to .github/workflows/release--plan.yaml index 6da45010..c5cc0334 100644 --- a/.github/workflows/auto-release--plan.yaml +++ b/.github/workflows/release--plan.yaml @@ -1,4 +1,5 @@ -name: 'Auto Release - Plan' +# Plans a service's apply_trigger: release environments on its release-please pull request. +name: 'Release - Plan' on: pull_request: @@ -10,7 +11,7 @@ permissions: pull-requests: write concurrency: - group: auto-release-plan-${{ github.head_ref }} + group: release-plan-${{ github.head_ref }} cancel-in-progress: true jobs: diff --git a/.github/workflows/release.yml b/.github/workflows/release--please.yaml similarity index 91% rename from .github/workflows/release.yml rename to .github/workflows/release--please.yaml index 05beb1ea..abd973bb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release--please.yaml @@ -1,4 +1,5 @@ -name: Release +# Runs release-please for each aws/{service} config to open release pull requests and publish releases. +name: 'Release - Please' on: push: diff --git a/.github/workflows/renovate-major-review.yaml b/.github/workflows/renovate-major-review.yaml index c58f1d33..a1d24a84 100644 --- a/.github/workflows/renovate-major-review.yaml +++ b/.github/workflows/renovate-major-review.yaml @@ -1,3 +1,4 @@ +# Reviews Renovate major-update pull requests with Claude on Bedrock and posts the review. name: 'Renovate Major Review' on: diff --git a/.github/workflows/reusable--kubernetes-builder.yaml b/.github/workflows/reusable--kubernetes-builder.yaml index 1acedd57..816e6168 100644 --- a/.github/workflows/reusable--kubernetes-builder.yaml +++ b/.github/workflows/reusable--kubernetes-builder.yaml @@ -1,3 +1,4 @@ +# Posts the kustomize diff of one hydrated component as a pull request comment. name: 'Reusable - Kubernetes Builder' on: diff --git a/.github/workflows/reusable--kubernetes-hydrator.yaml b/.github/workflows/reusable--kubernetes-hydrator.yaml index 8e3f83ac..3f6d2b70 100644 --- a/.github/workflows/reusable--kubernetes-hydrator.yaml +++ b/.github/workflows/reusable--kubernetes-hydrator.yaml @@ -1,3 +1,4 @@ +# Renders the given components into kubernetes/manifests and commits the result to the pull request branch. name: 'Reusable - Kubernetes Hydrator' on: diff --git a/.github/workflows/reusable--terragrunt-executor.yaml b/.github/workflows/reusable--terragrunt-executor.yaml index 24d7d7be..41c451e5 100644 --- a/.github/workflows/reusable--terragrunt-executor.yaml +++ b/.github/workflows/reusable--terragrunt-executor.yaml @@ -1,3 +1,4 @@ +# Runs terragrunt plan or apply in one working directory and reports the result with tfcmt. name: 'Reusable - Terragrunt Executor' on: diff --git a/.github/workflows/semantic-pull-request.yml b/.github/workflows/semantic-pull-request.yml index aced0ebb..a9393ed5 100644 --- a/.github/workflows/semantic-pull-request.yml +++ b/.github/workflows/semantic-pull-request.yml @@ -1,3 +1,4 @@ +# Validates that the pull request title follows Conventional Commits. name: Semantic Pull Request on: diff --git a/.github/workflows/test-terragrunt-release.yaml b/.github/workflows/test-terragrunt-release.yaml index 50beaac2..414f8aea 100644 --- a/.github/workflows/test-terragrunt-release.yaml +++ b/.github/workflows/test-terragrunt-release.yaml @@ -1,3 +1,4 @@ +# Tests the terragrunt release scripts and validates workflow-config.yaml and the release-please configs. name: Test Terragrunt Release on: diff --git a/README-ja.md b/README-ja.md index 1adea03e..48775298 100644 --- a/README-ja.md +++ b/README-ja.md @@ -37,14 +37,14 @@ | Event | Workflow | Terragrunt | |-------|----------|------------| -| PR に `deploy:{service}` ラベルが付く | [auto-label--deploy-trigger.yaml](.github/workflows/auto-label--deploy-trigger.yaml) | すべての target を plan | -| `main` への push | [auto-label--deploy-trigger.yaml](.github/workflows/auto-label--deploy-trigger.yaml) | `apply_trigger: merge` の target を apply | -| release PR の作成・更新 | [auto-release--plan.yaml](.github/workflows/auto-release--plan.yaml) | その service の `apply_trigger: release` の environment を plan | -| release の公開 | [auto-release--trigger.yaml](.github/workflows/auto-release--trigger.yaml) | その service の `apply_trigger: release` の environment を apply | +| PR に `deploy:{service}` ラベルが付く | [label-base-deploy--resolver.yaml](.github/workflows/label-base-deploy--resolver.yaml) | すべての target を plan | +| `main` への push | [label-base-deploy--resolver.yaml](.github/workflows/label-base-deploy--resolver.yaml) | `apply_trigger: merge` の target を apply | +| release PR の作成・更新 | [release--plan.yaml](.github/workflows/release--plan.yaml) | その service の `apply_trigger: release` の environment を plan | +| release の公開 | [release--deploy.yaml](.github/workflows/release--deploy.yaml) | その service の `apply_trigger: release` の environment を apply | #### Targets -- PR の作成・更新時に、[auto-label--label-dispatcher.yaml](.github/workflows/auto-label--label-dispatcher.yaml) が `deploy:{service}` ラベルを付ける。release-please の branch にはラベルを付けない。 +- PR の作成・更新時に、[label-base-deploy--dispatcher.yaml](.github/workflows/label-base-deploy--dispatcher.yaml) が `deploy:{service}` ラベルを付ける。release-please の branch にはラベルを付けない。 - module や `root.hcl` を含め、`aws/{service}/` 配下のどの変更でもラベルが付く。 - `label-resolver` が [workflow-config.yaml](workflow-config.yaml) を使って、ラベルをその service の全 environment に展開する。 - `terragrunt` stack の `exclude` に一致する `{service}/{environment}` の組は、release も含めて plan も apply もされない。 @@ -56,8 +56,8 @@ - 設定がないと [check-release-configs.sh](.github/scripts/terragrunt-release/check-release-configs.sh) が CI を失敗させる。 - `apply_trigger: merge` の environment ディレクトリだけを変える commit は、release を作らない(`exclude-paths`)。 - `apply_trigger: release` の environment がすべて除外されている間も release PR は作られるが、plan も apply もされない。 -- plan を出し直すときは、`auto-release--plan` の run で「Re-run all jobs」を使う。 -- apply を再実行するときは、`gh workflow run auto-release--trigger.yaml --ref {service}-vX.Y.Z -f tag={service}-vX.Y.Z` を実行する。 +- plan を出し直すときは、`Release - Plan` の run で「Re-run all jobs」を使う。 +- apply を再実行するときは、`gh workflow run release--deploy.yaml --ref {service}-vX.Y.Z -f tag={service}-vX.Y.Z` を実行する。 ### Stacks @@ -86,8 +86,8 @@ flowchart LR end subgraph Labeling - Dispatcher[auto-label--label-dispatcher
panicboat/deploy-actions/label-dispatcher] - Trigger[auto-label--deploy-trigger
on: pull_request labeled] + Dispatcher[label-base-deploy--dispatcher
panicboat/deploy-actions/label-dispatcher] + Trigger[label-base-deploy--resolver
on: pull_request labeled] Resolver[label-resolver] end @@ -101,7 +101,7 @@ flowchart LR end subgraph Terragrunt - ReleaseTrigger[auto-release--trigger] + ReleaseTrigger[release--deploy] TG[reusable--terragrunt-executor] Plan[terragrunt plan] Apply[terragrunt apply] diff --git a/README.md b/README.md index e3c6da66..b13a7ab8 100644 --- a/README.md +++ b/README.md @@ -37,14 +37,14 @@ A PR labeled by `panicboat/deploy-actions` is resolved against [workflow-config. | Event | Workflow | Terragrunt | |-------|----------|------------| -| `deploy:{service}` label added to a PR | [auto-label--deploy-trigger.yaml](.github/workflows/auto-label--deploy-trigger.yaml) | plan every target | -| Push to `main` | [auto-label--deploy-trigger.yaml](.github/workflows/auto-label--deploy-trigger.yaml) | apply targets with `apply_trigger: merge` | -| Release PR opened / updated | [auto-release--plan.yaml](.github/workflows/auto-release--plan.yaml) | plan the service's `apply_trigger: release` environments | -| Release published | [auto-release--trigger.yaml](.github/workflows/auto-release--trigger.yaml) | apply the service's `apply_trigger: release` environments | +| `deploy:{service}` label added to a PR | [label-base-deploy--resolver.yaml](.github/workflows/label-base-deploy--resolver.yaml) | plan every target | +| Push to `main` | [label-base-deploy--resolver.yaml](.github/workflows/label-base-deploy--resolver.yaml) | apply targets with `apply_trigger: merge` | +| Release PR opened / updated | [release--plan.yaml](.github/workflows/release--plan.yaml) | plan the service's `apply_trigger: release` environments | +| Release published | [release--deploy.yaml](.github/workflows/release--deploy.yaml) | apply the service's `apply_trigger: release` environments | #### Targets -- [auto-label--label-dispatcher.yaml](.github/workflows/auto-label--label-dispatcher.yaml) adds `deploy:{service}` to a PR when it is opened or updated; release-please branches get no label. +- [label-base-deploy--dispatcher.yaml](.github/workflows/label-base-deploy--dispatcher.yaml) adds `deploy:{service}` to a PR when it is opened or updated; release-please branches get no label. - Any change under `aws/{service}/`, including modules and `root.hcl`, adds the label. - `label-resolver` expands the label into every environment of that service using [workflow-config.yaml](workflow-config.yaml). - A `{service}/{environment}` pair matched by `exclude` of the `terragrunt` stack is never planned or applied, including by releases. @@ -56,8 +56,8 @@ A PR labeled by `panicboat/deploy-actions` is resolved against [workflow-config. - [check-release-configs.sh](.github/scripts/terragrunt-release/check-release-configs.sh) fails CI when a config is missing. - Commits that touch only `apply_trigger: merge` environment directories do not create a release (`exclude-paths`). - While every `apply_trigger: release` environment is excluded, the release PR is still created, but nothing is planned or applied. -- To re-plan, use "Re-run all jobs" on the `auto-release--plan` run. -- To re-apply, run `gh workflow run auto-release--trigger.yaml --ref {service}-vX.Y.Z -f tag={service}-vX.Y.Z`. +- To re-plan, use "Re-run all jobs" on the `Release - Plan` run. +- To re-apply, run `gh workflow run release--deploy.yaml --ref {service}-vX.Y.Z -f tag={service}-vX.Y.Z`. ### Stacks @@ -86,8 +86,8 @@ flowchart LR end subgraph Labeling - Dispatcher[auto-label--label-dispatcher
panicboat/deploy-actions/label-dispatcher] - Trigger[auto-label--deploy-trigger
on: pull_request labeled] + Dispatcher[label-base-deploy--dispatcher
panicboat/deploy-actions/label-dispatcher] + Trigger[label-base-deploy--resolver
on: pull_request labeled] Resolver[label-resolver] end @@ -101,7 +101,7 @@ flowchart LR end subgraph Terragrunt - ReleaseTrigger[auto-release--trigger] + ReleaseTrigger[release--deploy] TG[reusable--terragrunt-executor] Plan[terragrunt plan] Apply[terragrunt apply]