# C9 - control-flow: timeout-minutes, continue-on-error, concurrency (parse-only) # Reusable workflow invoked by 00-suite-runner.yml. Verifies three control-flow # behaviors: # 1. timeout-minutes kills a runaway job (asserted from a dependent job, since # a dead job cannot assert its own death). # 2. continue-on-error makes a job report success to dependents despite a # tolerated step failure. # 3. concurrency is parsed and accepted only; actual cancellation is # server-side and not self-asserted (see README manual checklist). name: 09-control-flow on: workflow_call: # concurrency: parse-and-accept only. Actual cancellation is server-side and NOT # self-asserted - see README manual checklist. concurrency: group: cf-${{ github.ref }} cancel-in-progress: false jobs: # Sleeps past its timeout-minutes limit. The runner kills it, so the job's # result is NOT 'success' (exact string is version-dependent: 'failure' or # 'cancelled'). The slow-check dependent job asserts the non-success result. slow: runs-on: ubuntu-24.04 timeout-minutes: 1 steps: - name: sleep past the timeout limit run: sleep 90 # Dependent assertion: MUST use if: always() so it runs despite 'slow' failing. # Asserts != 'success' (NOT == 'failure') because the timed-out result string # is version-dependent. slow-check: needs: slow if: always() runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: assert slow was killed by timeout shell: bash run: | source lib/assert.sh if [ "${{ needs.slow.result }}" != "success" ]; then assert_eq "killed" "killed" "slow was killed by timeout (result: ${{ needs.slow.result }})" else assert_eq "should-have-failed" "did-not-fail" "slow unexpectedly succeeded" fi # A failing step guarded by continue-on-error: true. The job reports success to # dependents despite the tolerated failure. flaky: runs-on: ubuntu-24.04 steps: - name: tolerated failure continue-on-error: true run: exit 1 # Dependent assertion: MUST use if: always(). Asserts the flaky job reports # 'success' to dependents because the failing step was tolerated. flaky-check: needs: flaky if: always() runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: assert continue-on-error reports success to dependents shell: bash run: | source lib/assert.sh assert_eq "${{ needs.flaky.result }}" "success" "continue-on-error: job reports success to dependents"