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/wait-other-jobs@v3.8.1
timeout-minutes: 15 # Recommended to be enabled with your appropriate value for fail-safe use
You can configure the token, polling interval, allow/deny lists, and early-exit behavior as shown below.
with:
warmup-delay: 'PT30S' # default 'PT10S'
minimum-interval: 'PT300S' # default 'PT15S'
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",
"eventName": "${{ github.event_name }}"
},
{
"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 |
PT10S |
ISO 8601 duration format |
minimum-interval |
Wait for this or a longer interval between each poll to reduce GitHub API calls | string |
PT15S |
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 |
|
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 |
- ISO 8601 duration format
- Trailing commas are not allowed in JSON
- GitHub API Limit: At least we should consider about
GITHUB_TOKEN
, that is allowed 1000 per hour per repository.
Roughly calculating for long jobs, setting theminimum-interval
larger than or equalPT4S
would be safer.
Lists should be given with JSON array, do not use both wait-list and skip-list together
- Each item should have a "workflowFile" field, and they can optionally have a "jobName" field.
- If no jobName is specified, all the jobs in the workflow will be targeted.
- wait-list:
- If the checkRun for the specified name is not found, this action raise errors by default.
You can disable this validation with"optional": true
or use thestartupGracePeriod
that described in following section - Wait for all event types by default, you can change with
"eventName": "EVENT_NAME_AS_push"
.
- If the checkRun for the specified name is not found, this action raise errors by default.
In public repositories, they are satisfied by default
permissions:
contents: read # Since v2
checks: read
actions: read
To 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 fromwith
and some context. -
dump
A file path for collected resources which keeps fields than logged.
I'm using this action for auto-merging bot PRs and wait for deploy.
See the docs for further detail.
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 default job name if you not specify below "name" field
name: 'Changed at here'
runs-on: ubuntu-24.04
steps:
- uses: kachick/wait-other-jobs@v3.8.1
with:
skip-list: |
[
{
"workflowFile": "this_file_name.yml",
"jobName": "Changed at here"
}
]
timeout-minutes: 15
You 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 prefix
for jobMatchMode
to create small skip-list to avoid this problem.
jobs:
your_job:
strategy:
matrix:
os:
- ubuntu-24.04
- ubuntu-22.04
runs-on: ${{ matrix.os }}
steps:
- uses: kachick/wait-other-jobs@v3.8.1
with:
skip-list: |
[
{
"workflowFile": "this_file_name.yml",
"jobMatchMode": "prefix",
"jobName": "${{ github.job }}"
}
]
- run: make test
This 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": { "minutes": 5 }
}
]
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 enough value for
startupGracePeriod
for this purpose.
It must be parsible by TC39 - Temporal.Duration
e.g"PT3M42S"
# ISO 8601 duration format{ "minutes": 3, "seconds": 42 }
# key-value for each unit
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 of nested paging in GraphQL makes complex. See related docs for further detail.
The scripts and documentation in this project are released under the MIT License