Skip to content

kachick/wait-other-jobs

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Repository files navigation

wait-other-jobs

Itself
gracePeriod eventName matrix
CI

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.

Usage

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

Guide for option syntax and reasonable values

Schema of wait-list and skip-list

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 the startupGracePeriod that described in following section
    • Wait for all event types by default, you can change with "eventName": "EVENT_NAME_AS_push".

Required GITHUB_TOKEN permissions

In public repositories, they are satisfied by default

permissions:
  contents: read # Since v2
  checks: read
  actions: read

Support for Github Enterprise

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'

outputs.<output_id>

These outputs are for testing and debugging only. The schema is not defined.

  • parameters
    Parsed values from with and some context.

  • dump
    A file path for collected resources which keeps fields than logged.

Examples

I'm using this action for auto-merging bot PRs and wait for deploy.
See the docs for further detail.

Deadlocks

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.

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

Startup grace period

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.

Alternative candidates

gh commands, such as gh pr checks and gh run watch, should be useful if your requirements are simple.

Limitations

  • 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.

License

The scripts and documentation in this project are released under the MIT License

About

☕ Wait for jobs, even across workflows

Topics

Resources

License

Stars

Watchers

Forks

Contributors 7