Managing CI/CD Across Client Networks Without Losing Track of Access
An IT consulting firm or MSP rarely runs a single pipeline for a single product. It runs pipelines into a dozen client networks, each with its own VPN, its own approval chain, and its own tolerance for a consultant having standing access after the project ends.
The platform choice matters less here than the discipline around who and what can trigger a deploy into a client's environment, and for how long.
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.
Do you need self-hosted runners to reach a client's private network?
When a deploy target sits inside a client's private network, a GitHub-hosted or GitLab-hosted shared runner usually can't reach it without a VPN tunnel you'd have to build and maintain yourself. A self-hosted runner placed inside the client's environment, registered to your GitHub Actions workflow or your GitLab CI project, solves this cleanly and is supported by both platforms.
The tradeoff is that you now own a small server living on the client's network, which needs patching and monitoring like anything else you're responsible for. Treat it as part of the engagement's infrastructure, not a one-time setup task you forget about after go-live.
Common pitfall: credentials that outlive the engagement
The most common failure mode in MSP CI/CD isn't a broken pipeline, it's a deploy credential or a self-hosted runner token that's still active six months after the engagement ended. Set a calendar reminder tied to every client project's close date to revoke runner registrations, deploy keys, and any service account created specifically for that engagement.
Both GitHub and GitLab let you scope tokens narrowly and set expirations on them; use that instead of a token that works forever. A client finding your firm's unused credentials still active during their next audit is a worse outcome than the small friction of rotating credentials more often.
How do you tell if a client's pipeline is actually protecting them?
Change failure rate, how often a deployed change causes an incident, is one of the clearest signals of whether a client's pipeline is actually protecting them or just moving code faster into production1. If your team is deploying into a client's environment several times a week and nobody is tracking how often those deploys cause a rollback or a support ticket, you don't actually know whether the pipeline is helping.
Add a lightweight tag in your ticketing system that flags whether an incident traces back to a recent deploy, and review it monthly with the client. It turns an abstract reliability conversation into a number you can both watch move.
Build one standard, let client environments vary
Your firm's internal pipeline template, linting, test stages, required approvals, should stay the same across clients even when the deploy target changes from one client's on-premises server to another's cloud account. Consistency in the parts you control makes it easier to onboard a new engineer onto any client's pipeline without relearning your whole approach each time.
What should vary by client is the deploy step itself: the runner location, the credentials it uses, and the approval chain, since those genuinely depend on each client's environment and risk tolerance.
Pre-engagement access checklist
Before you connect a pipeline to a new client's environment, confirm:
- Who on the client side needs to approve a self-hosted runner living on their network, and has security signed off?
- What's the offboarding process for revoking runner tokens and deploy credentials at engagement close?
- Does the client require deploy logs to be retained for a specific period, and where will those logs actually live?
- Is there a single point of contact on the client side if a deploy needs an emergency rollback outside business hours?
Asking these questions before the first pipeline run saves a difficult conversation later, usually right when something's already gone wrong.
Handing a client their own pipeline at contract end
Some MSP engagements end with the client taking full ownership of the environment you built, and that transition goes badly more often than it needs to when the pipeline was never designed to be handed off. Keep the workflow file, the runner setup instructions, and a plain-language explanation of the approval chain in a single document the client's own IT staff can follow without you on the call.
Walk the client's team through an actual deploy before the contract ends, not just through documentation, so the first time they run the pipeline without you isn't also the first time anyone but your team has seen it work end to end. Schedule that walkthrough with enough runway to fix anything confusing, rather than squeezing it into the final week alongside everything else that's wrapping up.
What Good Looks Like
Good looks like a consistent internal pipeline standard across every client, self-hosted runners scoped tightly to the environment they serve, and a documented offboarding step that revokes access the moment an engagement closes.
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.
When a client's deploy target is already on AWS, scoping your pipeline's access with a workload-specific IAM role beats handing your team a shared long-lived key.
For clients running on Google Cloud, workload identity federation lets your pipeline authenticate without a service account key sitting in a secrets store you have to rotate manually.
Vanta gives you a single view of which credentials and integrations are still live across every client engagement, which is hard to keep straight by memory once you're past a handful of clients.
Frequently Asked Questions
Is a self-hosted runner a security risk we're introducing into a client's network?
It can be, if it's not scoped and patched properly. Treat it like any other server on the client's network: minimal permissions, regular patching, and a clear owner. Most of the risk comes from treating it as a one-time setup rather than ongoing infrastructure.
Should every client get the same CI/CD standard, or do we customize per engagement?
Standardize the process, customize the deploy target. Your linting rules, test stages, and approval structure should look the same everywhere; the runner location and credentials should match each client's specific environment.
How often should we rotate deploy credentials for an active client?
At minimum, whenever a team member rolls off the engagement, and on a fixed schedule otherwise, quarterly is reasonable for most engagements. Automate the rotation where the platform supports it so it doesn't depend on someone remembering.
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.
- Change failure rate by DORA performance cluster. DORA Accelerate State of DevOps 2024 (Google Cloud), cluster table via Octopus Deploy analysis, 2024.
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.
Running One CI/CD Standard Across a Dozen Client Codebases
A runbook for custom software shops standardizing CI/CD across client projects: choosing GitHub Actions or GitLab CI, and handing pipelines off cleanly.
Reproducible Pipelines for Biotech Software You'll Have to Defend Later
How life sciences and biotech consultants should structure CI/CD for reproducibility, environment pinning, and documentation a regulatory file might need.
A Security Tooling Checklist for Multi-Client IT Consultancies
A pitfalls checklist for IT consulting firms and managed service providers deciding between Snyk and GitHub Advanced Security across clients.
Cursor vs GitHub Copilot for IT Consultants Working Client-Side
You don't choose a client's GitHub org, but you do choose your own AI coding tool. How Cursor and Copilot compare across legacy scripts and client-owned repos.
Database Infrastructure for IT Consulting and MSPs
IT consulting firms and managed service providers building client-facing tools need consistent, auditable database infrastructure across accounts.