ci: Move runner-timeout to composite action (#38503)

We are hitting the limit of 20 workflow references in servo. To help
mitigate this somewhat, we migrate the timeout job to a composite
action, which should be able to support our needs just as well.

Testing: [try run of this
PR](https://github.com/servo/servo/actions/runs/16783916103/job/47529580725).
[try run with unconditional
cancel](https://github.com/servo/servo/actions/runs/16784074213/job/47530099654).

This reduces our workflow count by one, slightly helping to address
#36143

Signed-off-by: Jonathan Schwender <schwenderjonathan@gmail.com>
This commit is contained in:
Jonathan Schwender 2025-08-07 07:13:36 +02:00 committed by GitHub
parent edf80576d5
commit c055e8b456
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 73 additions and 54 deletions

View file

@ -0,0 +1,37 @@
# In the unlikely event a self-hosted runner was selected and reserved but it
# goes down before the workload starts, cancel the workflow run.
name: Detect self-hosted runner assigment timeout
description: "Cancel the workflow run if a self-hosted runner was selected, but the job failed to start"
inputs:
unique-id:
required: true
description: "Unique ID of the runner"
github_token:
required: true
description: "Must be able to do github API calls and cancel jobs."
runs:
using: "composite"
steps:
- name: Wait a bit
shell: bash
run: sleep 120
- name: Cancel if workload job is still queued
shell: bash
run: |
run_url=/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}
export GH_TOKEN=${{ inputs.github_token }}
if [ "$(gh api "$run_url/jobs" \
| jq -er --arg id '${{ inputs.unique-id }}' \
'.jobs[] | select(.name | contains("[" + $id + "]")) | .status'
)" = queued ]; then
echo 'Timeout waiting for runner assignment!'
echo 'Hint: does this repo have permission to access the runner group?'
echo 'Hint: https://github.com/organizations/servo/settings/actions/runner-groups'
echo
echo 'Cancelling workflow run'
gh api "$run_url/cancel" --method POST
exit 1
fi

View file

@ -111,11 +111,18 @@ jobs:
runner-timeout:
needs:
- runner-select
uses: ./.github/workflows/self-hosted-runner-timeout.yml
secrets: inherit
with:
unique-id: ${{ needs.runner-select.outputs.unique-id }}
is-self-hosted: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }}
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: '.github'
- name: Runner timeout
uses: ./.github/actions/runner-timeout
if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }}
with:
github_token: '${{ secrets.GITHUB_TOKEN }}'
unique-id: '${{ needs.runner-select.outputs.unique-id }}'
build:
needs:

View file

@ -94,11 +94,18 @@ jobs:
runner-timeout:
needs:
- runner-select
uses: ./.github/workflows/self-hosted-runner-timeout.yml
secrets: inherit
with:
unique-id: ${{ needs.runner-select.outputs.unique-id }}
is-self-hosted: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }}
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: '.github'
- name: Runner timeout
uses: ./.github/actions/runner-timeout
if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }}
with:
github_token: '${{ secrets.GITHUB_TOKEN }}'
unique-id: '${{ needs.runner-select.outputs.unique-id }}'
build:
needs:

View file

@ -1,39 +0,0 @@
name: Detect Self-hosted Runner Timeout
on:
workflow_call:
inputs:
unique-id:
required: true
type: string
is-self-hosted:
required: true
type: boolean
jobs:
# In the unlikely event a self-hosted runner was selected and reserved but it
# goes down before the workload starts, cancel the workflow run.
runner-timeout:
if: ${{ inputs.is-self-hosted }}
name: Detect Runner Timeout
runs-on: ubuntu-latest
steps:
- name: Wait a bit
run: sleep 120
- name: Cancel if workload job is still queued
run: |
run_url=/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}
export GH_TOKEN=${{ secrets.GITHUB_TOKEN }}
if [ "$(gh api "$run_url/jobs" \
| jq -er --arg id '${{ inputs.unique-id }}' \
'.jobs[] | select(.name | contains("[" + $id + "]")) | .status'
)" = queued ]; then
echo 'Timeout waiting for runner assignment!'
echo 'Hint: does this repo have permission to access the runner group?'
echo 'Hint: https://github.com/organizations/servo/settings/actions/runner-groups'
echo
echo 'Cancelling workflow run'
gh api "$run_url/cancel" --method POST
exit 1
fi

View file

@ -85,11 +85,18 @@ jobs:
runner-timeout:
needs:
- runner-select
uses: ./.github/workflows/self-hosted-runner-timeout.yml
secrets: inherit
with:
unique-id: ${{ needs.runner-select.outputs.unique-id }}
is-self-hosted: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }}
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
with:
sparse-checkout: '.github'
- name: Runner timeout
uses: ./.github/actions/runner-timeout
if: ${{ fromJSON(needs.runner-select.outputs.is-self-hosted) }}
with:
github_token: '${{ secrets.GITHUB_TOKEN }}'
unique-id: '${{ needs.runner-select.outputs.unique-id }}'
build:
needs: