Day 51intermediateMar 23, 2026

Speed Up Pipelines by Running Jobs in Parallel

Parallel jobs can cut your pipeline time in half by running independent checks simultaneously.

cicdperformancegithub-actions
Share:

What

By default, GitHub Actions jobs run in parallel unless you add the needs keyword to create dependencies. Structuring independent jobs like lint, test, and security-scan to run concurrently can cut total pipeline time significantly. Only jobs that truly depend on each other should be sequential.

Why It Matters

A pipeline where lint waits for tests, and tests wait for the build, takes the sum of all job times. But if lint, tests, and security scanning don't depend on each other, running them in parallel means your total pipeline time equals only the longest single job. A 15-minute sequential pipeline can become a 5-minute parallel one.

Example

# .github/workflows/ci.yml
name: CI Pipeline
on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm audit --audit-level=high

  # This job waits for ALL three above to pass
  deploy:
    needs: [lint, test, security-scan]
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - run: echo "Deploying after all checks passed"
yaml

Common Mistake

Making all jobs sequential with needs when they don't actually depend on each other. Adding needs: build to both lint and test forces them to run one after the other, even though linting doesn't need build output.

Quick Fix

Only use needs when a job truly requires output from another job. Ask yourself: does this job need files or results from the previous job? If not, remove the needs dependency and let it run in parallel.

Key Takeaways

  • 1GitHub Actions jobs run in parallel by default
  • 2Use needs only when a job truly depends on another
  • 3Lint, test, and security-scan can run simultaneously
  • 4Deploy job uses needs: [lint, test, security-scan] to wait for all
  • 5Parallel pipelines = total time of the longest job, not the sum

Was this tip helpful?

Help us improve the DevOpsPath daily collection

Share: