有没有一种方法可以为 GitHub Action 指定动态版本?

4

是否可以将动态版本传递给操作?下面的[dynamic version]是我希望从inputenv或其他方式填充的内容。

- name: Run action with dynamic version
  uses: org1/repo1/.github/actions/my-action1@[dynamic version]

- name: Run action with dynamic version
  uses: org1/repo1/.github/actions/my-action2@[dynamic version]

如需更多信息,我们有几个内部操作,其中所有版本都相同(来自同一存储库)。我们同时移动这些版本,并认为有一种方法可以一次指定它们。


除非对“uses”有特定的逻辑要求,否则我认为您正在寻找的是表达式。但请注意,例如env上下文明确不可用于该关键字:https://docs.github.com/en/actions/learn-github-actions/contexts#env-context - jonrsharpe
我熟悉表达式,但是在这种情况下找不到任何可用的表达式。 - tjg184
2个回答

3

@rethab的回答,建议使用主要版本标签(例如@v1而不是@v1.2.3@git-commit-hash)可能是最方便的方法。

然而,在极少数情况下,如果您确实需要在GitHub Action中指定动态版本(例如,您希望为操作和pip软件包使用完全相同的版本,或者您正在测试自己的GitHub Action),您可以使用jenseng/dynamic-uses操作,如下所示:

- uses: jenseng/dynamic-uses@v1
  with:
    # now you can use expressions 
    uses: actions/setup-node@${{ inputs.version }}
    # the `with` needs to be converted to a valid json string
    with: '{ "node-version": 18 }'

GitHub员工对于为何steps.uses不支持https://github.com/actions/runner/issues/895中的表达式进行了一些讨论。如果GitHub Actions未来支持steps.uses中的表达式,有人可能会在那里发表评论,请订阅该讨论串以获取更新。


2
您可能希望为您的操作使用语义化版本控制,并创建一个主要版本供消费者使用。
语义化版本控制允许所有操作的用户仅引用主要版本,并在发布补丁和新功能时受益。同时,您的用户需要在破坏性更改时手动更新引用,因为这会更改主要标签。
实际上,这意味着:
- 当您创建操作的新版本时,您需要在GitHub上创建一个指定完整版本的新发布,例如“v1.0.0”。 - 然后,您需要创建一个名为“v1”的标签,该标签指向相同的提交。 - 以后,当您修复某些内容时,您需要创建一个新版本“v1.0.1”。 - 现在,您还需要更新标签“v1”,使其指向新的提交(通常是删除并重新创建)。
这是一个麻烦的过程,但这是大多数作者所做的。
如果出于某种原因这不能满足您的要求,您也可以考虑始终使用“@main”引用。这通常不建议公共操作使用,因为更改可能会破坏您的工作流程,但在受控的内部环境中,这可能是可以接受的。
最后,请注意,当您使用的操作有新版本时,dependabot可以在您的存储库中创建PR。我在之前的答案中详细介绍了这一点:https://dev59.com/zsLra4cB1Zd3GeqPUusO#70196496

我们正在使用语义化版本控制。但是,由于某些原因,我并没有完全理解标签和发布之间的区别。 - tjg184
1
也是一个很好的参考。https://github.com/actions/toolkit/blob/master/docs/action-versioning.md - tjg184

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