diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 18a41d01feb..7ab228faf4d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -419,7 +419,7 @@ jobs: security-fast: permissions: {} needs: [security-scm-fast, security-dependency-audit] - if: always() && (github.event_name != 'pull_request' || !github.event.pull_request.draft) + if: ${{ !cancelled() && always() && (github.event_name != 'pull_request' || !github.event.pull_request.draft) }} runs-on: ubuntu-24.04 timeout-minutes: 5 steps: @@ -721,7 +721,7 @@ jobs: contents: read name: checks-fast-contracts-channels needs: [preflight, checks-fast-channel-contracts-shard] - if: always() && needs.preflight.outputs.run_checks_fast == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_checks_fast == 'true' }} runs-on: ubuntu-24.04 timeout-minutes: 5 steps: @@ -878,7 +878,7 @@ jobs: contents: read name: checks-node-extensions needs: [preflight, checks-node-extensions-shard] - if: always() && needs.preflight.outputs.run_checks_fast == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_checks_fast == 'true' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }} timeout-minutes: 5 steps: @@ -896,7 +896,7 @@ jobs: contents: read name: ${{ matrix.check_name }} needs: [preflight, build-artifacts] - if: always() && needs.preflight.outputs.run_checks == 'true' && needs.build-artifacts.result == 'success' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_checks == 'true' && needs.build-artifacts.result == 'success' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }} timeout-minutes: 60 strategy: @@ -1212,7 +1212,7 @@ jobs: contents: read name: ${{ matrix.check_name }} needs: [preflight, build-artifacts] - if: always() && needs.preflight.outputs.run_checks_node_core_dist == 'true' && needs.build-artifacts.result == 'success' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_checks_node_core_dist == 'true' && needs.build-artifacts.result == 'success' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }} timeout-minutes: 60 strategy: @@ -1356,7 +1356,7 @@ jobs: contents: read name: checks-node-core needs: [preflight, checks-node-core-test-nondist-shard, checks-node-core-test-dist-shard] - if: always() && needs.preflight.outputs.run_checks == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_checks == 'true' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }} timeout-minutes: 5 steps: @@ -1452,7 +1452,7 @@ jobs: contents: read name: ${{ matrix.check_name }} needs: [preflight] - if: always() && needs.preflight.outputs.run_check == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_check == 'true' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && matrix.runner || 'ubuntu-24.04' }} timeout-minutes: 20 strategy: @@ -1573,7 +1573,7 @@ jobs: contents: read name: "check" needs: [preflight, check-shard] - if: always() && needs.preflight.outputs.run_check == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_check == 'true' }} runs-on: ubuntu-24.04 timeout-minutes: 5 steps: @@ -1591,7 +1591,7 @@ jobs: contents: read name: ${{ matrix.check_name }} needs: [preflight] - if: always() && needs.preflight.outputs.run_check_additional == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_check_additional == 'true' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }} timeout-minutes: 20 strategy: @@ -1793,7 +1793,7 @@ jobs: contents: read name: "check-additional" needs: [preflight, check-additional-shard] - if: always() && needs.preflight.outputs.run_check_additional == 'true' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_check_additional == 'true' }} runs-on: ubuntu-24.04 timeout-minutes: 5 steps: @@ -1811,7 +1811,7 @@ jobs: contents: read name: "build-smoke" needs: [preflight, build-artifacts] - if: always() && needs.preflight.outputs.run_build_smoke == 'true' && (github.event_name != 'push' || needs.build-artifacts.result == 'success') + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_build_smoke == 'true' && (github.event_name != 'push' || needs.build-artifacts.result == 'success') }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-24.04' }} timeout-minutes: 20 steps: @@ -2105,7 +2105,7 @@ jobs: contents: read name: ${{ matrix.check_name }} needs: [preflight, build-artifacts] - if: always() && needs.preflight.outputs.run_macos_node == 'true' && needs.build-artifacts.result == 'success' + if: ${{ !cancelled() && always() && needs.preflight.outputs.run_macos_node == 'true' && needs.build-artifacts.result == 'success' }} runs-on: ${{ github.repository == 'openclaw/openclaw' && 'blacksmith-6vcpu-macos-latest' || 'macos-latest' }} timeout-minutes: 20 strategy: diff --git a/docs/ci.md b/docs/ci.md index dd321aa398f..bd98546072d 100644 --- a/docs/ci.md +++ b/docs/ci.md @@ -53,7 +53,7 @@ On pushes, the `checks` matrix adds the push-only `compat-node22` lane. On pull The slowest Node test families are split into include-file shards so each job stays small: channel contracts split registry and core coverage into eight weighted shards each, auto-reply reply command tests split into four include-pattern shards, and the other large auto-reply reply prefix groups split into two shards each. `check-additional` also separates package-boundary compile/canary work from runtime topology gateway/architecture work. -GitHub may mark superseded jobs as `cancelled` when a newer push lands on the same PR or `main` ref. Treat that as CI noise unless the newest run for the same ref is also failing. The aggregate shard checks call out this cancellation case explicitly so it is easier to distinguish from a test failure. +GitHub may mark superseded jobs as `cancelled` when a newer push lands on the same PR or `main` ref. Treat that as CI noise unless the newest run for the same ref is also failing. Aggregate shard checks use `!cancelled() && always()` so they still report normal shard failures but do not queue after the whole workflow has already been superseded. ## Runners