去年Q3,我同时给3个项目上了不同的CI/CD流水线。GitHub Actions、Jenkins、GitLab CI各跑半年,账单差异大到让我怀疑人生——最便宜的方案成本只有最贵的3%。
这不是评测文。是实打实的6个月生产环境数据,包括我踩过的隐藏计费陷阱、团队效率损耗,以及一个没人告诉你的真相:免费额度往往是最大的成本陷阱。
GitHub Actions:按分钟计费,但分钟会撒谎
我的Java后端项目月均构建1800次,每次平均8分钟。GitHub Actions的Linux runner标价$0.008/分钟,粗算每月115美元,能接受。
实际账单出来是$340/月。问题出在三个地方:
第一,并行作业(parallel jobs)默认不限制。我开了4个并发,高峰期同时跑12个workflow,账单直接×3。GitHub的计费逻辑是「并发数×单作业时长」,不是「总消耗分钟数」。
第二,缓存(cache)命中率的坑。我配置了Maven依赖缓存,但默认10GB上限很快打满。LRU淘汰机制下,周一早上全团队同时触发构建,缓存全部失效,依赖重新下载——单次构建从8分钟飙到23分钟。
第三,macOS runner的误触。iOS测试脚本里一行`runs-on: macos-latest`,单价$0.08/分钟,是Linux的10倍。某次误提交导致该workflow跑了47分钟,那一笔就$3.76,够Linux跑47次。
6个月总支出:$2,040。折合14,688元人民币。
Jenkins:服务器便宜,人贵
我自托管的Jenkins跑在AWS t3.large上,预留实例年费$612。看起来是GitHub Actions的零头。
但Jenkins的真实成本在维护工时。6个月里,我记录了所有「非开发性投入」:
插件兼容性噩梦。Blue Ocean和Pipeline插件版本冲突,导致构建队列卡住3次。每次排查平均4小时,6个月累计18小时。按我时薪折算,$2,160。
Agent管理的隐性开销。项目需要Windows、Linux、ARM三种构建环境,我维护了7个静态agent。某次Windows agent磁盘满了,构建失败但状态显示「成功」,漏掉一个关键bug上线。回滚+复盘,6小时。
安全补丁的连锁反应。Log4j漏洞期间,我花了3个晚上升级Jenkins核心+17个插件。其中2个插件弃用,被迫重写3条pipeline。
6个月总支出:服务器$306 + 维护工时折算$4,320 = $4,626。这还没算我凌晨2点被告警叫醒的精神损失。
GitLab CI:Runner策略决定生死
GitLab CI的定价模型最复杂:SaaS版有免费400分钟/月,自托管版免费但吃自己的机器。我选了混合策略:核心构建用自托管runner,边缘任务用SaaS共享runner。
这个决策救了我。
自托管runner我用的闲置办公机,i7-9700+32GB,成本归零。但配置`.gitlab-ci.yml`时,我犯了一个典型错误:没设置`tags`约束,导致某次重型构建被调度到SaaS的共享runner,排队等了11分钟。
GitLab的共享runner在高峰期排队严重。我监控了2周,下午2-6点的平均队列延迟是4.7分钟,相当于每次构建隐性增加58%时间成本。
真正的省钱点是缓存策略。GitLab的S3兼容缓存让我把node_modules和Docker layer全部外置,构建时间从14分钟压到6分钟。400分钟免费额度实际撑起了月均1200分钟的构建量——靠的就是时间压缩。
6个月总支出:SaaS超额部分$23 + S3存储$18 = $41。折合人民币295元。
成本之外:被忽略的「决策税」
三个工具6个月跑下来,我整理了一张隐性成本对照表:
GitHub Actions的「决策税」最低。YAML即代码,新成员30分钟能看懂pipeline。但代价是灵活性天花板——你想自定义构建环境的内核参数?没门。
Jenkins的「决策税」最高。Groovy脚本的学习曲线陡峭,我团队3个后端里只有我能改pipeline。这造成单点故障:我休假时,一个紧急hotfix因为pipeline权限问题卡了6小时。
GitLab CI的「决策税」在中间。YAML足够简单,但多项目管理的复杂度会累积。我试过用`include`语法复用配置,结果5个项目的CI配置形成依赖网,改一处崩三处。
一个反直觉的发现:工具迁移成本往往被低估。我从GitHub Actions迁出Jenkins时,花了47小时做feature parity对齐——包括测试报告格式、artifact存储路径、Slack通知模板。这相当于2.3个月的GitHub Actions账单。
我的最终配置:没有银弹,只有场景
6个月后,我的3个项目各自定格在不同方案上:
开源项目用GitHub Actions。公开仓库的免费额度无限,社区贡献者熟悉YAML,issue里贴个failed check链接就能协作。
企业核心项目用GitLab CI自托管。合规要求数据不出境,自托管runner+私有化GitLab满足审计。缓存策略调优后,成本压到可忽略。
遗留系统维护用Jenkins。不是不想迁,是200+条Groovy pipeline的迁移ROI算不过来。我妥协的做法是:冻结新功能,只打安全补丁,等系统退役。
最后分享一个让我破防的细节:GitLab CI的某次构建日志里,runner输出了当前机器的CPU型号。我发现那台「免费」共享runner用的是2015年的Xeon E5-2680,单核性能只有我笔记本的1/3。
免费的东西,往往在看不见的地方标好了价格。你的CI账单里,有没有类似的「隐藏款」?
热门跟贴