Tools: GitHub Actions Has Free CI/CD — 2,000 Minutes/Month for Open Source - Full Analysis
Every Push Should Be Tested
GitHub Actions: CI/CD Built Into GitHub
Free Tier
Your First Workflow
Deploy on Merge
Useful Patterns
20,000+ Marketplace Actions
GitHub Actions vs Alternatives
Get Started You merge a PR. Tests pass locally. Production breaks. Because nobody ran the tests against the actual environment. CI/CD exists to catch this. GitHub Actions makes it free. GitHub Actions runs workflows directly in your GitHub repository. No external service. No webhook setup. No separate dashboard. Push this file. Every PR now runs tests automatically. Merge to main → build → deploy to Cloudflare Workers. Automatically. Matrix Testing (Test on Multiple Versions) Create .github/workflows/ci.yml in your repo. Push. Done. Automate your data collection with CI/CD. 88+ scrapers on Apify. Custom: [email protected] Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse
# .github/workflows/ci.yml
name: CI on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 - run: -weight: 500;">npm ci - run: -weight: 500;">npm test
# .github/workflows/ci.yml
name: CI on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 - run: -weight: 500;">npm ci - run: -weight: 500;">npm test
# .github/workflows/ci.yml
name: CI on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 - run: -weight: 500;">npm ci - run: -weight: 500;">npm test
name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: -weight: 500;">npm ci && -weight: 500;">npm run build - uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CF_API_TOKEN }}
name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: -weight: 500;">npm ci && -weight: 500;">npm run build - uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CF_API_TOKEN }}
name: Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: -weight: 500;">npm ci && -weight: 500;">npm run build - uses: cloudflare/wrangler-action@v3 with: apiToken: ${{ secrets.CF_API_TOKEN }}
jobs: test: strategy: matrix: node-version: [18, 20, 22] os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: -weight: 500;">npm test
jobs: test: strategy: matrix: node-version: [18, 20, 22] os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: -weight: 500;">npm test
jobs: test: strategy: matrix: node-version: [18, 20, 22] os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: -weight: 500;">npm test
on: schedule: - cron: '0 9 * * 1' # Every Monday at 9 AM
on: schedule: - cron: '0 9 * * 1' # Every Monday at 9 AM
on: schedule: - cron: '0 9 * * 1' # Every Monday at 9 AM
jobs: call-tests: uses: ./.github/workflows/tests.yml with: environment: staging
jobs: call-tests: uses: ./.github/workflows/tests.yml with: environment: staging
jobs: call-tests: uses: ./.github/workflows/tests.yml with: environment: staging - 2,000 minutes/month (Linux) for private repos
- Unlimited minutes for public repos
- 500MB storage for artifacts
- Concurrent jobs: up to 20 - actions/cache: Cache dependencies for faster builds
- -weight: 500;">docker/build-push-action: Build and push Docker images
- peaceiris/actions-gh-pages: Deploy to GitHub Pages
- actions/upload-artifact: Share files between jobs