哄睡孩子后,我在天通苑的出租屋里和持续集成工具死磕的那些夜

YAML别缩进
2026-08-10 23:44
阅读 787

晚上十一点,天通苑的出租屋终于安静。我关上卧室门,打开笔记本,叹了口气——又该折腾那个破 Jenkins 了。我恨持续集成工具,恨了三年。

去年十月,团队接了个 AI 客服智能体项目。老板要上 CI/CD,我硬着头皮说搞过,其实就抄过几个 Jenkinsfile。那晚哄睡孩子后开工,需求很简单:代码提交后自动测试、构建镜像、部署到测试环境。结果凌晨三点,Kubernetes 插件版本不兼容,Maven 找不到依赖,部署因权限挂掉。Jenkins 日志长得像天书。我看着红色的 BUILD FAILURE,涌上一股无力感:三十五岁,俩孩子的爹,月薪 22k,我到底在图啥?

今年三月,我看到一个 AI 音乐生成工具 Udio,底层用“声明式流水线”——用户描述想要的风格,系统自动编排调用顺序。我愣住了:这就是我想要的 CI 模式。Jenkins 那种命令式配置,每一步都得写死,稍微一变就崩。声明式只需告诉系统“我要什么结果”,系统自己想办法。

我花两个周末,基于声明式思路重新设计了 CI 流程。核心是把配置抽象成 YAML:

pipeline:
  name: agent-build
  triggers:
    - type: push
      branches: [main, develop]
  stages:
    - name: test
      type: unit-test
      framework: pytest
      coverage: 80%
    - name: build
      type: docker-build
      dockerfile: ./Dockerfile
      tag: latest
    - name: deploy
      type: k8s-deploy
      namespace: staging
      replicas: 2

背后用 Go 写了个小型编排引擎,根据 type 调用对应执行器,自动处理构建、打标签、推送等流程。针对智能体项目需同时更新多个微服务的痛点,我加了 depends_on 字段:

stages:
  - name: build-knowledge-base
    type: docker-build
    service: knowledge-base
  - name: build-dialog-engine
    type: docker-build
    service: dialog-engine
    depends_on: [build-knowledge-base]
  - name: integration-test
    type: integration-test
    depends_on: [build-dialog-engine]
    test_suite: agent-flow

引擎解析依赖生成 DAG,按拓扑顺序执行,失败即停。这套方案核心逻辑仅一千多行,发版从一晚上缩至二十分钟,测试覆盖率从 40% 飙到 85%。

我的几点真实看法:第一,工具是死的,思路是活的。Jenkins 插件机制像屎山,但问题在于我们把它当“远程执行 Shell 脚本的地方”。第二,声明式是大趋势。GitHub Actions、Kubernetes Operator 都在往声明式走,告诉系统想要的状态,系统负责达到它。第三,别为了自动化而自动化。有同事花三天写自动部署脚本,服务三月才发一次版,ROI 为负。CI 价值在高频场景,像我们一天发五六次版,自动化才真省钱。第四,监控和告警比 CI 本身更重要。我在流水线加冒烟测试和指标监控,部署完自动跑核心接口测试,失败直接回滚,这才形成闭环。

晚上十一点四十三,我检查完最后一次自动构建——绿色,全部通过。老婆孩子睡得正香,房租仍贵,35 岁危机仍悬在头上。但至少,我不再凌晨三点和 Jenkins 死磕了。如果你也在折腾持续集成,别迷信工具,多想想真正要解决的问题。工具会过时,但解决问题的思路不会。该睡了,明天还得早起送老大上幼儿园。

评论 0

最热最新
暂无评论
YAML别缩进Lv.1
0
影响力
0
文章
0
粉丝