单一来源
当前只有一个可用来源,尚未完成多源交叉核验锁定你的GitHub Actions工作流文件
目录
GitHub Actions 现在支持工作流锁定文件(workflow lockfiles)。
由于 GitHub Actions 是从 Git 获取的,以往的建议是锁定完整的 SHA(安全散列算法,Secure Hash Algorithm)而不是标签(tag)。这是因为标签是可变的,容易受到供应链攻击(supply-chain attacks),攻击者可能会将以前安全的标签指向恶意代码。
例如,一个旧的工作流看起来像这样:
name: Lint
on: [push, pull_request, workflow_dispatch]
permissions: {}
env: FORCE_COLOR: 1 RUFF_OUTPUT_FORMAT: github
jobs: lint: runs-on: ubuntu-latest
steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - uses: j178/prek-action@44924fe9ef4a6f88253c4b6b1bf11c689d3ce53d # v3.1.0
以下是我设置锁定文件(lockfiles)的方法。
安装 #
为 gh CLI(命令行界面,Command Line Interface)安装 gh-actions-lock 扩展:
$ gh extension install github/gh-actions-lock ✓ Installed extension github/gh-actions-lock
锁定它们 #
在你的仓库中,运行:
$ gh actions-lock
✓ All 1 workflows valid
现在该工作流使用 vX.Y.Z 标签,并且看起来像这样:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 946971c..3503607 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest
steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/[email protected] with: persist-credentials: false - - uses: j178/prek-action@44924fe9ef4a6f88253c4b6b1bf11c689d3ce53d # v3.1.0 + - uses: j178/[email protected]
并且它在 .github/workflows/actions.lock 生成了一个锁定文件:
# This file is machine-generated by `gh actions-lock`. # Do not edit by hand; run `gh actions-lock` to update. # Docs: https://gh.io/actions-lockfile version: 'v0.0.3' workflows: '.github/workflows/lint.yml': - 'actions/[email protected]' - 'j178/[email protected]' dependencies: 'actions/[email protected]': ref: 'v7.0.1' commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' owner_id: 44036562 repo_id: 197814629 'j178/[email protected]': ref: 'v3.1.0' commit: 'sha1-44924fe9ef4a6f88253c4b6b1bf11c689d3ce53d' owner_id: 10510431 repo_id: 1052387486
提交修改后的工作流和新的锁定文件。
Renovate 和 Dependabot #
好消息,两者都已经支持锁定文件!你的定期更新也会同时更新锁定文件。记得使用冷却期(cooldowns)。
验证 #
GitHub 还建议在 CI(持续集成,Continuous Integration)中验证锁定文件,以确保其为最新且未损坏。
他们建议将这个 verify-lockfile.yml 复制到你的仓库中。我决定把它放进我现有的 lint 工作流中,但作为它自己的独立作业(job),以便独立且并行地运行:
name: Lint
on: [push, pull_request, workflow_dispatch]
permissions: {}
env: FORCE_COLOR: 1 RUFF_OUTPUT_FORMAT: github
jobs: lint: runs-on: ubuntu-latest
steps: - uses: actions/[email protected] with: persist-credentials: false - uses: j178/[email protected]
当 .github/workflows/actions.lock 与工作流不同步,或者锁定的引脚无法再验证上游时,此操作会失败。lockfile: runs-on: ubuntu-slim env: GH_TOKEN: ${{ github.token }}
steps: - uses: actions/[email protected] with: persist-credentials: false - run: gh extension install github/gh-actions-lock --pin v0.4.1 - run: gh actions-lock --verify
请注意,这里我使用的是轻量级的 ubuntu-slim 运行器(runner)。此外,它被固定在 v0.4.1 版本;我们不得不在某个时候更新它,或者找出一种使其自动化的方法。那是以后要考虑的事。
别忘了我们刚刚修改了工作流中的 actions,因此需要使用 gh actions-lock 重新加锁。如果添加到 lint.yml,实际上不会发生任何变化,因为它已经对 actions/checkout 进行了加锁。但如果你创建了一个新文件(如 verify-lockfile.yml),则需要为其重新加锁。CI 会提醒你的。
zizmor #
zizmor 是一个针对 GitHub Actions 的安全检查工具(security linter),强烈推荐使用。如果你还没用,请务用起来。
v1.32.0 之前的版本会建议你对 actions 进行哈希锁定(hash-pin),而 v1.32.0 是第一个支持 lockfile 的版本。
我在 prek 中使用了 zizmor,因此请在 .pre-commit-config.yaml 中添加/更新 zizmor:
- repo: https://github.com/zizmorcore/zizmor-pre-commit rev: v1.32.0 hooks: - id: zizmor
已加锁! #
好了,提交并推送!
示例 #
· python-pillow/Pillow#10428
· python/release-tools#477
· python/miss-islington#758
· python/cpython#161811
头图:Smithsonian Libraries and Archives 收藏的《The Bearings》(第 XII 卷第 23 期,1896年1月2日)中的 Slaymaker Barry Co. 链轮锁,无已知版权限制。
Evidence
来源与证据
当前仅有一个可用来源,尚未完成多源交叉核验。
- 发布时间
- 内容处理
- AI 翻译 / 摘要,需结合原文核对
相关资讯
AI 翻译、摘要和解读仅用于辅助判断;涉及重要决策时,请回到上方来源核实。