From 1b5ca5dd661855498d542fb53b6161908a515dda Mon Sep 17 00:00:00 2001 From: Carlos Vigo Date: Mon, 23 Mar 2026 19:27:53 +0100 Subject: [PATCH 1/2] fix(ci): merge smoke-test release phase 2 into repository dispatch Run release.yml while release/ still exists, then enable auto-merge and poll for merge. Remove on-release-pr-merge.yml. Refs: #419 --- CHANGELOG.md | 3 + .../.github/workflows/on-release-pr-merge.yml | 232 ------------------ .../.github/workflows/repository-dispatch.yml | 143 ++++++++++- assets/workspace/.devcontainer/CHANGELOG.md | 3 + tests/bats/just.bats | 43 ++-- 5 files changed, 162 insertions(+), 262 deletions(-) delete mode 100644 assets/smoke-test/.github/workflows/on-release-pr-merge.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 3463258..48a94ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,6 +91,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Sync-main-to-dev conflict detection uses merge-tree** ([#410](https://github.com/vig-os/devcontainer/issues/410)) - Replace working-tree trial merge with `git merge-tree --write-tree` so clean merges are not mislabeled as conflicts - Enable auto-merge when dev merges cleanly with main; print merge-tree output on conflicts; fail the step on unexpected errors +- **Smoke-test release phase 2 branch-not-found failure** ([#419](https://github.com/vig-os/devcontainer/issues/419)) + - Merge phase 2 (`on-release-pr-merge.yml`) back into `repository-dispatch.yml` so the release runs while `release/` still exists, matching the normal release flow + - Remove `on-release-pr-merge.yml` from the smoke-test template - **Release finalization now commits generated docs and refreshes PR content** ([#300](https://github.com/vig-os/devcontainer/issues/300)) - Final release automation regenerates docs before committing so pre-commit `generate-docs` does not fail CI with tracked file diffs diff --git a/assets/smoke-test/.github/workflows/on-release-pr-merge.yml b/assets/smoke-test/.github/workflows/on-release-pr-merge.yml deleted file mode 100644 index 764bb95..0000000 --- a/assets/smoke-test/.github/workflows/on-release-pr-merge.yml +++ /dev/null @@ -1,232 +0,0 @@ -name: Trigger release from merged release PR -# -# Purpose: -# - Continue smoke-test orchestration after the release PR is merged to main. -# - Dispatch release.yml and wait for completion. -# - Notify upstream if this second phase fails. -# -# NOTE: This workflow is part of the smoke-test template under assets/smoke-test -# and must be manually deployed/promoted in the downstream repo before use. - -on: # yamllint disable-line rule:truthy - pull_request: - types: [closed] - branches: [main] - -concurrency: - group: smoke-test-release-phase2-${{ github.event.pull_request.number || github.run_id }} - cancel-in-progress: false - -permissions: - contents: read - -env: - WORKFLOW_REF: dev - -jobs: - validate: - name: Validate merged release PR event - if: >- - github.event.pull_request.merged == true && - startsWith(github.event.pull_request.head.ref, 'release/') - runs-on: ubuntu-22.04 - timeout-minutes: 5 - outputs: - version: ${{ steps.extract.outputs.version }} - release_kind: ${{ steps.extract.outputs.release_kind }} - release_pr_url: ${{ steps.extract.outputs.release_pr_url }} - release_pr_number: ${{ steps.extract.outputs.release_pr_number }} - steps: - - name: Extract version and release kind - id: extract - env: - HEAD_REF: ${{ github.event.pull_request.head.ref }} - PR_URL: ${{ github.event.pull_request.html_url }} - PR_NUMBER: ${{ github.event.pull_request.number }} - run: | - set -euo pipefail - VERSION="${HEAD_REF#release/}" - if [ "${VERSION}" = "${HEAD_REF}" ]; then - echo "ERROR: expected release/* head ref, got '${HEAD_REF}'" - exit 1 - fi - if ! printf '%s' "${VERSION}" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then - echo "ERROR: invalid release version parsed from head ref '${HEAD_REF}'" - exit 1 - fi - - RELEASE_KIND="" - if jq -e '.pull_request.labels[]? | select(.name=="release-kind:final")' "${GITHUB_EVENT_PATH}" >/dev/null; then - RELEASE_KIND="final" - elif jq -e '.pull_request.labels[]? | select(.name=="release-kind:candidate")' "${GITHUB_EVENT_PATH}" >/dev/null; then - RELEASE_KIND="candidate" - else - echo "ERROR: missing required release-kind label (expected 'release-kind:final' or 'release-kind:candidate')" - exit 1 - fi - - echo "version=${VERSION}" >> "${GITHUB_OUTPUT}" - echo "release_kind=${RELEASE_KIND}" >> "${GITHUB_OUTPUT}" - echo "release_pr_url=${PR_URL}" >> "${GITHUB_OUTPUT}" - echo "release_pr_number=${PR_NUMBER}" >> "${GITHUB_OUTPUT}" - - trigger-release: - name: Trigger and wait for release workflow - runs-on: ubuntu-22.04 - timeout-minutes: 35 - env: - GH_REPO: ${{ github.repository }} - needs: [validate] - outputs: - before_run_id: ${{ steps.capture_release_before.outputs.before_run_id }} - steps: - - name: Generate release app token for release workflow dispatch - id: generate_release_token - uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - owner: ${{ github.repository_owner }} - repositories: ${{ github.event.repository.name }} - - - name: Capture latest release run id - id: capture_release_before - env: - GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} - run: | - set -euo pipefail - BEFORE_RUN_ID="$( - gh run list --workflow release.yml --branch "${WORKFLOW_REF}" --limit 1 --json databaseId --jq '.[0].databaseId // 0' 2>/dev/null || echo 0 - )" - echo "before_run_id=${BEFORE_RUN_ID}" >> "${GITHUB_OUTPUT}" - - - name: Trigger release workflow - env: - GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} - VERSION: ${{ needs.validate.outputs.version }} - RELEASE_KIND: ${{ needs.validate.outputs.release_kind }} - run: | - set -euo pipefail - gh workflow run release.yml \ - --ref "${WORKFLOW_REF}" \ - -f version="${VERSION}" \ - -f release-kind="${RELEASE_KIND}" - - - name: Wait for release workflow completion - env: - GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} - BEFORE_RUN_ID: ${{ steps.capture_release_before.outputs.before_run_id }} - run: | - set -euo pipefail - TIMEOUT=1800 - INTERVAL=30 - ELAPSED=0 - - while [ "${ELAPSED}" -lt "${TIMEOUT}" ]; do - RUN_ID="$(gh run list --workflow release.yml --branch "${WORKFLOW_REF}" --limit 1 --json databaseId --jq '.[0].databaseId // empty' 2>/dev/null || true)" - if [ -n "${RUN_ID}" ] && [ "${RUN_ID}" -gt "${BEFORE_RUN_ID}" ]; then - STATUS="$(gh run view "${RUN_ID}" --json status --jq '.status' 2>/dev/null || echo unknown)" - if [ "${STATUS}" = "completed" ]; then - CONCLUSION="$(gh run view "${RUN_ID}" --json conclusion --jq '.conclusion' 2>/dev/null || echo unknown)" - if [ "${CONCLUSION}" != "success" ]; then - echo "ERROR: release workflow concluded with '${CONCLUSION}'" - exit 1 - fi - echo "release workflow completed successfully" - exit 0 - fi - fi - - sleep "${INTERVAL}" - ELAPSED=$((ELAPSED + INTERVAL)) - echo "Waiting for release workflow... (${ELAPSED}s/${TIMEOUT}s)" - done - - echo "ERROR: timed out waiting for release workflow completion" - exit 1 - - summary: - name: Release phase 2 summary - runs-on: ubuntu-22.04 - timeout-minutes: 5 - needs: - - validate - - trigger-release - if: always() && needs.validate.result != 'skipped' - steps: - - name: Check release phase 2 results - run: | - echo "Release Phase 2 Results Summary" - echo "===============================" - echo "" - echo "Validate: ${{ needs.validate.result }}" - echo "Release: ${{ needs.trigger-release.result }}" - echo "Release PR: ${{ needs.validate.outputs.release_pr_url }}" - echo "" - - FAILED=false - if [ "${{ needs.validate.result }}" != "success" ]; then - echo "ERROR: validation failed" - FAILED=true - fi - if [ "${{ needs.trigger-release.result }}" != "success" ]; then - echo "ERROR: release workflow orchestration failed" - FAILED=true - fi - if [ "${FAILED}" = "true" ]; then - exit 1 - fi - - notify-failure: - name: Notify upstream on smoke-test release phase 2 failure - runs-on: ubuntu-22.04 - timeout-minutes: 5 - if: failure() && needs.validate.result != 'skipped' - needs: - - validate - - trigger-release - - summary - steps: - - name: Generate release app token for upstream issue creation - id: generate_release_token - uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3 - with: - app-id: ${{ secrets.RELEASE_APP_ID }} - private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} - owner: vig-os - repositories: devcontainer - - - name: Create upstream failure issue - env: - GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} - VERSION: ${{ needs.validate.outputs.version }} - RELEASE_KIND: ${{ needs.validate.outputs.release_kind }} - RELEASE_PR_URL: ${{ needs.validate.outputs.release_pr_url }} - run: | - set -euo pipefail - WORKFLOW_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" - - ISSUE_BODY="$( - cat </dev/null 2>&1 || true gh pr edit "${PR_NUMBER}" --add-label "${LABEL}" + trigger-release: + name: Trigger and wait for release workflow + runs-on: ubuntu-22.04 + timeout-minutes: 35 + env: + GH_REPO: ${{ github.repository }} + needs: [validate, ready-release-pr] + outputs: + before_run_id: ${{ steps.capture_release_before.outputs.before_run_id }} + steps: + - name: Generate release app token for release workflow dispatch + id: generate_release_token + uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3 + with: + app-id: ${{ secrets.RELEASE_APP_ID }} + private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + repositories: ${{ github.event.repository.name }} + + - name: Capture latest release run id + id: capture_release_before + env: + GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} + run: | + set -euo pipefail + BEFORE_RUN_ID="$( + gh run list --workflow release.yml --branch "${WORKFLOW_REF}" --limit 1 --json databaseId --jq '.[0].databaseId // 0' 2>/dev/null || echo 0 + )" + echo "before_run_id=${BEFORE_RUN_ID}" >> "${GITHUB_OUTPUT}" + + - name: Trigger release workflow + env: + GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} + BASE_VERSION: ${{ needs.validate.outputs.base_version }} + RELEASE_KIND: ${{ needs.validate.outputs.release_kind }} + run: | + set -euo pipefail + gh workflow run release.yml \ + --ref "${WORKFLOW_REF}" \ + -f version="${BASE_VERSION}" \ + -f release-kind="${RELEASE_KIND}" + + - name: Wait for release workflow completion + env: + GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} + BEFORE_RUN_ID: ${{ steps.capture_release_before.outputs.before_run_id }} + run: | + set -euo pipefail + TIMEOUT=1800 + INTERVAL=30 + ELAPSED=0 + + while [ "${ELAPSED}" -lt "${TIMEOUT}" ]; do + RUN_ID="$(gh run list --workflow release.yml --branch "${WORKFLOW_REF}" --limit 1 --json databaseId --jq '.[0].databaseId // empty' 2>/dev/null || true)" + if [ -n "${RUN_ID}" ] && [ "${RUN_ID}" -gt "${BEFORE_RUN_ID}" ]; then + STATUS="$(gh run view "${RUN_ID}" --json status --jq '.status' 2>/dev/null || echo unknown)" + if [ "${STATUS}" = "completed" ]; then + CONCLUSION="$(gh run view "${RUN_ID}" --json conclusion --jq '.conclusion' 2>/dev/null || echo unknown)" + if [ "${CONCLUSION}" != "success" ]; then + echo "ERROR: release workflow concluded with '${CONCLUSION}'" + exit 1 + fi + echo "release workflow completed successfully" + exit 0 + fi + fi + + sleep "${INTERVAL}" + ELAPSED=$((ELAPSED + INTERVAL)) + echo "Waiting for release workflow... (${ELAPSED}s/${TIMEOUT}s)" + done + + echo "ERROR: timed out waiting for release workflow completion" + exit 1 + + merge-release-pr: + name: Enable auto-merge and wait for release PR merge + runs-on: ubuntu-22.04 + timeout-minutes: 35 + needs: [ready-release-pr, trigger-release] + steps: + - name: Generate release app token for PR merge + id: generate_release_token + uses: actions/create-github-app-token@f8d387b68d61c58ab83c6c016672934102569859 # v3 + with: + app-id: ${{ secrets.RELEASE_APP_ID }} + private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }} + owner: ${{ github.repository_owner }} + repositories: ${{ github.event.repository.name }} + - name: Enable release PR auto-merge env: GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} - PR_NUMBER: ${{ steps.locate_release_pr.outputs.release_pr }} + PR_NUMBER: ${{ needs.ready-release-pr.outputs.release_pr }} run: | set -euo pipefail gh pr merge "${PR_NUMBER}" --auto --merge || \ echo "Warning: could not enable auto-merge yet" + - name: Poll release PR merge status + env: + GH_TOKEN: ${{ steps.generate_release_token.outputs.token }} + PR_URL: ${{ needs.ready-release-pr.outputs.release_pr_url }} + run: | + set -euo pipefail + if [ -z "${PR_URL}" ]; then + echo "ERROR: missing release PR URL" + exit 1 + fi + + TIMEOUT=1800 + INTERVAL=30 + ELAPSED=0 + + while [ "${ELAPSED}" -lt "${TIMEOUT}" ]; do + STATE="$(gh pr view "${PR_URL}" --json state --jq '.state' 2>/dev/null || echo unknown)" + if [ "${STATE}" = "MERGED" ]; then + echo "Release PR merged: ${PR_URL}" + exit 0 + fi + if [ "${STATE}" = "CLOSED" ]; then + echo "ERROR: release PR closed without merge: ${PR_URL}" + exit 1 + fi + sleep "${INTERVAL}" + ELAPSED=$((ELAPSED + INTERVAL)) + echo "Waiting for release PR merge... (${ELAPSED}s/${TIMEOUT}s)" + done + + echo "ERROR: timed out waiting for release PR merge" + exit 1 + summary: name: Dispatch summary runs-on: ubuntu-22.04 @@ -565,6 +688,8 @@ jobs: - cleanup-release - trigger-prepare-release - ready-release-pr + - trigger-release + - merge-release-pr if: always() steps: - name: Write source context summary @@ -600,6 +725,8 @@ jobs: echo "Cleanup: ${{ needs.cleanup-release.result }}" echo "Prepare: ${{ needs.trigger-prepare-release.result }}" echo "Release PR: ${{ needs.ready-release-pr.result }}" + echo "Release run: ${{ needs.trigger-release.result }}" + echo "Release merge: ${{ needs.merge-release-pr.result }}" echo "Deploy PR: ${{ needs.deploy.outputs.pr_url }}" echo "Release PR: ${{ needs.ready-release-pr.outputs.release_pr_url }}" echo "" @@ -636,6 +763,16 @@ jobs: FAILED=true fi + if [ "${{ needs.trigger-release.result }}" != "success" ]; then + echo "ERROR: Trigger-release job failed" + FAILED=true + fi + + if [ "${{ needs.merge-release-pr.result }}" != "success" ]; then + echo "ERROR: Merge-release-pr job failed" + FAILED=true + fi + if [ "${FAILED}" = "true" ]; then echo "" echo "Dispatch orchestration failed" @@ -657,6 +794,8 @@ jobs: - cleanup-release - trigger-prepare-release - ready-release-pr + - trigger-release + - merge-release-pr - summary steps: - name: Generate release app token for upstream issue creation @@ -711,6 +850,8 @@ jobs: - cleanup-release: \`${{ needs.cleanup-release.result }}\` - trigger-prepare-release: \`${{ needs.trigger-prepare-release.result }}\` - ready-release-pr: \`${{ needs.ready-release-pr.result }}\` + - trigger-release: \`${{ needs.trigger-release.result }}\` + - merge-release-pr: \`${{ needs.merge-release-pr.result }}\` - summary: \`${{ needs.summary.result }}\` ## Manual cleanup guidance diff --git a/assets/workspace/.devcontainer/CHANGELOG.md b/assets/workspace/.devcontainer/CHANGELOG.md index 3463258..48a94ab 100644 --- a/assets/workspace/.devcontainer/CHANGELOG.md +++ b/assets/workspace/.devcontainer/CHANGELOG.md @@ -91,6 +91,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Sync-main-to-dev conflict detection uses merge-tree** ([#410](https://github.com/vig-os/devcontainer/issues/410)) - Replace working-tree trial merge with `git merge-tree --write-tree` so clean merges are not mislabeled as conflicts - Enable auto-merge when dev merges cleanly with main; print merge-tree output on conflicts; fail the step on unexpected errors +- **Smoke-test release phase 2 branch-not-found failure** ([#419](https://github.com/vig-os/devcontainer/issues/419)) + - Merge phase 2 (`on-release-pr-merge.yml`) back into `repository-dispatch.yml` so the release runs while `release/` still exists, matching the normal release flow + - Remove `on-release-pr-merge.yml` from the smoke-test template - **Release finalization now commits generated docs and refreshes PR content** ([#300](https://github.com/vig-os/devcontainer/issues/300)) - Final release automation regenerates docs before committing so pre-commit `generate-docs` does not fail CI with tracked file diffs diff --git a/tests/bats/just.bats b/tests/bats/just.bats index 9d5d041..c05b71f 100644 --- a/tests/bats/just.bats +++ b/tests/bats/just.bats @@ -115,53 +115,38 @@ setup() { assert_success } -@test "smoke-test phase 2 wait logic tracks release run after dispatch" { - run bash -lc 'grep -Fq -- "Capture latest release run id" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "gh run list --workflow release.yml --branch \"\${WORKFLOW_REF}\"" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "BEFORE_RUN_ID: \${{ steps.capture_release_before.outputs.before_run_id }}" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "[ \"\${RUN_ID}\" -gt \"\${BEFORE_RUN_ID}\" ]" assets/smoke-test/.github/workflows/on-release-pr-merge.yml' +@test "smoke-test dispatch wait logic tracks release run after dispatch" { + run bash -lc 'grep -Fq -- "Capture latest release run id" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "gh run list --workflow release.yml --branch \"\${WORKFLOW_REF}\"" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "BEFORE_RUN_ID: \${{ steps.capture_release_before.outputs.before_run_id }}" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "[ \"\${RUN_ID}\" -gt \"\${BEFORE_RUN_ID}\" ]" assets/smoke-test/.github/workflows/repository-dispatch.yml' assert_success } -@test "smoke-test dispatch readies release PR with release kind label and auto-merge" { - run bash -lc 'grep -Fq -- "gh pr ready" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "release-kind:candidate" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "gh pr merge" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "--auto --merge" assets/smoke-test/.github/workflows/repository-dispatch.yml' +@test "smoke-test dispatch triggers release workflow with base version and release kind" { + run bash -lc 'grep -Fq -- "gh workflow run release.yml \\" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "-f version=\"\${BASE_VERSION}\"" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "-f release-kind=\"\${RELEASE_KIND}\"" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "needs: [validate, ready-release-pr]" assets/smoke-test/.github/workflows/repository-dispatch.yml' assert_success } -@test "smoke-test dispatch tolerates transient auto-merge enable failures" { - run bash -lc 'grep -Fq -- "Warning: could not enable auto-merge yet" assets/smoke-test/.github/workflows/repository-dispatch.yml' - assert_success -} - -@test "smoke-test dispatch notifies upstream on orchestration failure" { - run bash -lc "grep -Fq -- 'notify-failure:' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'gh issue create \\' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- '--repo vig-os/devcontainer' assets/smoke-test/.github/workflows/repository-dispatch.yml" +@test "smoke-test dispatch merges release PR after successful release workflow" { + run bash -lc 'grep -Fq -- "merge-release-pr:" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "Poll release PR merge status" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "Waiting for release PR merge" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "needs: [ready-release-pr, trigger-release]" assets/smoke-test/.github/workflows/repository-dispatch.yml' assert_success } -@test "smoke-test dispatch summary includes release-orchestration job results" { - run bash -lc "grep -Fq -- 'needs.wait-deploy-merge.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.cleanup-release.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.trigger-prepare-release.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.ready-release-pr.result' assets/smoke-test/.github/workflows/repository-dispatch.yml" +@test "smoke-test dispatch readies release PR with release kind label" { + run bash -lc 'grep -Fq -- "gh pr ready" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "release-kind:candidate" assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- "Label release PR with release kind" assets/smoke-test/.github/workflows/repository-dispatch.yml' assert_success } -@test "smoke-test phase 2 triggers on merged release PR to main" { - run bash -lc 'grep -Fq -- "types: [closed]" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "branches: [main]" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "github.event.pull_request.merged == true" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "startsWith(github.event.pull_request.head.ref, '\''release/'\'')" assets/smoke-test/.github/workflows/on-release-pr-merge.yml' - assert_success -} - -@test "smoke-test phase 2 extracts semver version from release head ref" { - run bash -lc 'grep -Fq -- "VERSION=\"\${HEAD_REF#release/}\"" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "invalid release version parsed from head ref" assets/smoke-test/.github/workflows/on-release-pr-merge.yml' - assert_success -} - -@test "smoke-test phase 2 fails when release-kind label is missing" { - run bash -lc 'grep -Fq -- "ERROR: missing required release-kind label" assets/smoke-test/.github/workflows/on-release-pr-merge.yml' +@test "smoke-test dispatch tolerates transient auto-merge enable failures" { + run bash -lc 'grep -Fq -- "Warning: could not enable auto-merge yet" assets/smoke-test/.github/workflows/repository-dispatch.yml' assert_success } -@test "smoke-test phase 2 dispatches release workflow with version inputs" { - run bash -lc 'grep -Fq -- "gh workflow run release.yml \\" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "-f version=\"\${VERSION}\"" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "-f release-kind=\"\${RELEASE_KIND}\"" assets/smoke-test/.github/workflows/on-release-pr-merge.yml' +@test "smoke-test dispatch notifies upstream on orchestration failure" { + run bash -lc "grep -Fq -- 'notify-failure:' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'gh issue create \\' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- '--repo vig-os/devcontainer' assets/smoke-test/.github/workflows/repository-dispatch.yml" assert_success } -@test "smoke-test phase 2 notifies upstream on failure" { - run bash -lc 'grep -Fq -- "notify-failure:" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "gh issue create \\" assets/smoke-test/.github/workflows/on-release-pr-merge.yml && grep -Fq -- "--repo vig-os/devcontainer" assets/smoke-test/.github/workflows/on-release-pr-merge.yml' +@test "smoke-test dispatch summary includes release-orchestration job results" { + run bash -lc "grep -Fq -- 'needs.wait-deploy-merge.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.cleanup-release.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.trigger-prepare-release.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.ready-release-pr.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.trigger-release.result' assets/smoke-test/.github/workflows/repository-dispatch.yml && grep -Fq -- 'needs.merge-release-pr.result' assets/smoke-test/.github/workflows/repository-dispatch.yml" assert_success } From bc214ea5c19b9d8c8d7b429644359a06765ca757 Mon Sep 17 00:00:00 2001 From: Carlos Vigo Date: Mon, 23 Mar 2026 20:04:38 +0100 Subject: [PATCH 2/2] fix(ci): align merge-release-pr gh env and drop unused trigger-release output Refs: #419 --- assets/smoke-test/.github/workflows/repository-dispatch.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/smoke-test/.github/workflows/repository-dispatch.yml b/assets/smoke-test/.github/workflows/repository-dispatch.yml index c956203..3d5e38a 100644 --- a/assets/smoke-test/.github/workflows/repository-dispatch.yml +++ b/assets/smoke-test/.github/workflows/repository-dispatch.yml @@ -552,8 +552,6 @@ jobs: env: GH_REPO: ${{ github.repository }} needs: [validate, ready-release-pr] - outputs: - before_run_id: ${{ steps.capture_release_before.outputs.before_run_id }} steps: - name: Generate release app token for release workflow dispatch id: generate_release_token @@ -624,6 +622,8 @@ jobs: name: Enable auto-merge and wait for release PR merge runs-on: ubuntu-22.04 timeout-minutes: 35 + env: + GH_REPO: ${{ github.repository }} needs: [ready-release-pr, trigger-release] steps: - name: Generate release app token for PR merge