GitHub Actions Certification
GitHub Actions Core Concepts
Additional Matrix Configuration
In this guide, you’ll learn how to leverage advanced matrix features in GitHub Actions to:
- Exclude specific job combinations
- Include custom job combinations
- Control failure propagation (
fail-fast) - Limit concurrent executions (
max-parallel)
These techniques help you optimize CI/CD workflows for Docker images, operating systems, and more. For full details, see the GitHub Actions workflow syntax for strategy.matrix.
1. Base Matrix Example
The simplest matrix runs two Docker images (hello-world, alpine) across three operating systems (ubuntu-latest, ubuntu-20.04, windows-latest):
on:
workflow_dispatch:
jobs:
deploy:
strategy:
matrix:
os: [ubuntu-latest, ubuntu-20.04, windows-latest]
images: [hello-world, alpine]
runs-on: ${{ matrix.os }}
steps:
- name: Show Docker Info
run: docker info
- name: Run ${{ matrix.images }} on ${{ matrix.os }}
run: docker run ${{ matrix.images }}
This configuration produces 3 × 2 = 6 jobs, all running in parallel. By default, if one job fails, the remaining jobs are canceled (the fail-fast behavior).
2. Excluding Specific Combinations
If a particular image isn’t compatible with an OS, you can remove that pair using exclude:
on:
workflow_dispatch:
jobs:
deploy:
strategy:
matrix:
os: [ubuntu-latest, ubuntu-20.04, windows-latest]
images: [hello-world, alpine]
exclude:
- os: windows-latest
images: alpine
runs-on: ${{ matrix.os }}
steps:
- name: Show Docker Info
run: docker info
- name: Run ${{ matrix.images }} on ${{ matrix.os }}
run: docker run ${{ matrix.images }}
Now you’ll get only 5 jobs—omitting the windows-latest + alpine combination.
3. Including Custom Combinations
To add specialized pairings not covered by the default lists, use include. For example, run the amd64/alpine image on Ubuntu 20.04:
on:
workflow_dispatch:
jobs:
deploy:
strategy:
matrix:
os: [ubuntu-latest, ubuntu-20.04, windows-latest]
images: [hello-world, alpine]
exclude:
- os: windows-latest
images: alpine
include:
- os: ubuntu-20.04
images: amd64/alpine
runs-on: ${{ matrix.os }}
steps:
- name: Show Docker Info
run: docker info
- name: Run ${{ matrix.images }} on ${{ matrix.os }}
run: docker run ${{ matrix.images }}
This adds one more job—Ubuntu 20.04 + amd64/alpine—for a total of 6 jobs.
4. Controlling Failure and Concurrency
Fine-tune your workflow execution with these two settings:
| Setting | Description | Default |
|---|---|---|
| fail-fast | Cancel in-progress or queued jobs when one fails | true |
| max-parallel | Maximum number of matrix jobs running at the same time | unlimited |
Note
Use fail-fast: false to let other jobs complete even if one fails, and set max-parallel to control resource usage in large matrices.
Example—the same matrix as before, with explicit failure and concurrency control:
on:
workflow_dispatch:
jobs:
deploy:
strategy:
fail-fast: false
max-parallel: 2
matrix:
os: [ubuntu-latest, ubuntu-20.04, windows-latest]
images: [hello-world, alpine]
exclude:
- os: windows-latest
images: alpine
include:
- os: ubuntu-20.04
images: amd64/alpine
runs-on: ${{ matrix.os }}
steps:
- name: Show Docker Info
run: docker info
- name: Run ${{ matrix.images }} on ${{ matrix.os }}
run: docker run ${{ matrix.images }}
- With
fail-fast: false, failures don’t cancel other jobs. - With
max-parallel: 2, only two jobs run concurrently; queued jobs start as others finish.
By mastering exclude, include, fail-fast, and max-parallel, you gain precise control over matrix workflows in GitHub Actions.

Watch Video
Watch video content