GitHub Actions patterns I use:

Matrix builds — Test multiple environments

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18, 20, 22]

Caching — Speed up builds

- uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

Fail fast — Stop on first error

jobs:
  test:
    continue-on-error: false  # Default, but explicit is good

Reusable workflows — DRY your CI

jobs:
  test:
    uses: ./.github/workflows/test.yml

The goal: fast feedback. If your CI takes too long, developers won't run it.