A strategy.matrix turns one job into several: each key is a list, GitHub 29 runs the job once per combination, and the values are available as matrix.<key>. This is the top of ci.yml:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
jobs:
test:
name: test (${{ matrix.os }}, node ${{ matrix.node }})
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm]
node: [24, 26]
experimental: [false]
exclude:
- {os: ubuntu-24.04-arm, node: 26}
include:
- {os: ubuntu-24.04, node: 22, experimental: true}Two systems times two Node.js 2,131 versions make four combinations; 3.10.2 removes one and adds one. The job name uses the matrix values, so checks read test (ubuntu-24.04-arm, node 24) and so on. Node.js 24 is BookNest's version (.nvmrc); 26, the current release, becomes LTS in October 2026, so testing it now reveals breakage early (setup-node downloaded 26.10.0). A matrix may create up to 256 jobs.