My first CI/CD pipeline cost $50/month on CircleCI. It ran tests, built a Docker image, and deployed to staging. That was 2019.
Today, GitHub Actions does all of that for free. 2,000 minutes per month on public repos (unlimited). I've moved every personal project to it.
What You Get Free
For public repositories — everything is unlimited. For private repos:
- 2,000 minutes/month on Linux runners (500 on macOS, 4x rate)
- 500MB storage for artifacts and caches
- Unlimited workflows per repository
- Matrix builds — test against multiple OS/language versions in parallel
- Reusable workflows — DRY principle for CI/CD
- Secrets management — encrypted environment variables
- Environments — staging, production with protection rules
- OIDC — keyless authentication to AWS, GCP, Azure
- Marketplace — 15,000+ pre-built actions
- Self-hosted runners — use your own hardware (unlimited minutes)
Public repos get unlimited minutes on all runner types. That's not a typo.
Quick Start
Create .github/workflows/ci.yml:
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm test
Push to GitHub → CI runs automatically. Green check = tests pass. Red X = fix your code.
Real Example: Full CI/CD Pipeline
name: Build, Test & Deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: \${{ matrix.node-version }}
cache: npm
- run: npm ci
- run: npm test
- run: npm run lint
build:
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: \${{ github.actor }}
password: \${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v5
with:
push: true
tags: ghcr.io/\${{ github.repository }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build
runs-on: ubuntu-latest
environment: production
steps:
- run: |
curl -X POST \${{ secrets.DEPLOY_WEBHOOK }}
Three jobs: test across Node 18/20/22, build Docker image, deploy. All free on a public repo.
What You Can Build
1. Full CI/CD — test, build, deploy on every push. Replace Jenkins, CircleCI, Travis.
2. Scheduled tasks — schedule: cron: '0 9 * * *' runs daily. Free cron jobs in the cloud.
3. Auto-release — bump version, create changelog, publish to npm/PyPI on merge to main.
4. Security scanning — run Dependabot, CodeQL, Trivy on every PR. Catch vulnerabilities before merge.
5. Cross-platform testing — matrix of OS (Linux, macOS, Windows) × language versions. Ensure compatibility everywhere.
Free Tier Limits
Private repos: 2,000 min/month. A typical CI run is 2-5 minutes. ~400-1,000 runs/month. Fine for solo devs, tight for active teams.
macOS is 10x rate. 1 minute of macOS = 10 minutes of Linux quota. Use macOS runners sparingly.
No GPU runners on free tier. ML testing needs self-hosted or paid runners.
6-hour job timeout. Individual jobs can't exceed 6 hours. Workflows can't exceed 35 days.
Concurrency limits. Free tier: 20 concurrent jobs. Usually not an issue.
Why GitHub Actions Wins
It's where your code already lives. No separate CI service login, no webhook configuration, no YAML in a different format. .github/workflows/*.yml — that's it.
The marketplace of 15,000+ actions means you rarely write CI logic from scratch. Need to deploy to Vercel? uses: amondnet/vercel-action@v25. AWS? uses: aws-actions/configure-aws-credentials@v4. Most things are one line.
Need CI/CD automation help? Email spinov001@gmail.com
More free tiers: 41+ Free APIs Every Developer Should Bookmark
Top comments (0)