AI 时代,CI/CD 不是可选项


AI 时代,CI/CD 不是可选项

AI 时代,CI/CD 不是可选项封面图

最近看到宝玉在 X 上转发了一条关于 Web Infra Team 的讨论。

原帖大意是:AI 进入团队之后,原来的 Web Infra Team 变得很难分组,职责边界也乱了。宝玉的判断更直接:

大部分公司不再需要 web infra team 了,做好各种 skills 和自动化测试部署(CI/CD),积极拥抱 AI 友好的开源项目,简化设计系统到 design.md。

评论区很有意思。有人赞同,认为中小团队确实没必要再维护一堆自研轮子;也有人反驳,说大厂和复杂系统仍然离不开 Infra。后面宝玉补充了一句关键限定:他说的是“大部分”,尤其是那些以前在中小团队里自建了很多私有工具链、私有框架、私有流程的场景。

我觉得这场讨论真正重要的点,不是“Web Infra Team 还需不需要”,而是另一个问题:

当 AI 可以更快地产生代码之后,什么东西会变得更重要?

我的答案是:验证、交付和工程护栏

这也是 CI/CD 值得认真理解的原因。它不是一个 DevOps 黑话,也不是大厂专属流程。对普通开发者来说,CI/CD 可以从一个非常朴素的问题开始:

我能不能每次把代码 push 到 GitHub 后,让 GitHub 自动帮我测试、构建,甚至部署?

这篇文章就从这个问题讲起。

不要先背概念:CI/CD 解决什么问题?

先想一个最普通的项目。

你写完代码后,通常要做这些事:

  • 安装依赖;
  • 检查代码格式;
  • 跑测试;
  • 构建项目;
  • 确认页面或接口没有明显问题;
  • 部署到服务器、GitHub Pages、Vercel 或其他平台;
  • 如果出错,再回滚或重新发布。

如果这些步骤全靠人手动做,问题很快就会出现:

  • 今天记得跑测试,明天可能忘了;
  • 你本地能跑,别人电脑上不一定能跑;
  • 某次小改动看似无害,却把构建弄坏了;
  • 部署流程靠记忆,步骤越多越容易出错;
  • AI 一次性改了十几个文件,人很难逐行确认所有影响。

CI/CD 的本质,就是把这些重复、容易漏、需要标准化的流程交给机器执行。

flowchart TD
    A[开发者提交代码] --> B[GitHub 触发自动流程]
    B --> C[安装依赖]
    C --> D[运行测试和检查]
    D --> E{是否通过}
    E -->|通过| F[构建产物]
    F --> G[部署或等待人工确认]
    E -->|失败| H[阻止合并或发布]

从这个角度看,CI/CD 不是为了让工程变复杂,而是为了让工程流程从“靠人记住”变成“由系统执行”。

CI:持续集成,先防止代码把项目搞坏

CI 是 Continuous Integration,中文一般叫“持续集成”。

听起来有点抽象,但可以先这样理解:

每次有人提交代码,系统自动检查这次改动有没有把项目搞坏。

常见的 CI 动作包括:

  • 安装依赖;
  • 运行单元测试;
  • 运行代码格式检查;
  • 运行 TypeScript 类型检查;
  • 构建项目;
  • 检查安全漏洞;
  • 检查文档或配置是否有效。

如果 CI 失败,就说明这次提交至少没有通过基本工程检查。它不一定代表代码逻辑一定错,但它会提醒你:不要直接把这次改动合进主分支,更不要直接发布。

CI 的价值是“尽早发现问题”。

没有 CI 时,问题可能在线上才暴露;有 CI 时,问题在 pull request、push 或 merge 之前就会暴露。

CD:持续交付或持续部署,把发布流程也自动化

CD 有两个常见含义:

  • Continuous Delivery:持续交付;
  • Continuous Deployment:持续部署。

对刚接触的人来说,可以先不用纠结术语差异,记住一句话:

CI 负责检查代码有没有问题,CD 负责把通过检查的代码发布出去。

它们的区别大概是:

  • 持续交付:系统自动准备好可发布版本,但最后是否发布由人决定;
  • 持续部署:只要检查通过,系统自动发布到线上环境。

个人项目里最常见的 CD 场景是:

  • 前端项目自动部署到 GitHub Pages、Vercel、Netlify;
  • 文档站自动发布;
  • 后端服务自动构建 Docker 镜像;
  • npm 包或 Python 包自动发布;
  • 打 tag 后自动生成 release。

所以 CI/CD 可以拆成一句更好懂的话:

CI 让系统自动检查,CD 让系统自动交付。

GitHub Actions:GitHub 自带的自动化机器

GitHub Actions 是 GitHub 提供的自动化平台。

你可以把它理解为:

GitHub 临时给你一台机器,当你 push、提交 PR、打 tag 或手动触发时,它会按照你写好的脚本自动干活。

GitHub Actions 的配置文件通常放在:

.github/workflows/xxx.yml

比如:

.github/workflows/ci.yml

它里面有几个核心概念:

  • Workflow:一整套自动化流程;
  • Event:什么时候触发,比如 push、pull_request、release;
  • Job:流程里的一个任务,比如 test、build、deploy;
  • Step:Job 里的具体步骤,比如拉代码、装 Node、跑测试;
  • Runner:执行这些步骤的机器,比如 ubuntu-latest。
flowchart LR
    A[Event
push / pull_request] --> B[Workflow
ci.yml] B --> C[Job
test-and-build] C --> D[Step
checkout] D --> E[Step
setup node] E --> F[Step
npm ci] F --> G[Step
test / build] G --> H[Result
pass or fail]

这就是 GitHub Actions 的基本心智模型。

一个最小的 GitHub Actions CI 示例

假设你有一个 Node.js 项目,比如 React、Vite、Next.js、Vue,最小 CI 可以这样写:

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test-and-build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: npm ci

      - name: Run tests
        run: npm test

      - name: Build project
        run: npm run build

逐行解释一下:

  • name: CI:这套流程叫 CI;
  • on:定义什么时候触发;
  • push.branches: [main]:push 到 main 分支时触发;
  • pull_request.branches: [main]:有人向 main 提 PR 时触发;
  • runs-on: ubuntu-latest:使用 GitHub 提供的 Ubuntu 机器;
  • actions/checkout@v4:把仓库代码拉下来;
  • actions/setup-node@v4:安装 Node.js;
  • npm ci:按 lockfile 安装依赖;
  • npm test:跑测试;
  • npm run build:构建项目。

如果其中任何一步失败,整个 CI 就会失败。GitHub 会在 PR 或 commit 上显示红色叉号,提醒你这次改动没有通过检查。

这就是最小可用的 CI。

它不复杂,但很有价值。

如果项目现在没有测试怎么办?

很多人第一次接触 CI/CD 时会卡在这里:项目没有测试,那是不是就不能用 CI?

不是。

你可以从更低成本的检查开始:

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: npm ci

      - name: Build project
        run: npm run build

哪怕只跑一个 npm run build,也能发现很多问题:

  • 依赖没装对;
  • TypeScript 编译不过;
  • 打包时引用了不存在的文件;
  • 某些环境变量缺失;
  • 某些模块在 Linux 环境下无法运行。

所以 CI/CD 入门不需要一步到位。先让 GitHub 自动帮你构建起来,就是一个很好的开始。

再进一步:自动部署 GitHub Pages

如果你的项目是前端静态站点,构建产物通常在 dist 目录。你可以让 GitHub Actions 在 push 到 main 后自动部署到 GitHub Pages。

一个典型流程是:

name: Deploy to GitHub Pages

on:
  push:
    branches: [main]

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: ./dist

  deploy:
    needs: build
    runs-on: ubuntu-latest

    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}

    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4

这个流程做了两件事:

  1. build 任务负责拉代码、装依赖、构建项目、上传构建产物;
  2. deploy 任务依赖 build,只有构建成功后才会部署到 GitHub Pages。

这就是一个简单的 CD。

注意这里有一个很重要的工程习惯:部署任务应该依赖构建和检查任务

不要让部署绕过验证。否则自动化只会把错误更快地送到线上。

为什么 AI 时代 CI/CD 更重要?

回到开头那条 X 讨论。

AI 进入开发流程后,很多公司会发现:过去 Web Infra Team 里一部分“封装脚手架、维护内部组件、写重复工具”的工作,确实会被开源生态和 AI 工作流削弱。

但这不意味着 Infra 变得不重要。

恰恰相反,Infra 的重心会变化:

  • 从“大家都必须用我封装的工具”变成“让代码更容易被 AI 理解”;
  • 从“流程靠文档提醒”变成“流程由系统自动执行”;
  • 从“上线前人工确认一下”变成“自动测试、自动构建、自动阻断”;
  • 从“出了问题再查”变成“每次提交都留下可追溯记录”。

AI 写代码有几个特点:

  • 产出速度快;
  • 一次改动范围可能很大;
  • 局部代码看起来合理,但整体行为不一定正确;
  • 它可能修好一个问题,又引入另一个问题;
  • 人很难逐行理解所有生成内容。

这时候 CI/CD 就不只是“方便”,而是工程护栏。

flowchart TD
    A[AI 或人类提交代码] --> B[CI 自动检查]
    B --> C[测试]
    B --> D[类型检查]
    B --> E[构建]
    B --> F[安全扫描]
    C --> G{全部通过?}
    D --> G
    E --> G
    F --> G
    G -->|是| H[允许合并或部署]
    G -->|否| I[阻断并反馈错误]

如果没有这些护栏,AI 只是在提高“写代码”的速度;有了这些护栏,AI 才更可能提高“可靠交付”的速度。

这也是为什么宝玉那句话里,我最关注的不是“不要 Web Infra Team”,而是“做好 skills 和自动化测试部署”。

未来更有价值的 Infra,可能不是给团队造一套没人懂的私有框架,而是把项目变成 AI 友好的工程系统:

  • README 写清楚怎么启动;
  • design.md 写清楚设计系统;
  • AGENTS.md 写清楚 AI 协作约束;
  • CI/CD 自动验证每次改动;
  • 测试覆盖关键路径;
  • 部署流程可回滚、可审计、可复现。

这才是 AI 时代真正有用的基础设施。

新手应该从哪里开始?

如果你以前没怎么用过 GitHub CI/CD,不建议一上来就学完整 DevOps 体系。

可以按这个顺序来:

第一步:先让项目自动构建

只做一件事:push 后自动跑 npm run build

这一步能保证项目至少在 GitHub 的 Linux 环境里能构建成功。

第二步:加入 lint 和类型检查

如果项目有这些命令,就加进去:

npm run lint
npm run typecheck

这一步能抓住格式、规范和类型错误。

第三步:加入测试

如果项目还没有测试,可以先从关键函数、关键接口、关键页面开始,不需要追求一开始就覆盖所有代码。

CI 的目标不是制造焦虑,而是让关键路径越来越可靠。

第四步:再考虑自动部署

不同项目的部署目标不同:

  • 前端项目:GitHub Pages、Vercel、Netlify;
  • 文档项目:GitHub Pages;
  • 后端项目:Docker 镜像、云服务器、Kubernetes;
  • SDK 或工具库:npm、PyPI、GitHub Release。

部署前一定要先有基本检查。否则 CD 只是“自动把未经验证的代码发布出去”。

第五步:给高风险操作加人工确认

自动化不是所有事情都自动做。

生产环境发布、数据库迁移、删除数据、修改权限这类高风险动作,最好加上人工确认或环境保护规则。

GitHub Actions 支持 environment protection rules,可以让某些部署任务必须经过审批后才执行。

一个适合个人项目的最小实践框架

对个人项目来说,CI/CD 可以很轻,不需要一开始就复杂。

我建议从这个最小框架开始:

flowchart LR
    A[push / PR] --> B[安装依赖]
    B --> C[构建]
    C --> D[测试]
    D --> E{通过?}
    E -->|否| F[停止]
    E -->|是| G[合并或部署]

对应到 GitHub Actions,大概就是:

  • 一个 ci.yml:负责构建和测试;
  • 一个 deploy.yml:负责部署,并且依赖构建成功;
  • 逐步增加 lint、typecheck、安全扫描、缓存、矩阵测试;
  • 不要为了复杂而复杂。

真正重要的是把流程跑起来。

CI/CD 不是大厂专属,它是项目的自动刹车

很多人会觉得 CI/CD 是大厂、平台组、DevOps 工程师才需要的东西。

这个理解已经过时了。

个人博客、开源项目、课程项目、AI Agent 项目,同样需要 CI/CD,只是规模不同。

对个人项目来说,CI/CD 的价值至少有三点:

  1. 防止低级错误进入主分支:比如构建失败、依赖缺失、测试失败;
  2. 让项目更容易协作:别人提 PR 时,系统自动告诉你能不能合;
  3. 给 AI 代码一个客观反馈:AI 写完代码后,不要只靠肉眼看,要让系统自动验证。

AI 时代,代码生产速度变快,错误传播速度也会变快。

CI/CD 就像自动刹车。它不会替你决定产品方向,也不会保证代码完美,但它能在关键时刻拦住明显错误。

结语:从“会写代码”到“能稳定交付”

宝玉那条 X 讨论,表面上是在说 Web Infra Team 的去留;深一层看,其实是在讨论 AI 时代工程基础设施的重新分工。

我的判断是:

造轮子的 Web Infra 会变少,服务 AI 协作的工程基础设施会变多。

CI/CD 就是其中最基础的一层。

它让测试、构建、检查、部署从人的记忆里搬到系统里;它让 AI 写出来的代码接受客观验证;它让项目不再依赖“这次我应该没忘记哪个步骤”。

所以,CI/CD 不是可选项。尤其在 AI 编程时代,它会越来越像项目的基本卫生条件:不一定显眼,但缺了迟早会出问题。

如果你还没用过 GitHub Actions,最好的开始不是读完所有文档,而是给自己的项目加一个最小的 .github/workflows/ci.yml

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Install dependencies
        run: npm ci

      - name: Build project
        run: npm run build

先让它跑起来。

当你第一次看到 GitHub 自动帮你完成构建,那一刻你就会明白:工程化不是抽象概念,它就是把正确的步骤交给系统反复执行。

参考


文章作者: Onefly
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Onefly !
评论
  目录