用途:将 GitHub Actions 工作流、复合 Action(composite actions)与可复用工作流(reusable workflows)中的每处 uses: 引用固定到提交 SHA,并核验该 SHA 属于所声明的 Action 仓库,防止标签被改写带来的供应链风险。
主要能力:
- 盘点:运行 python3 scripts/pin_check.py .,扫描 .github/workflows/、.github/actions/ 及树中所有 action.yml/action.yaml;输出 (文件, 行, action, ref, 状态) 表格,存在未固定引用时退出码为 1,可用 --json 输出机器可读结果。扫描器基于正则而非 YAML 解析,已知两类局限:run: | 块标量内的 uses: 行会产生误报;流式映射如 - {uses: owner/repo@v1} 不会产生行,遇到时需人工检查。
- 分类:状态包括已固定 SHA、未固定标签/分支/引用/提交、缺失 ref、无效自引用、本地路径、docker 镜像等;本地引用可跳过,docker 需单独标记。
- 解析并核验:用 gh api 从标签、分支、注解标签或提交端点解析出完整小写 SHA;改写前必须核验 SHA 归属(gh api repos/{owner}/{repo}/commits/{sha}),返回 404 说明不属于该仓库,须重新解析,不得写入未核验的 SHA。改写后保留原标签作为行尾注释。
- 用 Dependabot 保持更新:将 assets/dependabot-actions-snippet.yml 中的 github-actions 条目加入或合并到 dependabot.yml。
- 策略读取:可读取仓库或组织范围的 allowed-actions 策略(gh api repos/{owner}/{repo}/actions/permissions 或 gh api orgs/{org}/actions/permissions);写入端点必须获得用户对该具体变更的明确授权。
- 额外标记工作流脚本中的可变下载(curl 管道到 shell、无版本或校验和的 wget、未固定版本的 pip/npm/gem install),仅报告不改写。
使用方式:按盘点、分类、解析核验、Dependabot 配置、策略读取、标记脚本风险、可选 zizmor、最终复跑扫描器的顺序执行;最终以退出码 0 且无未固定行作为完成标准,本地与 docker 行单独报告,不算失败。
适用场景:需要对 GitHub Actions 供应链做 SHA 固定的仓库或组织。
限制:只负责供应链固定,不处理 Token-Permissions 与危险工作流加固,也不负责 CI 运行速度优化;策略写入需明确授权;资料未提供收费、价格或平台可用性信息。