如何知道使用哪个版本的GitHub Action

11

我在各种 GitHub Action 工作流示例中注意到,当调用预定义操作(使用 uses: 语法)时,通常会指定该操作的特定版本。例如:

steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'

上述工作流程中,对于actions/checkoutactions/setup-python都指定了@v2
问题是,如何知道使用@v2是最好的版本?
@v3可用时,我怎么知道?
更加令人困惑的是,用于发布到pypi的操作pypa/gh-action-pypi-publish的情况。在我查看的示例中,至少看到了四个不同的版本:
- pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 - pypa/gh-action-pypi-publish@master - pypa/gh-action-pypi-publish@v1 - pypa/gh-action-pypi-publish@release/v1 我如何知道要使用哪个版本? 总的来说,你如何知道哪些版本是可用的,并且它们之间的区别是什么?
2个回答

16

如何确定使用哪个版本?

在编写工作流并包含动作时,建议查看GitHub存储库上的发布选项卡。对于actions/setup-python,可以查看https://github.com/actions/setup-python/releases

在该页面上,您应该可以看到有哪些版本以及最新版本是什么。您需要使用最新版本,因为这样您就可以确保不会落后,并且升级在未来也不会变得太痛苦。

如何引用版本?

按照惯例,动作会使用特定的标签(例如v1.0.1)以及一个主要标签(例如v1)进行发布。这使您可以像这样引用动作:actions/setup-python@v1。一旦发布了版本v1.0.2,您将自动使用它。这意味着您可以从错误修复和新功能中受益,但无法引入破坏性更改。

但是,请注意,这仅是按惯例而行。并非每个动作的作者都会发布主要标签并随着新标签的发布而移动。此外,作者可能会引入破坏性更改而不提高主要版本。

何时使用其他格式

正如您所说,还有其他方法可以引用动作,例如特定提交(例如actions/setup-python@27b31702a0e7fc50959f5ad993c78deac1bdfc29)等。

通常情况下,您应该遵循上述标签。特别是,引用@main@master是危险的,因为您将始终获取最新更改,这可能会破坏您的工作流程。如果有一个动作建议您引用其默认分支并且它们不发布标签,则建议在其GitHub存储库中创建一个问题,要求发布标签。

如果您需要使用特定版本,则使用git哈希可能很有用。一个使用案例可能是您想测试特定版本是否可以解决问题,或者如果动作的作者推送了一些未被标记的更改,您可以测试该版本的动作。

安全性

从安全角度来看,使用标签(例如@v1@v1.1.0)或分支(例如@main)存在问题,因为该存储库的作者可能会更改其引用位置。恶意的动作作者可能会向该分支添加恶意代码,甚至仅在审核PR时不够谨慎,从而引入漏洞(例如通过传递依赖项)。

使用哈希(例如@27b31702a0e7fc50959f5ad993c78deac1bdfc29)可以确切地知道你得到了什么,除非你选择通过更新哈希来更改版本(此时你可以仔细审查更改),否则它不会改变。

截至2022年初,使用哈希而非标签的做法并不普遍,但例如GitHub为其文档存储库采用了这种方式。随着供应链安全变得越来越重要,出现了一些工具来帮助进行“固定”(通过哈希而非标签指向特定版本),例如sethvargo/ratchet。但是即使是下面提到的Dependabot也应该能够将哈希更新到最新的哈希值。

如何知道是否有新版本?

你可以使用Dependabot: 使用Dependabot保持操作的最新状态。Dependabot是一个工具,一旦任何操作的新版本可用,它就会在你的存储库中创建一个拉取请求,以便你可以审查更改并保持工作流程的最新状态。

以下是一个示例Dependabot配置,它通过创建PR来保持你的操作最新:

version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "daily"

1
GitHub正在努力使标签不可变:https://github.com/github/roadmap/issues/592 - rethab

2

人们应该习惯基于标签的发布管理(例如 Docker), 这在像 这篇文章 中有所记录。

用户如何知道使用哪个标签?通常,操作文档文件包含推荐使用的版本,因此99%的用户应该遵循该版本。只有当你想要处于最前沿时才需要使用其他标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接