CI / CD 与 GitHub Actions
工程化里很容易有一个阶段:本地一切正常,换到别的电脑、CI 环境或者发布环境之后,问题就开始出现。
所以 CI / CD 这一层关心的,不是“自动跑个脚本”这么简单,而是把这些事情稳定下来:
- 提交后能不能自动验证
- 构建产物是不是可重复
- 发布流程是不是可追踪
- 回滚和环境隔离是不是清楚
先把 CI 和 CD 分开
CI 是什么
CI,Continuous Integration,通常先解决这些问题:
- 每次 push / PR 是否自动跑 lint、typecheck、test、build
- 依赖安装和 Node 版本是否一致
- 团队提交进来的代码能不能尽早发现问题
CD 是什么
CD,通常会分成两种理解:
- Continuous Delivery:产物随时可发布,但是否上线还要人工确认
- Continuous Deployment:产物验证通过后自动上线
所以一个更稳的理解是:
- CI 负责验证
- CD 负责交付和发布
为什么前端项目更需要 CI / CD
前端项目的“不稳定”通常不只来自代码本身,还来自这些地方:
- Node 版本不一致
- lockfile 漂移
- 构建脚本只在某个人电脑上跑得过
- 环境变量缺失
- 打包产物在 CI 和本地不一致
- 发布流程全靠手动点按钮
CI / CD 的价值,就是把这些隐性差异尽量提前暴露出来。
GitHub Actions 在这条链路里的位置
GitHub 官方文档把 Actions 定义成一套 CI / CD 平台:工作流由事件触发,工作流里包含 job,job 里再按 step 执行脚本或 action。
先记住这几层就够了:
- workflow:一份自动化流程
- event:触发条件
- job:一个独立任务
- step:任务里的具体步骤
- action:可复用的自动化单元
- runner:真正执行任务的机器
一个最常见的前端 CI 工作流
前端仓库最常见的一条线通常是:
- 拉代码
- 安装依赖
- 跑 lint
- 跑 typecheck
- 跑 test
- 跑 build
对应到 GitHub Actions,最小工作流大概会长这样:
name: ci
on:
pull_request:
push:
branches:
- main
- develop
jobs:
verify:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install
run: pnpm install --frozen-lockfile
- name: Lint
run: pnpm run lint
- name: Typecheck
run: pnpm run typecheck
- name: Test
run: pnpm run test
- name: Build
run: pnpm run build
这已经能覆盖大多数前端项目最基础的验证链路。
workflow 文件一般放哪
GitHub Actions 的 workflow 文件通常放在:
.github/workflows/
ci.yml
deploy.yml
一个仓库里可以有多份 workflow,不需要把所有流程都塞进同一份 YAML。
触发条件怎么理解
最常见的 on 一般是这些:
pushpull_requestworkflow_dispatchschedule
push
适合主分支或开发分支的持续验证。