Running One CI/CD Standard Across a Dozen Client Codebases
A custom software shop doesn't run one pipeline, it runs a dozen, each living in a different client's repository with different access rules, different deploy targets, and sometimes a different platform the client already picked before you arrived.
The question isn't which tool is objectively better. It's how you keep every project on a consistent standard without rebuilding the same workflow file from scratch each time you onboard a new client.
Vendors Covered in this Article
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
Step 1: decide who owns the repository
Before you write a single workflow file, settle whether the client's code will live in your organization or theirs, because that decides which CI platform you're using. If a client already runs GitLab internally and wants the work to land in their group when the engagement ends, building on GitLab CI from the start avoids a painful migration at handoff. If the repository lives in your own GitHub organization for the length of the build, GitHub Actions is the natural default.
Write this decision down in the project's kickoff notes. Nothing wastes more agency engineering time than a mid-project argument about which CI platform a nearly finished project should have used from day one.
Step 2: build one reusable template, not twelve pipelines
GitHub Actions' reusable workflows and GitLab CI's include keyword both let you define a standard pipeline once, in a template repository, and have every client project call it with a few project-specific inputs. That template should cover linting, running tests, and building a deployable artifact, with the deploy step parameterized by environment.
Without this, every new engineer who joins a project copies the last project's YAML file and tweaks it, and six months later no two client pipelines look alike. A shared template is the difference between a setup that takes an afternoon per new engagement and one that takes a day.
Step 3: gate the deploy step behind a real review
Client work carries a specific risk: the person approving a production deploy is often not the person who wrote the code, and clients expect a paper trail showing who signed off. Use required reviewers on a protected environment, GitHub Actions environments or GitLab's protected environments and approval rules, so a deploy to the client's production system needs an explicit approval from a lead, not just a passing test suite.
This also protects you contractually. When a client asks who approved a change that broke something, you want an answer in the pipeline's audit log, not in someone's memory.
Step 4: plan the handoff before the project starts
Client-facing engagements eventually end, and the pipeline has to keep running without you. Document the workflow file, the required secrets, and who at the client needs write access to the CI configuration, and do it at kickoff rather than in the final week. A pipeline that only your team understands isn't a deliverable, it's a liability you're handing the client along with the code.
DevOps spend for a private software company typically runs to a few percent of ARR1. If a client's pipeline still depends on your firm after handoff, that budgeted spend keeps flowing to you instead of becoming a line item they can plan around, which is a conversation worth having openly before the engagement ends.
What to check before quoting a new engagement
When scoping a new project, a few quick checks save you from underquoting the DevOps portion of the work:
- Does the client already have a CI platform preference, and does it match yours?
- Will the client need a staging environment with its own approval gate, or just a single production deploy?
- Who on the client side will own the pipeline after handoff, and do they know YAML?
- Does the project involve any regulated data that changes how build artifacts need to be retained or logged?
Getting these answers during scoping, not during week six, is what keeps a CI/CD standard from becoming a different improvisation on every engagement.
Training new engineers on the shared standard
A reusable pipeline template only pays off if every engineer who touches a client project actually understands it, rather than treating it as a black box they copy without reading. Walk new hires through the template during onboarding, specifically the parts that differ from a typical solo project: the required-reviewer gate, the artifact promotion step, and how secrets get scoped per client.
An engineer who's only ever worked from the template without understanding it will eventually improvise around it under deadline pressure, usually by skipping the review gate or hardcoding a credential to get a demo working. Catching that in code review, and explaining why the template does things the way it does, is cheaper than fixing the same mistake across three different client projects later.
What Good Looks Like
Good looks like a shared pipeline template that every client project inherits from, with deploy gates that produce a clear audit trail of who approved what, and documentation a client's own engineers can pick up after handoff.
Building The Capability (5-Stage Skill Ladder)
How to Get Started
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
For client projects deploying to Amazon EKS or through CodePipeline, AWS gives you one consistent deploy target across engagements even when the client's own infrastructure choices vary.
When a client is already on Google Cloud Run or GKE, building your deploy step against their existing setup avoids introducing a second cloud vendor mid-engagement.
On engagements where the client needs to show auditors that CI/CD controls were enforced, Vanta's continuous monitoring gives you evidence you'd otherwise have to compile by hand at handoff.
Frequently Asked Questions
Should we standardize on one CI platform across every client, even when the client prefers the other one?
No, fighting a client's existing tooling costs more goodwill than it's worth. Standardize your internal template logic, linting, test stages, and deploy gating, so the same structure works on either platform, and let the client's repository host decide the platform.
How do we bill for the DevOps time CI/CD setup takes on a new engagement?
Scope it as its own line item during kickoff rather than folding it into feature development estimates. A reusable template shortens this work, but client-specific secrets, environments, and approval rules still take real hours to configure correctly.
What happens to our pipeline templates if a client eventually leaves GitHub for GitLab, or the reverse?
Keep the actual build and test logic in plain shell scripts your pipeline calls, rather than deeply nested platform-specific YAML. That way, moving platforms means rewriting the thin CI wrapper, not the underlying build process.
Sources
Where we quote a benchmark, we show its source. Other figures in this guide are estimates or general guidance, so check them against your own numbers.
- DevOps spend as % of ARR (median, private B2B SaaS). SaaS Capital 2026 Spending Benchmarks for Private B2B SaaS Companies (15th annual survey, 1,000+ companies), 2026.
Related Guides
GitHub Actions vs GitLab CI vs CircleCI: Continuous Integration Comparison
Compare GitHub Actions, GitLab CI, and CircleCI: build speeds, runner pricing, matrix testing, Docker orchestration, secret management, and DORA metrics.
Managing CI/CD Across Client Networks Without Losing Track of Access
A checklist for IT consulting firms and MSPs choosing between GitHub Actions and GitLab CI across many client environments, with access pitfalls to avoid.
Deploy Freezes Around Rent Day: CI/CD for Property Management Software
How property management software teams should time deploys around rent day, and where GitHub Actions and GitLab CI fit a portfolio-wide tenant portal.
Cursor vs GitHub Copilot for Agencies Juggling Client Codebases
A custom software agency ramps into a new client codebase on every engagement. How Cursor's indexing and Copilot's IP indemnity each change that math.
Application Security When You Ship Code You Don't Own
How a custom software and product engineering shop picks between Snyk and GitHub Advanced Security across many client codebases and handoffs.
CrowdStrike vs SentinelOne for Software Development Shops
A custom software agency's endpoint risk lives on contractor laptops touching multiple clients' code. Here is how CrowdStrike and SentinelOne fit that.