name: Cancel runs on PR close on: pull_request: types: [closed] permissions: actions: write contents: read jobs: cancel: runs-on: ubuntu-latest steps: - uses: actions/github-script@v8 with: github-token: ${{ github.token }} script: | const { owner, repo } = context.repo; const branch = context.payload.pull_request.head.ref; const statuses = ["in_progress", "queued", "waiting", "pending", "requested"]; for (const status of statuses) { let page = 1; while (true) { const resp = await github.rest.actions.listWorkflowRunsForRepo({ owner, repo, branch, status, per_page: 100, page }); const runs = resp.data.workflow_runs; if (!runs.length) break; for (const run of runs) { if (run.id === context.runId) continue; // don't cancel this workflow try { await github.rest.actions.cancelWorkflowRun({ owner, repo, run_id: run.id }); core.info(`Cancel requested: ${run.html_url}`); } catch (e) { // common reasons: already completed (409) or insufficient permissions (403) core.warning(`Failed to cancel ${run.html_url}: ${e.message}`); } } if (runs.length < 100) break; page++; } }