It’s been about two months since GitHub Actions went generally available in November 2019, and the dust is starting to settle. I’ve been migrating several projects from Travis CI and CircleCI over the holiday break, and I want to share what I’m seeing — because I think the CI/CD landscape is about to shift in a way we haven’t seen since Jenkins went mainstream.
The Marketplace Effect#
The most underappreciated aspect of GitHub Actions isn’t the YAML syntax or the runner infrastructure — it’s the marketplace. The GitHub Marketplace for Actions already has thousands of pre-built actions, and the number is growing rapidly.
This is the network effect at work. When your CI/CD system lives in the same platform as your code, your issues, your pull requests, and your package registry, the friction for creating and sharing automation drops to nearly zero. Want to add Slack notifications? There’s an action for that. Need to deploy to AWS? Dozens of options. Want to auto-label PRs based on file paths? Five minutes of YAML.
Compare this to writing a Jenkins plugin (Java, XML configuration, release process) or even a CircleCI orb (still requires its own repo, versioning, and publication). GitHub Actions reduced the barrier to “put a action.yml in a repo and push.” The result is an explosion of community-contributed automation.
In my experience over the last two months, I’d say about 70% of what I need is already available as a published action. The remaining 30% is custom logic that I can write as a simple shell script right in the workflow file.
What Migration Actually Looks Like#
I’ve been moving Node.js and Python projects, and here’s the honest assessment:
What’s great:
- The integration with pull requests is seamless. Status checks, annotations on specific lines of code, automatic check runs — it all just works because it’s native to the platform.
- Matrix builds are well-designed. Testing across Node 10/12/14 and Ubuntu/macOS/Windows is a clean, declarative matrix in YAML.
- The free tier is generous for open source: unlimited minutes on public repos. For private repos, you get 2,000 minutes/month on the free plan.
- Secrets management is straightforward. Repository and organization secrets integrate cleanly.
What’s rough:
- Debugging failed workflows is painful. You can’t SSH into a runner to inspect state (unlike CircleCI). You’re reading log output and re-pushing commits to trigger reruns. There are community actions that set up
tmatesessions, but it’s a workaround. - Caching is better than it was in beta but still not as intelligent as some competitors. The
actions/cacheaction requires you to explicitly define cache keys and paths. - YAML verbosity is real. Complex workflows with multiple jobs, conditions, and matrix strategies can become walls of YAML that are hard to review.
- The documentation, while improving, has gaps. I’ve found myself reading the source code of official actions to understand edge cases.
The Travis CI Question#
Let’s address the elephant in the room. Travis CI has been the default CI for open-source projects hosted on GitHub for the better part of a decade. That .travis.yml file has been a standard fixture in open-source repos.
With GitHub Actions offering unlimited free CI for public repos, with deeper GitHub integration, and without the pricing concerns that have dogged Travis CI since its acquisition by Idera in 2019 — the writing seems to be on the wall.
I’ve already noticed a trend in the open-source projects I follow: new projects almost universally choose GitHub Actions. Established projects are starting to add GitHub Actions workflows alongside their existing Travis configs, often with plans to deprecate the latter.
This isn’t necessarily a good thing. Monoculture in developer tooling carries risks. When GitHub had its outages in the past, it already took out code hosting, issue tracking, and package management. Adding CI/CD to that single point of failure is worth thinking about.
The Real Competition: GitLab CI#
While Travis and CircleCI face the most immediate pressure, I think the more interesting competitive dynamic is between GitHub Actions and GitLab CI/CD.
GitLab has had integrated CI/CD for years, and it’s genuinely excellent. Their pipeline syntax is mature, their runner infrastructure (including self-hosted runners) is battle-tested, and their Auto DevOps feature offers zero-config CI/CD for common project types.
What GitHub Actions has is distribution. GitHub hosts the overwhelming majority of open-source projects and a massive share of private repositories. GitLab’s CI is arguably more mature, but GitHub’s reach means Actions will likely see faster ecosystem growth.
For teams already on GitLab, I see no compelling reason to switch. GitLab CI is more feature-complete today. But for the millions of projects on GitHub that were using third-party CI, the gravitational pull of an integrated solution is strong.
Workflow Patterns I’ve Found Useful#
After migrating several repos, here are patterns that have worked well:
Reusable workflow fragments: Keep common steps in composite actions within your organization. We have a shared action for our standard Node.js build-test-lint sequence that every repo references.
Path-filtered triggers: Use on.push.paths and on.pull_request.paths to avoid running expensive test suites when only documentation changes. This saves minutes and keeps feedback loops fast.
Conditional deployments: The if conditionals on jobs work well for deploy-on-tag patterns:
deploy:
if: startsWith(github.ref, 'refs/tags/v')
needs: [test, lint]Dependabot + auto-merge: GitHub’s Dependabot creates PRs for dependency updates, and you can write an Actions workflow that auto-merges them when CI passes and the update is a patch version. This has dramatically reduced my dependency maintenance overhead.
My Take#
GitHub Actions is good enough today for most CI/CD workloads, and it’s going to get better fast. The marketplace ecosystem is its biggest advantage — it lowers the effort floor for CI/CD in a way that benefits everyone, especially smaller teams and open-source maintainers who don’t want to maintain complex pipeline configurations.
That said, I’d caution against migrating critical production deployment pipelines just yet. For build-and-test workflows on open source, it’s a no-brainer. For deploying to production, I’d want to see more maturity in areas like approval gates, environment management, and deployment tracking before going all-in.
The CI/CD landscape in 2020 is more competitive than it’s been in years, and that’s great for developers. Whether you’re on GitHub Actions, GitLab CI, CircleCI, or even good old Jenkins — the bar is being raised for everyone.
