The Enterprise CI/CD Landscape¶
What this lesson gives you
GitHub Actions, GitLab CI, Jenkins, Azure Pipelines, CircleCI — the major tools differ in hosting model and philosophy, but share the same concepts. Consulting value comes from portable assessment, not platform memorization.
Estimated time: 17 min read · Part: CI/CD Foundations
Learning Objectives
After this lesson you will be able to: (1) describe the major CI/CD platforms and their hosting models; (2) explain the SaaS vs. self-hosted runner tradeoff; (3) identify when a client needs self-hosted runners; (4) assess any CI/CD setup using platform-agnostic criteria; (5) frame a CI/CD migration discussion in terms of strategic value rather than syntax.
The Major Platforms¶
Enterprises run a range of CI/CD platforms. The differences that matter in consulting are hosting model (SaaS vs. self-hosted), ecosystem integration, and extensibility. You will rarely get to choose the tool — the question is how to make the best use of what exists, and when to recommend a migration.
| Tool | Hosting model | Strengths | Typical fit |
|---|---|---|---|
| GitHub Actions | SaaS + self-hosted runners | Native GitHub integration, huge marketplace, OIDC support, generous free tier | GitHub-hosted projects, open source, modern greenfield |
| GitLab CI/CD | SaaS or fully self-hosted | Single integrated DevOps platform (SCM + CI + registry + security), strong self-host | Orgs wanting one self-hosted tool, regulated industries |
| Jenkins | Self-hosted (always) | Maximum flexibility via plugins (2000+), full control, no vendor lock-in | Large enterprises with entrenched investment, complex pipelines |
| Azure Pipelines | SaaS + self-hosted agents | Deep Azure/Microsoft ecosystem, Active Directory integration, YAML + GUI editor | Microsoft-aligned organizations, .NET + Python mixed shops |
| CircleCI | SaaS + self-hosted runners | Fast cloud execution, simple config, strong Docker support, resource classes | Startups, cloud-native teams, fast iteration |
| Buildkite | SaaS control plane + your runners | Your infrastructure, their orchestration — good for GPU workloads, compliance | ML teams, regulated orgs needing own compute |
SaaS Runners vs. Self-Hosted Runners¶
The runner placement decision is one of the most consequential in enterprise CI/CD architecture. A SaaS-hosted runner (GitHub's ubuntu-latest, CircleCI's cloud executors) runs on the platform vendor's infrastructure — you get a fresh, ephemeral environment with no maintenance overhead. A self-hosted runner is software you install on your own machines; it makes an outbound connection to the CI control plane and polls for jobs, so no inbound firewall hole is needed.
SaaS vs. Self-Hosted: The Taxi vs. Personal Car Analogy
SaaS-hosted runners are like a taxi service: convenient, always available, no maintenance, but the driver (vendor) controls the vehicle, you can't take it into restricted areas, and someone else might have used the same car before you. Self-hosted runners are your own car: full control, can go anywhere including inside a private building (your data center), but you pay for maintenance and insurance. Most enterprises use both: SaaS for public open-source work, self-hosted for anything touching internal systems.
| Dimension | SaaS-hosted runner | Self-hosted runner |
|---|---|---|
| Setup & maintenance | None — vendor managed | You install, patch, scale |
| Private network access | No — external cloud only | Yes — runs inside your network |
| Data residency / compliance | Data leaves your environment | Data stays in your control |
| Specialized hardware (GPU) | Limited / expensive | Attach your own hardware |
| Cost at scale | Per-minute billing; can be high | Fixed infra cost; better at high volume |
| Consistency | Fresh ephemeral environment each run | Must manage state / image hygiene |
Migration Discussions: Jenkins to Modern Platforms¶
Many enterprises still run Jenkins, often installed years ago by a team that has since moved on. Jenkins is powerful but carries significant operational overhead: the JVM, plugin management, plugin compatibility issues, and a Groovy-based DSL that has a steep learning curve. When a client asks about migrating to GitHub Actions or GitLab CI, the conversation is strategic, not syntactic.
Consulting Lens: The CI/CD Migration Conversation
When a client wants to migrate from Jenkins to GitHub Actions (or any platform), the assessment questions are: (1) Plugin inventory — which of the 50 Jenkins plugins in use have a GitHub Actions equivalent? (2) Runner strategy — can all jobs move to SaaS runners, or do some need on-prem access? (3) Team skills — YAML is easier than Groovy for most developers; this is usually a win. (4) Cost model — how do GitHub Actions minutes compare to self-hosted Jenkins at this team's volume? (5) Migration risk — run old and new pipelines in parallel on a pilot project before cutting over. The strategic framing: modernizing CI/CD reduces the 40% of dev time teams often spend on pipeline maintenance, speeds up the feedback loop, and enables the DORA improvements the business cares about.
// A typical Jenkins Declarative Pipeline — Groovy-based
pipeline {
agent any
stages {
stage('Install') {
steps {
sh 'pip install -r requirements.txt'
}
}
stage('Test') {
steps {
sh 'pytest tests/ --junitxml=results.xml'
}
}
}
post {
always {
junit 'results.xml'
}
}
}
The Concepts Transfer
The Jenkins Declarative Pipeline has: an agent (runner), stages, steps with sh (shell commands), and a post block (like GitHub Actions if: always() for cleanup). The vocabulary maps directly. What looks different is the syntax (Groovy vs. YAML) and the execution model (Jenkins server vs. GitHub-managed runners). Being able to read a Jenkinsfile and identify the pipeline structure — and then explain what the equivalent GitHub Actions YAML would look like — is a concrete consultant skill.
WHY platform diversity matters You will walk into clients running any of these tools. The consultant's value is platform-agnostic assessment and the ability to reason about trade-offs — not knowing every YAML key of every tool.
HOW five assessment questions Speed, test coverage, security scanning, deployment safety, runner placement. These five questions apply to any CI/CD platform and give you a complete picture of maturity and risk.
WHERE enterprise engagements Use the self-hosted runner conversation as a bridge to hybrid infrastructure (Part 12 and 13) — on-prem runners are often the first thing that surfaces when a client starts modernizing their CI/CD pipeline.
Knowledge check
InterviewA client's CI builds must access a database running inside their private on-premises network. Why might SaaS-hosted CI runners be unsuitable, and what is the fix?
- SaaS runners are always faster, so there is no issue.
- Cloud-hosted runners cannot reach resources on a private network and may violate data-residency requirements; use self-hosted runners installed inside the client's network so jobs can access internal systems securely.
- The database must be exposed to the public internet for CI to work.
- CI cannot be used with on-premises databases at all.
Answer
Cloud-hosted runners cannot reach resources on a private network and may violate data-residency requirements; use self-hosted runners installed inside the client's network so jobs can access internal systems securely.
SaaS runners execute in the vendor's cloud and cannot reach resources behind a corporate firewall — and sending data through those runners may violate compliance requirements. Self-hosted runners are installed on machines inside the client's network; they make an outbound connection to the CI control plane and pull jobs. Pipeline steps then run on those machines and can access internal resources as if from any internal machine. This pattern is how enterprise CI/CD works with on-premises databases, private registries, and internal services without opening inbound firewall rules.
Knowledge check
ConceptA client is considering migrating from Jenkins to GitHub Actions. What are the two or three most important questions to ask before recommending the migration?
- Which programming language do they use, and how many developers do they have?
- Do their builds require access to private internal networks (runner placement)? Are their Jenkins plugins replaceable in GitHub Actions? What are the cost implications at their current build volume?
- Whether their CEO approves of open-source tools.
- Whether their developers know YAML, since Jenkins uses Groovy.
Answer
Do their builds require access to private internal networks (runner placement)? Are their Jenkins plugins replaceable in GitHub Actions? What are the cost implications at their current build volume?
The three strategic questions before a CI/CD migration: (1) Runner placement — if builds must reach internal systems, self-hosted runners are required on the new platform too; confirm this is feasible. (2) Plugin/feature parity — inventory Jenkins plugins that perform critical work (test result parsing, deployment integrations, security scanning) and verify equivalent Actions exist. (3) Cost model — GitHub Actions bills per minute; at high build volume self-hosted Jenkins may be cheaper. Team skill (YAML vs. Groovy) is a real consideration but usually favors the modern platform.
Exercise
A client runs GitLab CI (self-hosted) with a pipeline that: (1) runs tests on every merge request; (2) builds a Docker image and pushes to their internal Harbor registry on merges to main; (3) deploys to a Kubernetes cluster inside their data center. They are evaluating GitHub Actions. Write a one-page assessment covering: runner strategy, registry integration, deployment access, security model, and your recommendation.
Show solution
Assessment: GitLab CI → GitHub Actions for ACME Client
RUNNER STRATEGY
Current: GitLab runners self-hosted inside the data center.
GitHub Actions: Requires self-hosted runners for the same reasons —
builds must reach internal Harbor registry and K8s cluster.
Recommendation: Deploy GitHub Actions self-hosted runners inside the DC.
This is low-risk: runners make outbound connections only; no firewall changes.
REGISTRY INTEGRATION
Current: Harbor (internal) receives docker push from runners inside DC.
GitHub Actions: With self-hosted runners, docker push to Harbor works
identically. No change to Harbor configuration needed.
DEPLOYMENT ACCESS
Current: kubectl runs from inside DC via self-hosted runner.
GitHub Actions: Same — kubectl on the self-hosted runner reaches the
internal K8s API server. Alternatively, use a GitOps tool (Argo CD) that
pulls from the registry rather than being pushed to from CI.
SECURITY MODEL
Current: Credentials stored as GitLab CI/CD variables.
GitHub Actions: Secrets stored in GitHub repository/environment secrets.
For cloud deployments OIDC is available; for internal Harbor/K8s,
secrets stored as environment-scoped secrets in GitHub.
Risk: secrets leave the GitLab system; ensure GitHub org security policies
(SSO, secret scanning, branch protection) are configured before migration.
RECOMMENDATION
Migration is feasible with self-hosted runners. Primary benefit: GitHub
Actions has a larger marketplace and better developer ergonomics. Primary
cost: self-hosted runner maintenance (same as current GitLab runners, so
no net increase). Suggested approach: pilot on one non-critical service,
run both pipelines in parallel for 2 sprints, then cut over.
Key Takeaways
- GitHub Actions, GitLab CI, Jenkins, Azure Pipelines share the same core concepts — hosting model and ecosystem differ.
- SaaS runners: convenient, no maintenance, can't reach private networks. Self-hosted: full control, on-prem access, more ops.
- Assess any CI/CD setup on: speed, test coverage, security scanning, deployment safety, runner placement.
- Jenkins migrations are strategic conversations — assess plugin parity, runner strategy, cost, and team retraining.
- Your consulting value is portable assessment, not platform syntax memorization.