第32章|GitHub Actions 触发与权限:事件、分支保护与最小权限

流水线跑不跑、能不能合并、会不会泄露密钥——三件事都由触发条件 + 分支策略 + Token 权限决定。 这一章把 GitHub 的「门禁系统」拆开讲:on 怎么写才精准, branch protection 怎么把检查变成硬门槛, permissions 怎么把爆炸半径压到最小。

Triggers

少跑、跑对

  • branches / paths / types 过滤
  • concurrency 防重复排队
  • workflow_run 链式慎用
Merge gate

合并 = 策略 + 检查

  • required checks
  • review + linear history
  • admin bypass 要治理
Least privilege

Token 默认要收紧

  • permissions 显式列出
  • fork PR 与 secrets 隔离
  • OIDC 替代长密钥(预告)

1. 触发器精细化:别让「每次 push 都跑全家桶」

on: 可组合事件与过滤条件:

提示:pull_request 的工作目录是「合并基线」上的临时 merge commit;与直接 push 到分支的行为略有差异,排障时要分清。
触发过滤:事件 × 分支 × 路径 只有穿过所有条件才 enqueue workflow_run event pull_request branches main, develop paths src/**, .github/** RUN 不匹配 → workflow 跳过,节省队列与分钟数
图 1:触发 = 事件 AND 分支 AND 路径(可扩展 types)。过滤越准,成本与噪声越低。

2. 分支保护 + Required checks:把「绿」变成「能合并」

在仓库 Settings → Branches 配置 protection rules(如 main):

合并门禁:PR → Checks → Policy → Merge PR Actions ci / lint / test required ✓ Branch rules reviews OK up-to-date base Merge 任一 required check 失败 → merge 按钮不可用
图 2:合并是「检查结果 + 分支策略」的合取;Required checks 名称需与 workflow job 对齐。

3. permissions:GITHUB_TOKEN 最小化

在 workflow 或 job 级设置 permissions:。常见模式:

高危:pull_request_target 在默认分支上下文运行且可访问 secrets——仅用于受控场景(如 label 触发后),切勿直接 checkout PR 恶意代码并执行。
权限爆炸半径:宽默认 vs 显式最小 wide default (avoid) many scopes writable larger blast if action compromised risk permissions: explicit contents: read pull-requests: read add write only in deploy job small
图 3:显式 permissions 缩小 token 能力面;写权限集中在少数 job(如 deploy),与读分离。

4. Environments:生产部署的另一道门

environment: 可绑定 protection rules:required reviewers、wait timer、deployment branches。 适合把「能合并 main」与「能触发生产部署」分开——与第 18~21 章 CD 治理一致。

5. 最小清单

  1. main 开 branch protection + required checks。
  2. 每个 workflow 写 permissions;deploy job 单独收紧/放宽。
  3. 用 paths 过滤减少无效 run;concurrency 控队列。
  4. 慎用 pull_request_target;fork 贡献走标准 PR + hosted runner。
← 上一章:Actions 入门 下一章:缓存与制品(cache / artifact)→