I like CI/CD when it’s boring: predictable, fast, and easy to debug.

What Jenkins is great at

  • Existing enterprise setups (agents, on-prem access, internal networks).
  • Complex pipelines that evolved over years.
  • Centralized control when repos are spread across platforms.

What GitHub Actions is great at

  • Fast onboarding, repo-local workflows.
  • Great integration with PRs, checks, and code owners.
  • Reusable workflows for consistent standards across projects.

Patterns I try to keep everywhere

  • Build once, test in parallel (unit/integration/lint).
  • Cache dependencies (but don’t hide flaky builds behind caches).
  • Artifacts are a contract (store build outputs, test reports).
  • Secrets and environments are explicit.
  • Fail fast and surface the real error (logs, exit codes, summaries).

If you’re choosing today for a small-to-medium team, Actions is usually the simplest path — unless you need the network realities Jenkins already solves.