chore: Cherry-picked changes from upstream #59
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: 'CI: Lint, Build & Test' | |
| on: | |
| push: | |
| branches: [main] | |
| paths: | |
| - 'src/**' | |
| - 'package.json' | |
| - 'package-lock.json' | |
| - 'tsconfig.json' | |
| - 'eslint.config.mjs' | |
| - 'action.yaml' | |
| - 'dist/**' | |
| - '.github/workflows/**' | |
| pull_request: | |
| branches: [main] | |
| paths: | |
| - 'src/**' | |
| - 'package.json' | |
| - 'package-lock.json' | |
| - 'tsconfig.json' | |
| - 'eslint.config.mjs' | |
| - 'action.yaml' | |
| - 'dist/**' | |
| - '.github/workflows/**' | |
| workflow_dispatch: | |
| jobs: | |
| # =========================================================================== | |
| # Build & lint — all test jobs depend on this | |
| # =========================================================================== | |
| build: | |
| name: Build & Lint | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 | |
| with: | |
| node-version: '24.x' | |
| - run: npm ci | |
| - run: npm run lint | |
| - run: npm run build | |
| # =========================================================================== | |
| # Test: Dispatch a workflow by its display name, with inputs | |
| # =========================================================================== | |
| test-dispatch-by-name: | |
| name: 'Test: Dispatch by name' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch echo-1 by name | |
| id: dispatch | |
| uses: ./ | |
| with: | |
| workflow: Message Echo 1 | |
| inputs: '{"message": "hello from name test"}' | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| - name: Assert outputs are set | |
| env: | |
| RUN_ID: ${{ steps.dispatch.outputs.runId }} | |
| WORKFLOW_ID: ${{ steps.dispatch.outputs.workflowId }} | |
| RUN_URL: ${{ steps.dispatch.outputs.runUrl }} | |
| RUN_URL_HTML: ${{ steps.dispatch.outputs.runUrlHtml }} | |
| run: | | |
| echo "runId=$RUN_ID workflowId=$WORKFLOW_ID" | |
| echo "runUrl=$RUN_URL" | |
| echo "runUrlHtml=$RUN_URL_HTML" | |
| [[ -n "$RUN_ID" ]] || { echo "FAIL: runId empty"; exit 1; } | |
| [[ -n "$WORKFLOW_ID" ]] || { echo "FAIL: workflowId empty"; exit 1; } | |
| [[ -n "$RUN_URL" ]] || { echo "FAIL: runUrl empty"; exit 1; } | |
| [[ -n "$RUN_URL_HTML" ]] || { echo "FAIL: runUrlHtml empty"; exit 1; } | |
| # =========================================================================== | |
| # Test: Dispatch a workflow by its filename (short form) | |
| # =========================================================================== | |
| test-dispatch-by-filename: | |
| name: 'Test: Dispatch by filename' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch echo-2 by filename | |
| uses: ./ | |
| with: | |
| workflow: echo-2.yaml | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| # =========================================================================== | |
| # Test: Dispatch a workflow by its full path | |
| # =========================================================================== | |
| test-dispatch-by-path: | |
| name: 'Test: Dispatch by full path' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch echo-2 by full path | |
| uses: ./ | |
| with: | |
| workflow: .github/workflows/echo-2.yaml | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| # =========================================================================== | |
| # Test: Dispatch a workflow by its numeric ID | |
| # =========================================================================== | |
| test-dispatch-by-id: | |
| name: 'Test: Dispatch by ID' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| # NOTE: This ID is specific to this repo's echo-1 workflow. | |
| # If the workflow file is deleted & recreated, this ID will change. | |
| - name: Dispatch echo-1 by numeric ID | |
| uses: ./ | |
| with: | |
| workflow: '78181717' | |
| inputs: '{"message": "dispatched by id"}' | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| # =========================================================================== | |
| # Test: Wait for completion on a slow workflow (success case) | |
| # =========================================================================== | |
| test-wait-completion: | |
| name: 'Test: Wait for completion' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch echo-2 and wait for it to finish | |
| uses: ./ | |
| with: | |
| workflow: echo-2.yaml | |
| wait-for-completion: true | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| # =========================================================================== | |
| # Test: sync-status mirrors a successful workflow conclusion | |
| # =========================================================================== | |
| test-sync-status-success: | |
| name: 'Test: Sync status (success)' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch echo-1 with wait + sync-status | |
| uses: ./ | |
| with: | |
| workflow: Message Echo 1 | |
| inputs: '{"message": "sync status success test"}' | |
| wait-for-completion: true | |
| sync-status: true | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| # =========================================================================== | |
| # Test: sync-status propagates a failing workflow as a failure | |
| # =========================================================================== | |
| test-sync-status-failure: | |
| name: 'Test: Sync status (failure)' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch echo-3 (always fails) with sync-status | |
| id: dispatch-fail | |
| continue-on-error: true | |
| uses: ./ | |
| with: | |
| workflow: echo-3.yaml | |
| wait-for-completion: true | |
| sync-status: true | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| - name: Assert action reported failure | |
| run: | | |
| if [[ "${{ steps.dispatch-fail.outcome }}" != "failure" ]]; then | |
| echo "FAIL: Expected action to fail when sync-status mirrors a failing workflow" | |
| exit 1 | |
| fi | |
| echo "PASS: Action correctly propagated failure" | |
| # =========================================================================== | |
| # Test: Invalid workflow reference produces an error | |
| # =========================================================================== | |
| test-invalid-workflow: | |
| name: 'Test: Invalid workflow name' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Dispatch a workflow that does not exist | |
| id: bad-workflow | |
| continue-on-error: true | |
| uses: ./ | |
| with: | |
| workflow: this-workflow-does-not-exist.yaml | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} | |
| - name: Assert action failed | |
| run: | | |
| if [[ "${{ steps.bad-workflow.outcome }}" != "failure" ]]; then | |
| echo "FAIL: Expected action to fail for non-existent workflow" | |
| exit 1 | |
| fi | |
| echo "PASS: Action correctly failed for invalid workflow reference" | |
| # =========================================================================== | |
| # Test: Wait timeout fires before a slow workflow finishes | |
| # =========================================================================== | |
| test-wait-timeout: | |
| name: 'Test: Wait timeout' | |
| needs: build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Harden the runner (Audit all outbound calls) | |
| uses: step-security/harden-runner@8d3c67de8e2fe68ef647c8db1e6a09f647780f40 # v2.19.0 | |
| with: | |
| egress-policy: audit | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| # echo-2 sleeps for 11s — a 1-second timeout will trigger after the | |
| # first poll cycle (~5s). The action warns but does NOT fail on timeout. | |
| - name: Dispatch echo-2 with 1-second timeout | |
| uses: ./ | |
| with: | |
| workflow: echo-2.yaml | |
| wait-for-completion: true | |
| wait-timeout-seconds: 1 | |
| ref: ${{ github.event.pull_request.head.ref || github.ref_name }} |