From a55544b7d4d00ab4a88ae04084c88c81ca80523b Mon Sep 17 00:00:00 2001 From: Julian Sommer <115516918+juliansommer@users.noreply.github.com> Date: Thu, 23 Jul 2026 09:49:51 +1000 Subject: [PATCH] chore: remove integration from e2e --- .github/workflows/e2e.yml | 74 +++++---------------------------------- 1 file changed, 9 insertions(+), 65 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 426442ef7..1510b696d 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -40,46 +40,8 @@ env: SPINIFEX_OTEL_ATTRS: ci.run_id=${{ github.run_id }},ci.workflow=${{ github.workflow }} jobs: - # In-process integration front gate. Provisions nothing -- no tofu, no - # docker, no Spinifex daemons, no fixed ports -- so it runs directly on the - # runner host rather than inside a provisioned VM, and completes in seconds. - # - # It runs on ci-single rather than a GitHub-hosted runner so it shares the - # toolchain and sibling-repo build of the live suites, and so the run stays - # entirely on the LAN that hosts the Elastic sink. Holding a ci-single slot - # for seconds is negligible against the 50-minute e2e_single that follows. - # - # e2e_single and e2e_multi both require this job to succeed, so a red - # integration run is caught before either provisions a tofu env or pays the - # Spinifex install -- which is the expensive half, not the tofu apply. - integration: - name: Integration (front gate) - runs-on: [self-hosted, ci-single] - timeout-minutes: 10 - steps: - # This runner is shared with e2e_single, which leaves root-owned tofu and - # mount artifacts behind; a plain checkout would fail on them. Unmount - # anything still bound under the workspace before wiping it. - - name: Clean Workspace - run: | - awk -v w="$GITHUB_WORKSPACE" '$2 ~ "^"w {print $2}' /proc/mounts \ - | sort -r | xargs -r -I{} sudo umount -l -R {} || true - sudo rm -rf --one-file-system "$GITHUB_WORKSPACE"/* - - - uses: actions/checkout@v7 - - uses: actions/setup-go@v7 - with: - go-version-file: go.mod - cache: false - - name: Run in-process integration tests - run: make test-integration - e2e_single: name: Single-Node E2E - needs: [integration] - # The integration front gate must be green: a red integration run stops - # here, before this job provisions a tofu env or pays the Spinifex install. - # # The dispatch check gates on exactly the suites this job's Run step # allow-lists, i.e. E2E_SUITES_SINGLE in .github/scripts/suite-sets.sh — # an `if:` expression cannot source that file, so this one list is @@ -88,7 +50,7 @@ jobs: # provision a tofu VM and pay the Spinifex install only to run nothing and # tear down. Push triggers keep running via the null-check on # inputs.suites. - if: needs.integration.result == 'success' && (github.event_name != 'workflow_dispatch' || contains(github.event.inputs.suites, 'e2e-single') || contains(github.event.inputs.suites, 'e2e-iam') || contains(github.event.inputs.suites, 'e2e-cert') || contains(github.event.inputs.suites, 'e2e-eks') || contains(github.event.inputs.suites, 'e2e-ecs') || contains(github.event.inputs.suites, 'e2e-storagegrowth') || contains(github.event.inputs.suites, 'e2e-partialblock')) + if: github.event_name != 'workflow_dispatch' || contains(github.event.inputs.suites, 'e2e-single') || contains(github.event.inputs.suites, 'e2e-iam') || contains(github.event.inputs.suites, 'e2e-cert') || contains(github.event.inputs.suites, 'e2e-eks') || contains(github.event.inputs.suites, 'e2e-ecs') || contains(github.event.inputs.suites, 'e2e-storagegrowth') || contains(github.event.inputs.suites, 'e2e-partialblock') runs-on: [self-hosted, ci-single] timeout-minutes: 50 env: @@ -517,14 +479,11 @@ jobs: e2e_multi: name: Multi-Node E2E - needs: [integration] - # Gated on the integration front gate for the same reason as e2e_single: - # the 3-node env is never stood up if the control plane is already broken. # The dispatch check gates on exactly the suites this job's Run step # allow-lists (multinode|lb|cert) so lb — which only runs here — still # provisions the 3-node env when requested on its own, and the env stays # unprovisioned when none of them are asked for. - if: needs.integration.result == 'success' && (github.event_name != 'workflow_dispatch' || contains(github.event.inputs.suites, 'e2e-multinode') || contains(github.event.inputs.suites, 'e2e-lb') || contains(github.event.inputs.suites, 'e2e-cert')) + if: github.event_name != 'workflow_dispatch' || contains(github.event.inputs.suites, 'e2e-multinode') || contains(github.event.inputs.suites, 'e2e-lb') || contains(github.event.inputs.suites, 'e2e-cert') runs-on: [self-hosted, ci-multi] timeout-minutes: 60 env: @@ -962,7 +921,7 @@ jobs: e2e_status: name: Report E2E Status if: always() - needs: [integration, e2e_single, e2e_multi] + needs: [e2e_single, e2e_multi] runs-on: ubuntu-26.04 timeout-minutes: 5 steps: @@ -971,22 +930,15 @@ jobs: GH_TOKEN: ${{ github.token }} REPORT_SHA: ${{ github.sha }} run: | - # integration must have actually succeeded -- unlike e2e_single/multi, - # "skipped" is never an acceptable result for it (it has no `if:` of - # its own), so a red or skipped integration run fails the gate here - # even though e2e_single/e2e_multi themselves report "skipped" (their - # `if:` never let them start). - integration_ok=true - case "${{ needs.integration.result }}" in success) ;; *) integration_ok=false ;; esac single_ok=true; multi_ok=true case "${{ needs.e2e_single.result }}" in success|skipped) ;; *) single_ok=false ;; esac case "${{ needs.e2e_multi.result }}" in success|skipped) ;; *) multi_ok=false ;; esac - if $integration_ok && $single_ok && $multi_ok; then + if $single_ok && $multi_ok; then STATE="success" DESC="E2E suites passed" else STATE="failure" - DESC="E2E failed: integration=${{ needs.integration.result }} single=${{ needs.e2e_single.result }} multi=${{ needs.e2e_multi.result }}" + DESC="E2E failed: single=${{ needs.e2e_single.result }} multi=${{ needs.e2e_multi.result }}" fi gh api "repos/${{ github.repository }}/statuses/${REPORT_SHA}" \ -f state="$STATE" \ @@ -1003,7 +955,7 @@ jobs: # status-report check. e2e_es_summary: name: ES CI Run Summary - needs: [integration, e2e_single, e2e_multi] + needs: [e2e_single, e2e_multi] if: always() runs-on: [self-hosted, ci-single] timeout-minutes: 5 @@ -1043,7 +995,6 @@ jobs: BRANCH: ${{ github.head_ref || github.ref_name }} SHA: ${{ github.sha }} SERVER_URL: ${{ github.server_url }} - INTEGRATION_RESULT: ${{ needs.integration.result }} SINGLE_RESULT: ${{ needs.e2e_single.result }} MULTI_RESULT: ${{ needs.e2e_multi.result }} SINGLE_DIR: ${{ github.workspace }}/es-summary-single @@ -1072,20 +1023,15 @@ jobs: FAILED_JSON=$(printf '%s' "$FAILED_SUITES" | jq -R -s 'split("\n") | map(select(length > 0))') FAILED_COUNT=$(printf '%s' "$FAILED_JSON" | jq 'length') - # Mirror e2e_status's integration_ok/single_ok/multi_ok logic exactly - # so the PR status and this ES doc can never disagree on overall - # pass/fail. Like e2e_status, "skipped" is only acceptable for - # single/multi (their `if:` may legitimately not select them); a - # skipped or failed integration always fails the gate. - integration_ok=true - case "$INTEGRATION_RESULT" in success) ;; *) integration_ok=false ;; esac + # Mirror e2e_status's single_ok/multi_ok logic exactly so the PR + # status and this ES doc can never disagree on overall pass/fail. single_ok=true case "$SINGLE_RESULT" in success | skipped) ;; *) single_ok=false ;; esac multi_ok=true case "$MULTI_RESULT" in success | skipped) ;; *) multi_ok=false ;; esac STATE=success - if [ "$integration_ok" != true ] || [ "$single_ok" != true ] || [ "$multi_ok" != true ] || [ "$FAILED_COUNT" -gt 0 ]; then + if [ "$single_ok" != true ] || [ "$multi_ok" != true ] || [ "$FAILED_COUNT" -gt 0 ]; then STATE=failure fi @@ -1102,7 +1048,6 @@ jobs: --arg sha "${SHA}" \ --arg run_attempt "${RUN_ATTEMPT}" \ --arg state "${STATE}" \ - --arg integration_result "${INTEGRATION_RESULT}" \ --arg single_result "${SINGLE_RESULT}" \ --arg multi_result "${MULTI_RESULT}" \ --argjson duration "${DURATION}" \ @@ -1113,7 +1058,6 @@ jobs: labels: { ci_run_id: $run_id }, ci: { workflow: $workflow, branch: $branch, sha: $sha, run_attempt: $run_attempt }, state: $state, - integration_result: $integration_result, single_result: $single_result, multi_result: $multi_result, failed_suites: $failed_suites,