跳到正文
认知
返回认知精选
认知精选科技大约 17 小时前2
单一来源当前只有一个可用来源,尚未完成多源交叉核验

锁定你的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

来源与证据

单一来源 · 1 个信源

当前仅有一个可用来源,尚未完成多源交叉核验。

发布时间
内容处理
AI 翻译 / 摘要,需结合原文核对
内容有误或来源失效?告诉我们

每天早上收到这 5 条

免注册,填邮箱即可;每封邮件都能一键退订。

提交即表示同意按隐私说明保存你的邮箱,只用于发送简报。

或用 RSS 订阅

AI 翻译、摘要和解读仅用于辅助判断;涉及重要决策时,请回到上方来源核实。