GitHub Actions 多服务 CI
Monorepo 多服务 CI 设计:并行 job、各服务独立 lint/build/test、并发取消、commitlint。
#howto
#growing
#ops
#github-actions
[!info] related notes
- 相关: Conventional Commits
- 发布: release-please
GitHub Actions 多服务 CI
本文是 web / Go API / Python AI 服务的 CI 设计示例,不表示当前仓库存在这三个服务。目标是对每个服务得到独立的检查结果;需要先确认实际目录、依赖锁文件与工具链版本。
设计要点
三个服务并行
web job → pnpm lint / typecheck / build / test
api job → go vet / build / test
ai-service job → ruff check / pytest
这是职责草图,不是可执行 YAML。实际 job 还需 runs-on、checkout、工具链安装、依赖安装和 steps,并给命令设置正确的工作目录。
没有 needs 依赖的 job 可以并行调度,但受 runner 数量、账户并发限制和排队影响。仅在都能同时开始时,总执行时间才近似最慢 job 的耗时。
并发取消
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
同一 concurrency group 的新运行会替换待运行项;cancel-in-progress: true 还请求取消正在执行的旧运行。上述写法按 workflow 和 ref 分组,PR 的 ref 与分支 push 不同。适合可取消的 CI;部署或已产生外部副作用的步骤不能假定取消等于回滚。
各服务的工具链
| 服务 | 包管理 | Lint | Test |
|---|---|---|---|
| web | pnpm | ESLint | Vitest |
| api | go mod | go vet | go test |
| ai-service | uv | ruff | pytest |
Commitlint
可在 PR 时检查提交消息;若采用 squash-merge,还应校验最终 squash 消息的来源(常为 PR 标题)。仅检查分支内的每个 commit,并不保证合并后的消息符合 Conventional Commits。
缓存
各工具链的缓存:
- pnpm: 可用
actions/setup-node的cache: pnpm缓存包存储;需先准备可用 pnpm,并指定正确锁文件路径,不代表缓存node_modules - Go:
actions/setup-go内置 - uv:
astral-sh/setup-uv提供缓存支持,按使用版本核对启用方式
缓存用于加速,不能替代依赖安装,也不应影响检查结果。各服务应按锁文件和工具链版本设置缓存边界。
验证
- 修改单个服务后,检查预期 job 被调度且工作目录正确。
- 确认 lint、类型检查、构建、测试失败会让对应 job 失败,未通过时不能显示为成功。
- 在测试分支连续提交,确认旧 CI 被取消、新提交得到完整结果。
- 清空或未命中缓存时也能安装依赖并通过检查。