记得三年前,作为一家20人规模初创公司的技术负责人,我最害怕的就是周五下午。
那时候我们还在用一台老旧的阿里云ECS跑Jenkins。每当有新人入职,我就得花半天教他怎么配置构建参数;每隔两个月,Jenkins的插件升级就会搞崩整个流水线,导致我要在深夜盯着报错日志发愁。
我曾坚定地认为:只有自建CI/CD系统才足够安全、可控。 直到2021年的一次"灾难"——由于构建节点磁盘爆满,我们错过了一个紧急修复的黄金发布窗口,导致客户投诉量激增。
那天之后,我痛定思痛,决定带领团队从重型运维转向轻量化DevOps,全面迁移至GitHub Actions。今天这篇复盘,就是想聊聊对于没有专职运维的中小团队,如何用最低的成本,搭建一套不输大厂的自动化发布流。
算清楚"隐形账":免费的往往是最贵的
很多技术主管在选型时会陷入一个误区:开源软件免费,所以成本低。
在我们团队只有5个开发的时候,维护Jenkins似乎没什么问题。但当团队扩张到15人,后端、前端、移动端项目混杂时,问题爆发了。
2021年Q3,我做了一次详细的成本核算:
- 显性成本:一台4核8G的构建服务器,每年约3000元。
- 隐性成本:我每周至少花3小时在维护环境、升级插件、清理磁盘、处理构建排队上。按照时薪计算,这部分人力成本每年超过5万元。更别提因为构建失败导致全组人停下来等修复的"等待成本"。
迁移到GitHub Actions后,这笔账发生了惊人的变化。
对于公共仓库,GitHub Actions完全免费;对于私有仓库,Free计划每月赠送2000分钟构建时间。即使是我们这样每天提交频次较高的团队,配合Pro版(每人$4/月),只要配置得当,几乎不需要额外购买构建时长。
“中小团队的核心资源是开发者的注意力,而不是服务器资源。任何能让开发者少操心的工具,都是在省钱。”
告别"黑盒":让流水线代码化 (Pipeline as Code)
以前用Jenkins时,构建逻辑都藏在复杂的UI配置里。
有个叫小李的后端同事,想给自己的微服务加一个简单的代码风格检查(Lint)。他得先找我要Jenkins权限,然后在一堆输入框里摸索,最后因为配错了一个环境变量,把整个测试环境搞挂了。
CI/CD不应该只是运维人员的"特权",它应该是代码的一部分。
迁移到GitHub Actions后,所有的构建逻辑都变成了一个 .github/workflows/main.yml 文件。这带来了两个立竿见影的改变:
- 版本控制:流水线的每一次修改都有Git记录,谁改的、改了什么、什么时候改的,一清二楚。
- 全员参与:现在,连刚入职的实习生都能照葫芦画瓢,通过提交PR来修改构建流程。
这里分享一个我们目前正在使用的、针对Node.js服务的标准化配置模版。它包含了缓存优化,这也是降低成本的关键:
name: Production Build
on:
push:
branches: [ "main" ]
# 关键点:只在相关文件变动时触发,节省构建分钟数
paths-ignore:
- '**.md'
- 'docs/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
# 开启缓存,大幅减少依赖下载时间
cache: 'npm'
- name: Install Dependencies
# 使用 ci 命令比 install 更快更稳定
run: npm ci
- name: Run Tests
run: npm test
- name: Build
run: npm run build
这个简单的配置,让我们的平均构建时间从Jenkins时代的8分钟,缩短到了3分钟以内。
拒绝"乱收费":精细化控制每一分钟
刚开始迁移时,我也踩过坑。第一个月,我们还没到月底就收到了GitHub的额度耗尽提醒。
排查后发现,90%的浪费来自于无效构建。
比如,前端改了一个 README.md 文档,却触发了后端API的完整构建和测试;或者同一个PR由于反复提交代码,导致同时跑了5个并行的构建任务。
为了解决这个问题,我总结了三个"省钱妙招",一直沿用至今:
-
路径过滤(Path Filtering):如上文代码所示,严格配置
paths或paths-ignore。文档变动绝不触发代码构建。 -
并发控制(Concurrency Control):这是个神器。当同一个分支有新的提交推上来时,自动取消正在进行的旧构建。这一个配置帮我们节省了约30%的分钟数。
concurrency: group: $-$ cancel-in-progress: true -
善用Cache:无论是npm、maven还是docker layer,都要利用
actions/cache。我亲测,加上缓存后,构建过程中最耗时的"下载依赖"环节几乎变成了秒级。
通过这套组合拳,即使现在我们的代码库规模翻了一倍,每月的构建费用依然控制在Pro订阅费之内,几乎没有产生额外的分钟数账单。
写在最后
从自建Jenkins到拥抱GitHub Actions,不仅仅是工具的替换,更是团队DevOps文化的升级。
我们不再需要一个专门的"发布管理员",每个开发者在提交代码的那一刻,就对自己代码的构建和测试负责。我也终于把周五下午的时间解放出来,可以安安心心地做一些技术预研,而不是盯着进度条祈祷不要报错。
对于正在纠结的中小团队,我的建议很直接: 如果是100人以下的研发团队,且没有复杂的合规(如金融级内网隔离)要求,尽早切到GitHub Actions或GitLab CI。 别让维护工具本身,成为了你们的负担。
最后做个小调查: 在CI/CD选型上,你更看重哪一点? A. 完全的可控性(哪怕麻烦点,也要数据都在自己服务器上) B. 极致的效率与低维护(托管服务真香,少折腾才是硬道理)
欢迎在评论区留下你的选择。
如果你准备开始行动,建议从以下3步着手:
- 盘点高频痛点:找出目前部署流程中最耗时、最容易出错的环节(通常是环境配置或依赖安装)。
- Copy & Paste:不要从零写,去GitHub Marketplace找一个成熟的Action模版,先跑通"Hello World"。
- 配置缓存:这是让体验从"能用"变成"好用"的关键一步,务必在第一时间加上依赖缓存。