主流工具一览

工具 模型 自托管 学习曲线 适合
GitHub Actions YAML / 共享 runner / self-hosted runner 部分(runner) 已用 GitHub 的项目
GitLab CI YAML / 自带 runner 完整自托管 用 GitLab 的项目
Jenkins Pipeline (Groovy) / Plugin 生态 完整 高(插件多 + 老) 老项目 / 强自定义
Buildkite YAML + agent 在自己机器 Hybrid(控制平面在云) 重度自托管但不想运维 controller
CircleCI YAML / 云 + self-hosted 部分 通用项目,独立工具
Drone YAML / docker 化 完整 轻量 / 自托管
Tekton K8s CRD K8s 原生 中-高 已重度用 K8s
Argo Workflows K8s CRD K8s 原生 数据 / ML 流水线

Travis CIBamboo 在新项目里基本不见了。CircleCI 仍活跃但生态没 GHA 强。

怎么选:决策清单

1. 已有的代码托管在哪

  • GitHub → 默认 GitHub Actions(PR 集成最深)
  • GitLab → 默认 GitLab CI(一体,免费档强)
  • Bitbucket → Bitbucket Pipelines / 自选
  • 自托管 Gitea / Gogs → Gitea Actions / Drone

2. 是否必须自托管

  • 数据合规 / 等保要求 → 必须自托管:GitLab CI / Jenkins / Drone / Tekton
  • GitHub Actions 也支持自托管 runner(但 controller 在云上)

3. 是否已经重度用 K8s

  • 是 → 考虑 Tekton / Argo Workflows(K8s 原生 CRD,统一管控平面)
  • 否 → 用 K8s 原生 CI 是给自己加难度

4. 团队心智

  • 团队偏好"低配置 + 共享 SaaS"→ GHA / CircleCI
  • 团队有专门 DevOps 维护工具 → Jenkins / Buildkite 都行
  • 没人愿意维护 → 不要 Jenkins

几个常被忽视的点

Job 矩阵

跑同一组测试在 N 种环境(语言版本 / OS):

# GitHub Actions
strategy:
  matrix:
    python: ["3.10", "3.11", "3.12"]
    os: [ubuntu-latest, macos-latest]

矩阵跑得起来 = 工具基本够用。

可复用工作流(reusable workflow)

GHA 的 workflow_call、GitLab 的 include、Jenkins 的 shared library——都是把"建镜像 / 部署 / 通知 Slack"等通用步骤抽出来,避免每个仓库复制粘贴。

Self-hosted runner / agent

  • 优点:访问内网资源、用大机器、敏感数据不出公司
  • 代价:自己运维(安全补丁 / 容器逃逸 / 资源调度)
  • 安全坑:永远不要让 self-hosted runner 跑公开仓库的 PR——攻击者可以 PR 任意代码到你机器上跑

计费模型

  • GHA:公开仓库免费;私有按 runner 时间计费
  • GitLab CI:CI minutes 套餐
  • Jenkins:免费但要自己 host
  • CircleCI / Buildkite:按 credit / 并发 job 计费

计费策略经常变——选型时去官网看当下定价,别信几年前的博客。

反模式

  • 每个仓库一份独立的 90 行 yaml → 改成 reusable workflow + 共享 action
  • CI 配置 commit 到 default 分支才生效 → 测试期间会污染 main
  • 失败的 job 没有通知 → 加 Slack / Teams / 邮件
  • CI 跑很慢但没人看时间 → 装 GitHub Actions Workflow Insights / GitLab CI Pipeline Stats

一个实操建议

新项目:

GitHub 仓库 → GitHub Actions(默认)
  ↓
后期加自托管 runner 跑大 build / 跨环境测试
  ↓
真有合规需求再考虑迁 GitLab Self-hosted

不要一开始就上 Jenkins——大多数团队不需要那个复杂度。

推荐阅读

下一篇:GitOps——把"部署"也变成 git 操作。