This GitHub Action waits for all jobs by default even if they run in other workflows.
You can also choose to wait for specific jobs.
If any of the jobs fail, this action fails too.
It works with zero or little configuration.
jobs:
your_job:
# Enabling these permissions are required in private repositories
# permissions:
# contents: read
# checks: read
# actions: read
runs-on: ubuntu-24.04
steps:
- uses: kachick/[email protected]
timeout-minutes: 15 # Recommended to be enabled with your appropriate value for fail-safe useYou can configure the token, polling interval, allow/deny lists, and early-exit behavior as shown below.
with:
warmup-delay: 'PT30S' # default 'PT1S'
minimum-interval: 'PT300S' # default 'PT10S'
retry-method: 'exponential_backoff' # default 'equal_intervals'
early-exit: 'false' # default 'true'
skip-same-workflow: 'true' # default 'false'
wait-list: |
[
{
"workflowFile": "ci.yml",
"jobName": "test",
"eventNames": [ "push", "pull_request" ]
},
{
"workflowFile": "release.yml",
"optional": true
}
]
skip-list: |
[
{
"workflowFile": "pages.yml"
}
]Full list of the options
| NAME | DESCRIPTION | TYPE | DEFAULT | OPTIONS |
|---|---|---|---|---|
github-api-url |
The GitHub API endpoint. Override for GitHub Enterprise usage. | string |
${{ github.api_url }} |
https://api.github.com, https://ghe-host.example.net/api/v3 |
github-token |
The GITHUB_TOKEN secret. You can use PAT if you want. | string |
${{ github.token }} |
|
warmup-delay |
Wait this interval before first polling | string |
PT1S |
ISO 8601 duration format |
minimum-interval |
Wait for this interval or longer between each poll to reduce GitHub API calls | string |
PT10S |
ISO 8601 duration format |
retry-method |
How to wait for next polling | string |
equal_intervals |
exponential_backoff, equal_intervals |
early-exit |
Stop polling as soon as one job fails | bool |
true |
|
attempt-limits |
Stop polling if reached to this limit | number |
1000 |
|
event-list |
Wait only listed events. Used as default for wait/skip lists | string |
[ "${{ github.event_name }}" ] |
JSON Array |
wait-list |
Wait only for these jobs | string |
[] |
JSON Array |
skip-list |
Wait for all jobs except these | string |
[] |
JSON Array |
skip-same-workflow |
Skip jobs defined in the same workflow which using this action | bool |
false |
|
dry-run |
Avoid requests for tests | bool |
false |
- GitHub API Limit: We should at least consider the
GITHUB_TOKEN, which is limited to 1,000 requests per hour per repository.
Roughly calculating for long jobs, setting theminimum-intervaltoPT4Sor longer would be safer.
Lists should be given with JSON array, do not use both wait-list and skip-list together
- Must specify
workflowFile - Optionally specify
jobName
If nojobNameis specified, all jobs in the workflow will be targeted. - Optionally specify
eventNames
If noeventNamesis specified, the globalevent-listwill be used (inherited).
If empty[]is specified, all events will be targeted.
- If the checkRun for the specified name is not found, this action fails by default.
You can disable this validation with"optional": trueor use thestartupGracePeriod.
- Subset of
wait-list. There is nooptionalandstartupGracePeriod - Global
event-listfiltering is applied BEFORE this list. - If you specify
eventNamesin an item, that item will only be skipped when the event matches.
In public repositories, they are satisfied by default
permissions:
contents: read # Since v2
checks: read
actions: readTo run this action in your GitHub Enterprise (GHE) instance you need to override github-api-url:
with:
github-api-url: 'https://ghe-host.example.net/api/v3'These outputs are for testing and debugging only. The schema is not defined.
-
parameters
Parsed values fromwithand some context. -
dump
A file path for collected resources which keeps fields than logged.
When using this action in multiple jobs within the same repository, be careful to avoid deadlocks.
The skip-list, wait-list and skip-same-workflow options cover this use case.
If you changed job name from the default, you should set skip-list or roughly use skip-same-workflow
jobs:
your_job: # This will be used as the default job name if you do not specify the "name" field below
name: 'Changed at here'
runs-on: ubuntu-24.04
steps:
- uses: kachick/[email protected]
with:
skip-list: |
[
{
"workflowFile": "this_file_name.yml",
"jobName": "Changed at here"
}
]
timeout-minutes: 15You need to consider similar problems when using matrix, because GitHub does not provide enough context.
- https://github.com/orgs/community/discussions/8945
- https://github.com/orgs/community/discussions/16614
However, you can set jobMatchMode to prefix to create a smaller skip-list and avoid this problem.
jobs:
your_job:
strategy:
matrix:
runner:
- ubuntu-24.04
- ubuntu-24.04-arm
- ubuntu-slim # Limited to 15 minutes by GitHub
- macos-26
- windows-2025
runs-on: ${{ matrix.runner }}
steps:
- uses: kachick/[email protected]
with:
skip-list: |
[
{
"workflowFile": "this_file_name.yml",
"jobMatchMode": "prefix",
"jobName": "${{ github.job }}"
}
]
- run: make testThis action only checks the status of jobs at each polling time.
Use this option when a job may start with a short delay after this action starts.
Example using a wait-list.
with:
wait-list: |
[
{
"workflowFile": "might_be_triggered_after_0-4_minutes.yml",
"optional": false,
"startupGracePeriod": "PT5M"
}
]This action starts immediately but ignores the job missing in the first 5 minutes.
- No need to extend
warmup-delay - Disable
optional, because it is needed to check - Set a sufficient value for
startupGracePeriod.
Use the ISO 8601 duration format.
If you're not using wait-list, you need to handle this pattern with warmup-delay.
gh commands, such as gh pr checks and gh run watch, should be useful if your requirements are simple.
- If any workflow starts many jobs as 100+, this action does not support it.
Because nested paging in GraphQL is complex. See related docs for further detail.
The scripts and documentation in this project are released under the MIT License