DevOps · lesson 2 of 8
Intermediate
7- 2 Choosing a CI/CD Toolchain: The Same Weighted Framework as Choosing a Cloud
- 3 CI/CD Pipeline Patterns: Sequential, Parallel, and Staged
- 4 Deployment Strategies Compared: Rolling, Blue-Green, and Canary
- 5 GitOps in Practice: Git as the Source of Truth
- 6 Computing DORA Metrics From Your Own Git History
- 7 Terraform vs. Ansible: A Weighted Decision Framework
- 8 Observability Synthesis: Logs, Metrics, Traces, and Alerts as One Signal
Also part of DevOps
12- + PR Workflow: Rebasing, Squash Merge, and Merge Commits from Git & GitHub
- + GitHub Actions: Workflows, Jobs, and a Real Failing Step from GitHub Actions
- + Jenkins CI: Pipeline Basics from Jenkins
- + Bash DevOps Scripts from Bash
- + Introduction to Docker from Docker
- + Deployments and Rollouts from Kubernetes
- + Terraform Fundamentals (IaC) from Terraform
- + Terraform CI/CD with GitHub Actions (plan/apply) from Terraform
- + Ansible Idempotency, Verified: Run It Twice and Watch changed=0 from Ansible
- + Prometheus Scrapes You — It's Pull, Not Push from Monitoring & Observability
- + A Firing Alert Doesn't Mean Anyone Was Notified from Monitoring & Observability
- + A CI Security Gate: Gitleaks, Bandit and pip-audit in One Workflow from DevSecOps (AppSec in the pipeline)
Choosing a CI/CD Toolchain: The Same Weighted Framework as Choosing a Cloud
GitHub Actions, GitLab CI, and Jenkins score differently depending entirely on what a team weights — a weighted scoring framework, run against three real scenarios to three different recommendations.
By SkillByExample · Published
The right CI/CD tool isn’t a fixed ranking — it’s whatever a weighted scoresheet says once the
actual weights for a specific team are plugged in, the same pattern cloud/choosing-a-cloud.md
used for picking a cloud provider.
The four factors
- Setup cost — how much configuration and infrastructure work before the first pipeline runs at all.
- Hosted-minutes cost — the ongoing cost of the compute the CI product runs your jobs on.
- Ecosystem fit — how well the tool integrates with where your code and issues already live (a GitHub-hosted repo has an obvious affinity for GitHub Actions, for instance).
- Self-host flexibility — whether build agents can run inside your own network boundary, which can be a hard compliance requirement rather than a soft preference.
Three real scenarios
# ci_toolchain.py
def recommend(name, weights, scores):
tools = ("GitHub Actions", "GitLab CI", "Jenkins")
totals = {t: sum(w * scores[f][t] for f, w in weights.items()) for t in tools}
ranked = sorted(totals.items(), key=lambda kv: -kv[1])
print(name)
for tool, total in ranked:
print(f" {tool:<16}{total:5.2f}")
print(f" -> recommend {ranked[0][0]}\n")
scores = {
"setup_cost": {"GitHub Actions": 9, "GitLab CI": 5, "Jenkins": 2},
"hosted_minutes_cost": {"GitHub Actions": 7, "GitLab CI": 7, "Jenkins": 9},
"ecosystem_fit": {"GitHub Actions": 9, "GitLab CI": 4, "Jenkins": 5},
"self_host_flexibility": {"GitHub Actions": 5, "GitLab CI": 7, "Jenkins": 9},
}
# Scenario 1: small team, code already on GitHub, no existing CI infra.
recommend(
"Startup, code already on GitHub",
{"setup_cost": 0.35, "hosted_minutes_cost": 0.20, "ecosystem_fit": 0.30, "self_host_flexibility": 0.15},
scores,
)
# Scenario 2: enterprise, compliance requires self-hosted runners.
recommend(
"Enterprise, compliance requires self-hosted",
{"setup_cost": 0.10, "hosted_minutes_cost": 0.10, "ecosystem_fit": 0.20, "self_host_flexibility": 0.60},
scores,
)
# Scenario 3: heavy build volume, cost-sensitive.
recommend(
"High build volume, cost-sensitive",
{"setup_cost": 0.10, "hosted_minutes_cost": 0.55, "ecosystem_fit": 0.15, "self_host_flexibility": 0.20},
scores,
)
python ci_toolchain.py
Startup, code already on GitHub
GitHub Actions 8.00
GitLab CI 5.40
Jenkins 5.35
-> recommend GitHub Actions
Enterprise, compliance requires self-hosted
Jenkins 7.50
GitHub Actions 6.40
GitLab CI 6.20
-> recommend Jenkins
High build volume, cost-sensitive
Jenkins 7.70
GitHub Actions 6.00
GitLab CI 5.25
-> recommend Jenkins
Same three tools, same per-factor scores, three different winners — because the weights, not the scores, are what actually change between scenarios. Jenkins loses badly on setup cost in every scenario, but wins twice anyway once self-hosting or raw compute cost is weighted heavily enough to matter more than that setup pain.
Practice
1. Take the startup scenario and weight self-host flexibility heavily instead — see the recommendation flip.
recommend(
"Startup, but self-host flexibility now weighted 0.55",
{"setup_cost": 0.15, "hosted_minutes_cost": 0.10, "ecosystem_fit": 0.20, "self_host_flexibility": 0.55},
scores,
)
Startup, but self-host flexibility now weighted 0.55
Jenkins 7.15
GitHub Actions 6.60
GitLab CI 6.10
-> recommend Jenkins
Same startup, same GitHub-hosted code — but weighting self-host flexibility enough flips the recommendation to Jenkins despite its terrible setup-cost score. The framework never assumes “startup on GitHub” automatically means GitHub Actions; it computes whatever the weights say.
2. Weight every factor equally and see which tool wins on balance.
recommend(
"Equal weights on every factor",
{"setup_cost": 0.25, "hosted_minutes_cost": 0.25, "ecosystem_fit": 0.25, "self_host_flexibility": 0.25},
scores,
)
Equal weights on every factor
GitHub Actions 7.50
Jenkins 6.25
GitLab CI 5.75
-> recommend GitHub Actions
GitHub Actions wins on average across these particular scores — a fact about this specific scoresheet, not a general claim that it’s the best all-around tool independent of context.
3. Re-run the startup scenario for a team whose code lives on GitLab instead of GitHub.
scores_gitlab_hosted = {
"setup_cost": {"GitHub Actions": 9, "GitLab CI": 5, "Jenkins": 2},
"hosted_minutes_cost": {"GitHub Actions": 7, "GitLab CI": 7, "Jenkins": 9},
"ecosystem_fit": {"GitHub Actions": 4, "GitLab CI": 9, "Jenkins": 5},
"self_host_flexibility": {"GitHub Actions": 5, "GitLab CI": 7, "Jenkins": 9},
}
recommend(
"Startup, but code is hosted on GitLab instead of GitHub",
{"setup_cost": 0.35, "hosted_minutes_cost": 0.20, "ecosystem_fit": 0.30, "self_host_flexibility": 0.15},
scores_gitlab_hosted,
)
Startup, but code is hosted on GitLab instead of GitHub
GitLab CI 6.90
GitHub Actions 6.50
Jenkins 5.35
-> recommend GitLab CI
Same weights as the original startup scenario — only the ecosystem_fit scores changed to
reflect where the code actually lives — and the recommendation follows the code, not a fixed
preference for any one tool.
Next: CI/CD pipeline structure — measuring the real build-time cost of a sequential pipeline versus a parallelized one.