原文链接:
多仓库团队最容易出现 CI 分裂:
Reusable workflows 用 workflow_call 把公共 CI 逻辑抽出来,让业务仓库调用统一模板。
公共仓库:
org/.github
.github/workflows/
java-ci.yml
node-ci.yml
security-scan.yml
公共 workflow:
name: java-ci
on:
workflow_call:
inputs:
java-version:
required: false
type: string
default: "17"
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: $
- run: mvn test
业务仓库调用:
name: ci
on:
pull_request:
push:
branches: [main]
jobs:
java-ci:
uses: org/.github/.github/workflows/java-ci.yml@v1
with:
java-version: "21"
业务仓库调用公共 workflow 时,不要长期使用 @main。
推荐:
uses: org/.github/.github/workflows/java-ci.yml@v1
这样公共模板升级不会突然影响所有仓库。
分支保护依赖 status check 名称。
公共 workflow 的 job 名称要尽量稳定,避免改名导致主分支保护失效。
公共 workflow 里显式声明权限:
permissions:
contents: read
需要写 PR 评论、上传安全结果、发布包时,再单独提高权限。
不要写一个超级 workflow 处理所有语言。
建议按语言和职责拆:
java-ci.ymlnode-ci.ymlgo-ci.ymldocs-ci.ymlsecurity-scan.ymlrelease.yml解决:用 tag 或 release 分层升级。
解决:公共模板提供少量输入参数,但不要把每个细节都参数化。
解决:能用 secrets: inherit 时也要明确边界,高风险 secret 要限制在必要仓库和环境。
40+ 微服务团队做 GitHub 工程治理时,Reusable workflows、Rulesets、CODEOWNERS 是三件基础设施。
它们分别解决: