Ismat Samadov
  • Tags
  • About

© 2026 Ismat Samadov

RSS
15 min read/1 views

GitHub Actions Is the Only CI/CD You Need in 2026

I deleted our Jenkins server and replaced it with 4 YAML files. Here's why GitHub Actions is the only CI/CD most teams need in 2026.

DevOpsGitHubCICDAutomationBackend

Related Articles

SLOs Changed How We Ship Software — Error Budgets, Burn Rates, and Why 99.99% Uptime Is a Lie

15 min read

OWASP Top 10 for LLM Applications: The Attacks Your AI App Isn't Ready For

15 min read

Terraform Is Legacy Now — Pulumi, CDKTF, and the Infrastructure-as-Real-Code Movement

14 min read

Enjoyed this article?

Get new posts delivered to your inbox. No spam, unsubscribe anytime.

On this page

  • The Numbers
  • Why GitHub Actions Won
  • 1. Zero infrastructure to manage
  • 2. It lives where your code lives
  • 3. The Marketplace is the cheat code
  • 4. Reusable workflows and composite actions
  • 5. The pricing is actually reasonable
  • The Workflows I Use for Everything
  • Workflow 1: CI on every PR
  • Workflow 2: Deploy on merge to main
  • Workflow 3: Scheduled tasks (cron)
  • Workflow 4: Release tagging
  • The Security Stuff Most People Skip
  • Where GitHub Actions Falls Short (Honestly)
  • Build speed
  • Complex orchestration
  • Vendor lock-in
  • The self-hosted runner pricing drama
  • Debugging is painful
  • YAML verbosity
  • When to Use Something Else
  • The Setup Checklist (For Teams Starting Today)
  • Tricks That Saved Me Hours
  • What I Actually Think
  • Sources

Last month I deleted our Jenkins server. Two years of YAML configs, Groovy scripts, plugin updates, and "why is the build broken AGAIN?" — gone. Replaced by a single .github/workflows directory with four YAML files. Our deploy pipeline went from 22 minutes to 6. Our CI maintenance dropped from "half a person's job" to "nobody's job."

I'm not saying GitHub Actions is perfect. I'm saying it's the only CI/CD tool most teams need in 2026. And the data backs that up.


The Numbers

The CI/CD tools market was valued at $1.73 billion in 2025 and is projected to reach $5.36 billion by 2031, growing at 20.72% CAGR. The broader DevOps market hit $16.13 billion in 2025 and is heading toward $51.43 billion by 2031.

GitHub Actions is eating this market alive. Daily workflow runs climbed past 5 million, with continuous deployment usage increasing 50% year over year. The Actions Marketplace now has over 20,000 actions, growing at 41% annually. 68% of GitHub open-source projects use Actions for CI/CD.

Meanwhile, Jenkins — the tool that ruled CI/CD for a decade — is losing market share at 8% year over year. It's still in 80% of Fortune 500 companies, but that's legacy, not choice.

Something shifted. Let me explain what happened.


Why GitHub Actions Won

1. Zero infrastructure to manage

Jenkins needs a server. That server needs Java. Java needs updates. The server needs plugins. Plugins need updates. Plugins conflict with each other. You need someone to babysit all of this. Forever.

GitHub Actions? It's just YAML files in your repo. GitHub manages the runners, the compute, the scaling, and the updates. You don't install anything. You don't maintain anything. You push code and your pipeline runs.

For teams under 50 engineers, this is the entire argument. The cost of maintaining Jenkins or a self-hosted GitLab CI instance is higher than the cost of GitHub Actions itself — not in dollars, but in engineering time that should be going to your product.

2. It lives where your code lives

This sounds trivial. It's not. When your CI/CD is in the same platform as your code, pull requests, issues, and code reviews, everything connects naturally. A PR check fails? Click to see the logs. Want to deploy on merge to main? One trigger line. Need to run a workflow when an issue is labeled? Built-in.

No webhooks to configure. No third-party integrations to maintain. No "let me check what triggered this build" because the context is right there.

3. The Marketplace is the cheat code

Need to deploy to AWS? There's an action. Set up Node.js with caching? Action. Run Lighthouse audits? Action. Post a Slack notification? Action. Label stale issues? Action.

The 20,000+ actions in the Marketplace mean you're assembling pipelines from tested, community-maintained building blocks instead of writing everything from scratch. Here's a real CI pipeline for a Next.js app:

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
          cache: 'npm'
      - run: npm ci
      - run: npm run lint
      - run: npm run type-check
      - run: npm test

That's it. Lint, type-check, and test on every push and PR. Caching is automatic. Node.js setup is one line. The whole thing runs in about 90 seconds.

Compare that to Jenkins, where the same pipeline requires installing the NodeJS plugin, configuring a global tool installation, writing a Jenkinsfile with pipeline syntax, and hoping the agent has the right version of npm. Oh, and the YAML is committed to your repo alongside your code — not sitting in a Jenkins UI that nobody remembers how to access.

4. Reusable workflows and composite actions

This is the feature that separates "I have a workflow file" from "I have a CI/CD platform." Reusable workflows let you define a pipeline once and call it from multiple repositories. Composite actions let you package a sequence of steps into a single reusable action.

Standardization through composite actions has reduced maintenance effort by 70% in real-world cases. I have a composite action for "setup Node.js, install dependencies, run build" that I use across nine projects. When I upgrade Node.js versions, I change one file. Nine repos update automatically.

# .github/actions/setup-node/action.yml
name: Setup Node
description: Install Node.js and dependencies with caching
runs:
  using: composite
  steps:
    - uses: actions/setup-node@v4
      with:
        node-version: 22
        cache: 'npm'
    - run: npm ci
      shell: bash

Then in any workflow:

steps:
  - uses: actions/checkout@v4
  - uses: ./.github/actions/setup-node
  - run: npm test

Three lines replace ten. Across nine repos, that's real DRY. Jenkins has shared libraries for this, but they require a separate repo, Groovy knowledge, and a specific configuration on the Jenkins server. GitHub Actions keeps it in the same repo, in the same YAML format you already know.

5. The pricing is actually reasonable

GitHub Actions is free for public repositories — unlimited minutes. For private repos, free plans get 2,000 minutes per month. Pro gets 3,000. Team and Enterprise get more.

As of January 2026, GitHub reduced runner pricing by up to 39%. And 96% of customers see no change to their bill under the new pricing model.

Here's how the costs compare:

PlatformFree TierPaid PricingSelf-Hosted Option
GitHub Actions2,000 min/month (private)$0.008/min (Linux)Yes ($0.002/min platform fee)
GitLab CI400 min/month$0.005/min (Linux)Yes (free)
CircleCI6,000 credits/month (~300 min)$0.006/min (Linux)Yes (free tier)
JenkinsN/A (self-hosted)Free (but you pay for servers)Yes (it IS self-hosted)

The hidden cost that most comparisons miss: Jenkins is "free" but someone has to maintain it. A senior DevOps engineer costs $150K+/year. If they spend even 20% of their time maintaining Jenkins, that's $30K/year in hidden CI/CD costs. GitHub Actions costs most small teams $0.


The Workflows I Use for Everything

After two years on GitHub Actions, I've settled on four core workflows that cover every project I work on.

Workflow 1: CI on every PR

name: CI
on:
  pull_request:
    branches: [main]

permissions:
  contents: read

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: 'npm'
      - run: npm ci
      - run: npm run lint
      - run: npm run type-check
      - run: npm test -- --coverage

Workflow 2: Deploy on merge to main

name: Deploy
on:
  push:
    branches: [main]

permissions:
  contents: read
  id-token: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: 'npm'
      - run: npm ci
      - run: npm run build
      - name: Deploy to Vercel
        run: npx vercel --prod --token ${{ secrets.VERCEL_TOKEN }}

Workflow 3: Scheduled tasks (cron)

name: Weekly Audit
on:
  schedule:
    - cron: '0 9 * * 1'  # Every Monday at 9 AM UTC

jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: 'npm'
      - run: npm ci
      - run: npm audit --production
      - run: npx npm-check-updates

Workflow 4: Release tagging

name: Release
on:
  push:
    tags:
      - 'v*'

permissions:
  contents: write

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          generate_release_notes: true

Four files. CI, deploy, maintenance, and releases. That covers 95% of what any project needs.


The Security Stuff Most People Skip

This section matters more than the rest of the article combined. Supply chain attacks through CI/CD pipelines are real and growing. The tj-actions/changed-files breach in 2025 demonstrated that a compromised Marketplace action can inject malicious code into thousands of downstream repositories.

Here's my security checklist:

1. Pin actions to commit SHAs, not tags.

# Bad — tag can be moved to a compromised commit
- uses: actions/checkout@v4

# Good — immutable reference
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11

Tags can be moved. Commit SHAs can't. Yes, it's ugly. Yes, it prevents silent supply chain attacks.

2. Set minimum GITHUB_TOKEN permissions.

permissions:
  contents: read  # Only what you need

By default, the GITHUB_TOKEN may have more access than your workflow needs. Always set the minimum required permissions at the workflow or job level.

3. Use OIDC instead of long-lived secrets.

Instead of storing AWS access keys as repository secrets, use OpenID Connect to get short-lived credentials directly from your cloud provider. No secrets to rotate. No credentials to leak.

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v4
  with:
    role-to-assume: arn:aws:iam::123456789:role/github-actions
    aws-region: us-east-1

4. Never log secrets or pass them as CLI arguments. Secrets in command-line arguments end up in process lists and shell history. Use environment variables instead.

5. Audit your workflows quarterly. Check which Marketplace actions you're using, whether they've been updated, and whether they've changed ownership.


Where GitHub Actions Falls Short (Honestly)

I said it's the only CI/CD you need. I didn't say it's the best at everything. Here's where it struggles:

Build speed

Default GitHub-hosted runners are slow compared to specialized alternatives. A 2-vCPU Linux runner with 7GB RAM is fine for most builds, but if you're compiling large projects, building Docker images, or running heavy test suites, you'll feel the pain.

Solutions exist: larger runners (4x, 8x, 16x vCPU), self-hosted runners on your own hardware, or third-party runner services like Blacksmith and Depot that claim 2-3x faster builds with better caching.

Complex orchestration

If you need fan-out/fan-in patterns across 50+ parallel jobs, conditional deployment pipelines that span multiple environments with manual approvals and rollback gates, or build matrices with complex dependency graphs — GitHub Actions can do it, but the YAML gets ugly fast.

GitLab CI's DAG (directed acyclic graph) pipelines handle this more elegantly. Argo Workflows or Tekton are better for Kubernetes-native orchestration. If your pipeline looks like a flowchart with 20 boxes, you might need a more powerful tool.

Vendor lock-in

Your workflow files are GitHub-specific. If you ever move to GitLab or Bitbucket, you're rewriting everything. The YAML syntax, the action references, the environment variables, the secrets model — none of it ports.

For most teams this isn't a real concern. But for enterprises with multi-cloud strategies or regulatory requirements about platform diversity, it's worth noting.

The self-hosted runner pricing drama

In December 2025, GitHub announced it would charge $0.002 per minute for self-hosted runner usage in private repositories — a change that sparked outrage among developers who were running builds on their own hardware. GitHub delayed implementation to March 2026 after pushback.

The charge covers the Actions "control plane" — orchestration, scheduling, and workflow automation. It's small ($0.12/hour), but the principle bothered people: you're paying GitHub to use your own machines.

Debugging is painful

When a workflow fails, you get a log dump. No interactive debugging. No SSH into the runner (unless you set up a tmate action, which is a hack). No breakpoints. You add echo statements, push, wait for the runner to spin up, wait for the build to reach your step, read the log, repeat.

For complex pipeline failures, this trial-and-error debugging loop is maddening. Jenkins at least lets you replay a stage. GitLab CI has an interactive terminal. GitHub Actions gives you... logs.

The act tool lets you run workflows locally, which helps, but it doesn't perfectly replicate the GitHub-hosted runner environment. Container differences, secret handling, and Marketplace action compatibility all break in subtle ways.

YAML verbosity

Every CI/CD tool uses YAML, but GitHub Actions YAML gets verbose fast. Matrix builds, conditional steps, environment variables, output passing between jobs — it all adds up. A complex multi-environment deployment pipeline can easily hit 200+ lines of YAML. That's hard to review, hard to test, and easy to get wrong.

Reusable workflows help, but they add indirection. "Where is this step defined?" becomes a question you ask often in larger setups.


When to Use Something Else

GitHub Actions is the right default. But defaults don't cover every situation.

ScenarioBetter AlternativeWhy
Heavy Docker/container buildsDepot, BuildkitePurpose-built caching, 2-3x faster
Enterprise compliance with audit trailsGitLab CIIntegrated security scanning, +34% enterprise growth
Kubernetes-native pipelinesArgo Workflows, TektonRuns inside your cluster, CRD-based
Massive parallelism (100+ jobs)CircleCI, BuildkiteBetter orchestration and queue management
Air-gapped environmentsJenkins, DroneFully self-contained, no external dependencies
Multi-platform mobile buildsBitrise, CodemagiciOS/Android-specific optimizations

The key question: is your CI/CD pipeline a product feature or a utility? If it's a utility — runs tests, deploys code, stays out of your way — GitHub Actions is the answer. If it's a product feature — complex release orchestration, compliance workflows, multi-environment promotion — you might need something more specialized.


The Setup Checklist (For Teams Starting Today)

If you're migrating from Jenkins or setting up CI/CD from scratch, here's the order I'd do things:

  1. Day 1: Create a .github/workflows/ci.yml that runs lint, type-check, and tests on every PR. Use actions/setup-node@v4 (or equivalent for your stack) with caching enabled.

  2. Day 2: Add a deploy.yml that triggers on merge to main. Use environment protection rules for production — require reviews and limit which branches can deploy.

  3. Day 3: Set up OIDC authentication with your cloud provider. Remove all long-lived access keys from repository secrets.

  4. Week 1: Pin all third-party actions to commit SHAs. Set explicit permissions on every workflow. Enable Dependabot for GitHub Actions to get automatic PR updates when actions release new versions.

  5. Week 2: Add a scheduled workflow for dependency audits, stale issue cleanup, or whatever maintenance tasks your team does manually today.

  6. Ongoing: Review Marketplace actions before adding them. Check the publisher, star count, recent activity, and security practices. Prefer official actions (from actions/ or the tool vendor) over community forks.

Total time to set up a production-grade CI/CD pipeline: about a week. Compare that to Jenkins, where standing up the server alone takes a day, and you'll spend the next month configuring plugins.


Tricks That Saved Me Hours

A few non-obvious features that make GitHub Actions significantly more powerful:

Concurrency controls. Stop wasting minutes on outdated builds. If you push twice in rapid succession, the first workflow run is already irrelevant. Cancel it automatically:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

This alone saved our team around 400 wasted build minutes per month.

Path filters. Don't run your entire test suite when someone edits the README:

on:
  push:
    paths:
      - 'src/**'
      - 'tests/**'
      - 'package.json'
    paths-ignore:
      - '*.md'
      - 'docs/**'

Matrix strategies for cross-version testing. Test against multiple Node.js versions or operating systems in parallel:

strategy:
  matrix:
    node-version: [18, 20, 22]
    os: [ubuntu-latest, windows-latest]
  fail-fast: false

Six parallel jobs from four lines of config. Try doing that in Jenkins without a plugin.

Environment protection rules. For production deployments, require manual approval from specific team members. This is built into GitHub — no third-party tool needed. Configure it in repo Settings, then reference the environment in your workflow:

jobs:
  deploy:
    environment:
      name: production
      url: https://yourapp.com

Anyone who pushes to main will trigger the deploy workflow, but it pauses and waits for approval before actually deploying. Simple, auditable, and built-in.

Cache everything. Node modules, pip packages, compiled artifacts. The actions/cache@v4 action is good, but actions/setup-node@v4 with cache: 'npm' handles it automatically for JavaScript projects. Caching dropped our install step from 45 seconds to 3 seconds.


What I Actually Think

GitHub Actions isn't the most powerful CI/CD platform. It's not the fastest. It's not the most configurable. GitLab CI has better security scanning. CircleCI has faster builds. Jenkins has infinite extensibility.

But GitHub Actions is the most practical choice for the vast majority of teams in 2026. And practical wins.

It wins because you don't need a DevOps engineer to set it up. It wins because the Marketplace means most problems already have a solution. It wins because it lives where your code already lives. And it wins because the free tier is generous enough that most small teams never pay a dime.

I've used Jenkins (maintained it for 2 years — never again), GitLab CI (solid but the platform is heavy), CircleCI (fast but another vendor to manage), and now GitHub Actions. The productivity difference isn't close. We ship more, maintain less, and debug CI problems maybe once a quarter instead of once a week.

The biggest mistake teams make with CI/CD is over-engineering it. You don't need Argo Workflows for a Next.js app. You don't need Tekton for a Python API. You need a YAML file that runs your tests and deploys your code. That's it.

GitHub Actions does that better than anything else for the price of zero dollars and zero maintenance hours.

Start there. Graduate if you outgrow it. Most teams never will.

One last thought: the best CI/CD pipeline is the one your team actually understands. I've seen 500-line Jenkinsfiles that nobody could modify without the original author. I've seen Argo Workflows setups that only the DevOps team could touch. GitHub Actions isn't perfect, but a junior developer can read a workflow file and understand what it does in five minutes. That's worth more than any feature comparison table.


Sources

  1. Continuous Integration Tools Market Size — Mordor Intelligence
  2. DevOps Market Size and Forecast — Mordor Intelligence
  3. GitHub Statistics 2026 — CoinLaw
  4. Best CI/CD Tools for 2026 — JetBrains TeamCity Blog
  5. Pricing Changes for GitHub Actions 2026 — GitHub
  6. Reduced Pricing for GitHub-Hosted Runners — GitHub Changelog
  7. GitHub Actions Billing and Usage — GitHub Docs
  8. Securing CI/CD After tj-actions Supply Chain Attacks — OpenSSF
  9. GitHub Actions Security Secure Use — GitHub Docs
  10. OpenID Connect for GitHub Actions — GitHub Docs
  11. GitHub Walks Back Plan to Charge for Self-Hosted Runners — The Register
  12. GitHub Actions Runners Are Slow — Medium