Skip to main content
Skip to content

工作流依赖项锁定文件

锁文件将工作流所依赖的每个操作固定到已验证的提交,因此你审查的代码就是实际运行的代码。

注意

工作流依赖项锁文件位于公开预览中,并且可能会更改。

为什么锁定工作流依赖项?

当工作流通过标记或分支(如 uses: octo-org/deploy-action@v3 或 uses: octo-org/deploy-action@main)引用某个操作时,GitHub Actions 将该引用解析为标记或分支在运行时所指向的提交。

标记和分支可以移动,因此无法保证运行的代码是工作流作者最初审阅的代码。 如果上游维护者的帐户遭到入侵并且标签被重新指向,则存储库可能会运行恶意代码。

工作流依赖项锁定文件将提交 SHA 固定到每个操作(包括可传递依赖项)以及你的工作流所依赖的可重用工作流。 这为你提供了:

  • 可重现构建
  • 可查看的依赖项更改和 Dependabot 版本更新
  • CI/CD 系统的依赖项的可审核清单

lockfile 的工作原理是什么?

lockfile 在位于 .github/workflows/actions.lock 的存储库中定义。 它由 gh actions-lock 生成,这是一个 GitHub CLI 扩展,且绝不应手动编辑。

可以将存储库的工作流逐个或一次性载入锁文件。 载入工作流后:

  • 工作流使用的每个操作依赖项都必须存在于 lockfile 中。
  • 锁定的提交是工作流执行时运行的提交,也是允许的操作策略检查的对象。 此提交必须存在于源存储库的分支中。

锁文件涵盖其自身仓库中的工作流。 它扩展到传递依赖项(_你的操作依赖项_使用的操作),但可重用工作流调用的依赖项除外。 可重用工作流受其定义所在存储库的锁定文件约束。

锁定文件记录了什么?

lockfile 有两个部分。 workflows 记录每个已接入的工作流使用的依赖项,以及 dependencies 记录这些引用中的每一个解析到哪个提交。

# This file is machine-generated by `gh actions-lock`.
# Do not edit by hand; run `gh actions-lock` to update.
version: 'v0.0.2'
workflows:
    '.github/workflows/ci.yml':
        - 'octo-org/deploy-action@v3.1.0'
dependencies:
    'octo-org/deploy-action@v3.1.0':
        ref: 'v3.1.0'
        commit: 'sha1-...'
        owner_id: 44036562
        repo_id: 197814629

每个依赖项记录:

  • ref:工作流使用的引用,例如标记或分支。
  • commit:该引用解析到的确切提交。 这是将运行的代码。
  • owner_id 和 repo_id:源存储库的数字标识。 GitHub Actions 在运行时使用它们来确认该名称对应的存储库仍然是你锁定的存储库。

锁文件与 SHA 固定相比如何?

GitHub 历来建议将第三方操作固定到工作流文件中的完整提交 SHA。 对于采用锁定文件的存储库,不再需要在工作流文件中固定 SHA。 锁文件是更好的选择,因为它支持可传递依赖项,使工作流文件更易于读取,并记录源存储库的标识。

后续步骤

若要为存储库创建锁文件,请参阅 锁定存储库工作流中的 GitHub Actions 依赖项。