GitHub Actions Workflows I Use on Every Project
GitHub Actions Workflows I Use on Every Project
After setting up CI for dozens of projects, I've converged on a set of GitHub Actions workflows that I copy into every new repository. They're not fancy, but they catch the problems that matter before they reach production.
The Lint Workflow
Runs on every push. ESLint for JavaScript/TypeScript, Prettier for formatting, and type checking with tsc --noEmit. Fails fast — if the code doesn't type-check, don't bother running tests. This saves minutes on every CI run and enforces that type errors are never "we'll fix it later."
The Test Workflow
Runs on every push to main and every pull request. Matrix strategy across Node.js versions. Runs unit tests, integration tests, and coverage reports. Posts coverage to PRs as a comment so reviewers can see at a glance whether the change increases or decreases coverage.
The Build Workflow
Runs on pushes to main. Builds the production artifact, runs any build-time checks, and caches the build output. For Docker-based projects, this is where multi-stage builds happen. For static sites, this is where the export runs. The build artifact is what gets deployed — never rebuild during deployment.
The Deploy Workflow
Triggers on successful build workflow completion on main. Deploys the built artifact to the target environment. Uses environment protection rules for production — required reviewers, wait timers, and deployment locks. No one deploys to production by accident.
$ /related
Docker Multi-Stage Builds for Fintech Microservices
How multi-stage Docker builds reduce image sizes by 80% for fintech microservices while maintaining security compliance requirements.
Building a CI/CD Pipeline for Regulated Financial Software
How to build CI/CD pipelines that satisfy both engineering velocity goals and regulatory compliance requirements — not an either/or choice.
The 5 Pillars That Separate Good Architecture from Bad
A cloud-agnostic breakdown of the Well-Architected Framework: the five pillars, tradeoffs, maturity levels, and how I apply them in production systems.