From 6003e7a7628c867d59db157fc3fb48b9ff39441e Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 6 Jul 2026 14:45:11 -0700 Subject: [PATCH 1/6] tests: always trigger gapic specialized tests --- .github/workflows/gapic-generator-tests.yml | 23 +++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index f6a47939fc64..d5ee26a7202b 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -2,13 +2,8 @@ name: Gapic Generator Specialized Tests on: pull_request: - paths: - - 'packages/gapic-generator/**' - - '.github/workflows/gapic-generator-tests.yml' push: branches: [main] - paths: - - 'packages/gapic-generator/**' concurrency: group: gapic-gen-${{ github.head_ref || github.run_id }} @@ -27,11 +22,8 @@ env: PYO3_USE_ABI3_FORWARD_COMPATIBILITY: "1" jobs: + # Check if the gapic-generator was changed. If so, execute specialized tests check_changes: - # We use a job-level 'if' with dorny/paths-filter because GitHub's top-level - # 'on: pull_request: paths' can be bypassed during repository-wide migrations - # or structural changes. This ensures these specialized (and heavy) matrix - # jobs stay silent on PRs that do not touch the generator. runs-on: ubuntu-latest outputs: run_generator: ${{ steps.filter.outputs.generator }} @@ -224,3 +216,16 @@ jobs: # WORKSPACE file is located there. cd packages/gapic-generator bazelisk test //tests/integration/... --test_output=errors + + # Final job to simplify branch protection rules. + # This job will be reported as 'Success' if all its dependencies either + # pass or are skipped due to path filtering. + status: + needs: [check_changes, python_config, showcase-unit, showcase-mypy, goldens, goldens-prerelease, fragment-snippet, integration] + if: always() + runs-on: ubuntu-latest + steps: + - name: Check all jobs for failure + if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') + run: exit 1 + From 2b076c627863ec51c180f1b518193b211daa0498 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 6 Jul 2026 16:56:33 -0700 Subject: [PATCH 2/6] improved status check --- .github/workflows/gapic-generator-tests.yml | 25 +++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index d5ee26a7202b..fbf9d1283bc3 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -226,6 +226,27 @@ jobs: runs-on: ubuntu-latest steps: - name: Check all jobs for failure - if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') - run: exit 1 + run: | + echo "check_changes result: ${{ needs.check_changes.result }}" + echo "python_config result: ${{ needs.python_config.result }}" + echo "showcase-unit result: ${{ needs.showcase-unit.result }}" + echo "showcase-mypy result: ${{ needs.showcase-mypy.result }}" + echo "goldens result: ${{ needs.goldens.result }}" + echo "goldens-prerelease result: ${{ needs.goldens-prerelease.result }}" + echo "fragment-snippet result: ${{ needs.fragment-snippet.result }}" + echo "integration result: ${{ needs.integration.result }}" + + # Fail if any of the dependencies failed or were cancelled + if [ "${{ needs.check_changes.result }}" = "failure" ] || [ "${{ needs.check_changes.result }}" = "cancelled" ] || \ + [ "${{ needs.python_config.result }}" = "failure" ] || [ "${{ needs.python_config.result }}" = "cancelled" ] || \ + [ "${{ needs.showcase-unit.result }}" = "failure" ] || [ "${{ needs.showcase-unit.result }}" = "cancelled" ] || \ + [ "${{ needs.showcase-mypy.result }}" = "failure" ] || [ "${{ needs.showcase-mypy.result }}" = "cancelled" ] || \ + [ "${{ needs.goldens.result }}" = "failure" ] || [ "${{ needs.goldens.result }}" = "cancelled" ] || \ + [ "${{ needs.goldens-prerelease.result }}" = "failure" ] || [ "${{ needs.goldens-prerelease.result }}" = "cancelled" ] || \ + [ "${{ needs.fragment-snippet.result }}" = "failure" ] || [ "${{ needs.fragment-snippet.result }}" = "cancelled" ] || \ + [ "${{ needs.integration.result }}" = "failure" ] || [ "${{ needs.integration.result }}" = "cancelled" ]; then + echo "Error: One or more required jobs failed or were cancelled." + exit 1 + fi + echo "All checks passed or were successfully skipped." From ff2b8e8a931589270b44c9593fe0d2e9958c2c70 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 6 Jul 2026 18:36:02 -0700 Subject: [PATCH 3/6] fixed typo --- .github/workflows/gapic-generator-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index fbf9d1283bc3..d64fdea4427b 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -46,7 +46,7 @@ jobs: all_python: ${{ env.ALL_PYTHON }} latest_stable_python: ${{ env.LATEST_STABLE_PYTHON }} prerelease_python: ${{ env.PRERELEASE_PYTHON }} - trimmed_python: $${{ env.TRIMMED_PYTHON }} + trimmed_python: ${{ env.TRIMMED_PYTHON }} steps: - run: echo "Initializing config for gapic-generator" From 4d4a27a3c00aa91abf9c430094a46dd82543b594 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 6 Jul 2026 19:10:26 -0700 Subject: [PATCH 4/6] disable tests on workflow change --- .github/workflows/gapic-generator-tests.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index d64fdea4427b..8bf202ad93f3 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -35,7 +35,6 @@ jobs: filters: | generator: - 'packages/gapic-generator/**' - - '.github/workflows/gapic-generator-tests.yml' # Preserve the workaround for env variables in matrix python_config: From 29d33a13272b80c5c9b6cc8855769659e5158233 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 6 Jul 2026 19:12:50 -0700 Subject: [PATCH 5/6] Revert "disable tests on workflow change" This reverts commit 4d4a27a3c00aa91abf9c430094a46dd82543b594. --- .github/workflows/gapic-generator-tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index 8bf202ad93f3..d64fdea4427b 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -35,6 +35,7 @@ jobs: filters: | generator: - 'packages/gapic-generator/**' + - '.github/workflows/gapic-generator-tests.yml' # Preserve the workaround for env variables in matrix python_config: From b03e225b2d4ad2395453f7f976185ac844d67e11 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 6 Jul 2026 19:16:17 -0700 Subject: [PATCH 6/6] cleaned up code --- .github/workflows/gapic-generator-tests.yml | 26 +++++++-------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/.github/workflows/gapic-generator-tests.yml b/.github/workflows/gapic-generator-tests.yml index d64fdea4427b..2385818c95fa 100644 --- a/.github/workflows/gapic-generator-tests.yml +++ b/.github/workflows/gapic-generator-tests.yml @@ -201,7 +201,7 @@ jobs: container: gcr.io/gapic-images/googleapis steps: - uses: actions/checkout@v6 - + - name: Cache Bazel files id: cache-bazel uses: actions/cache@v5 @@ -226,25 +226,15 @@ jobs: runs-on: ubuntu-latest steps: - name: Check all jobs for failure + env: + NEEDS_JSON: ${{ toJson(needs) }} run: | - echo "check_changes result: ${{ needs.check_changes.result }}" - echo "python_config result: ${{ needs.python_config.result }}" - echo "showcase-unit result: ${{ needs.showcase-unit.result }}" - echo "showcase-mypy result: ${{ needs.showcase-mypy.result }}" - echo "goldens result: ${{ needs.goldens.result }}" - echo "goldens-prerelease result: ${{ needs.goldens-prerelease.result }}" - echo "fragment-snippet result: ${{ needs.fragment-snippet.result }}" - echo "integration result: ${{ needs.integration.result }}" + # 1. Print a human-readable list of each dependency job and its final status. + echo "Job Results:" + echo "$NEEDS_JSON" | jq -r 'to_entries[] | " - \(.key): \(.value.result)"' - # Fail if any of the dependencies failed or were cancelled - if [ "${{ needs.check_changes.result }}" = "failure" ] || [ "${{ needs.check_changes.result }}" = "cancelled" ] || \ - [ "${{ needs.python_config.result }}" = "failure" ] || [ "${{ needs.python_config.result }}" = "cancelled" ] || \ - [ "${{ needs.showcase-unit.result }}" = "failure" ] || [ "${{ needs.showcase-unit.result }}" = "cancelled" ] || \ - [ "${{ needs.showcase-mypy.result }}" = "failure" ] || [ "${{ needs.showcase-mypy.result }}" = "cancelled" ] || \ - [ "${{ needs.goldens.result }}" = "failure" ] || [ "${{ needs.goldens.result }}" = "cancelled" ] || \ - [ "${{ needs.goldens-prerelease.result }}" = "failure" ] || [ "${{ needs.goldens-prerelease.result }}" = "cancelled" ] || \ - [ "${{ needs.fragment-snippet.result }}" = "failure" ] || [ "${{ needs.fragment-snippet.result }}" = "cancelled" ] || \ - [ "${{ needs.integration.result }}" = "failure" ] || [ "${{ needs.integration.result }}" = "cancelled" ]; then + # 2. Evaluate if any job actually failed or was cancelled. + if echo "$NEEDS_JSON" | jq -e 'to_entries[].value | select(.result == "failure" or .result == "cancelled")' >/dev/null; then echo "Error: One or more required jobs failed or were cancelled." exit 1 fi