我该如何在当前工作的分支上重用GitHub Actions工作流程?

31

我想要用可重用工作流(reusable workflow)来抽象一些 GitHub Actions。

为了做到这一点,我需要以 {owner}/{repo}/{path}/{filename}@{ref} 的格式调用我的新定义的可调用工作流。

例如(摘自文档)

jobs:
  call-workflow-1:
    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@172239021f7ba04fe7327647b213799853a9eb89
  call-workflow-2:
    uses: octo-org/another-repo/.github/workflows/workflow-2.yml@v1

然而,在实践中,我正在处理我的分支some-branch-name,在这个分支上我正在处理我的workflow-1.yml文件,并且我希望能够按照当前分支定义运行我的操作,给定

`{ref}`可以是SHA、发布标签或分支名称。

看起来我需要使用:

jobs:
  call-workflow-1:
    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@some-branch-name

但是,我希望这适用于任何分支,因此

jobs:
  call-workflow-1:
    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@${{ github.ref }}

但是事实证明,由于表达式无法uses属性中使用,这是不可能的。

我该如何实现?


1
就像你所说的那样。目前无法实现,因为Github Actions不支持带有“uses”属性的表达式。目前还没有解决方法,因为工作流解释器(也会检查您将工作流推送到存储库时的工作流语法)无法在那时从表达式中获取值。如果工作流被解释器识别,它可能会起作用,但是它甚至不会出现在操作选项卡上,因为它被认为是无效的。 - GuiFalourd
1
目前,您只能在@符号后使用tagbranch refcommit hash,就像使用任何操作一样。(这里有其他人遇到了相同的问题:https://dev59.com/vVEG5IYBdhLWcg3wP39V) - GuiFalourd
1
@GuiFalourd,你应该把它作为一个答案,这样你才能得到适当的奖励。即使OP请求的事情无法完成,我相信其他人也会寻找同样的问题,并欣赏你目前不可能实现的知识和原因。 - croakPedlar
@croakPedlar 感谢您的反馈。我会按照您的建议进行添加。 - GuiFalourd
1
如果有帮助的话,我在这里添加了一个状态更新和一个潜在的解决方法。https://dev59.com/vVEG5IYBdhLWcg3wP39V#70571455 - basicdays
这个问题仅在一周前被修复。现在可以使用相对路径引用可重用的工作流程:uses: ./.github/workflows/...。请参见 https://dev59.com/vVEG5IYBdhLWcg3wP39V#71067823 以及其中的链接。 - Rene Hamburger
5个回答

20
2022年1月25日起,GitHub Actions支持引用本地的可重复使用工作流,示例请参见博客
jobs:
  call-workflow-in-local-repo:
    uses: ./.github/workflows/workflow-2.yml

以下是来自我开放的问题的一个真实生活例子: https://github.com/TWiStErRob/net.twisterrob.healthcheck/pull/28

注意:使用此./语法,可重用的工作流定义(.yml文件)和使用(uses从工作)必须在同一存储库中。更多信息,请参见:此处


1
@Joshua,现在应该批准这个答案。 - monchisan
请参见 https://dev59.com/vVEG5IYBdhLWcg3wP39V - Mark Han
@MarkHan “调用方和被调用方的工作流必须在同一个代码库中”这个要求有点隐含,因为问题是“来自同一分支”,而根据Git对“分支”的定义,你不能在多个代码库之间拥有相同的分支。 - TWiStErRob
@TWiStErRob 在这里提供额外的清晰度并不一定是件坏事;即使对于某些人来说似乎很明显,但对于其他人来说可能并不明显。 - Mark Han

14

编辑:自2022年1月25日起,这已得到支持

(详情请查看TWiStErRob的回答).


2022更新前的回答:

正如您所说,目前无法使用 Github Actions 支持包含 uses 属性的表达式。

目前没有解决办法(还没有?),因为工作流解释器(也会在将工作流推送到存储库时检查工作流语法)此时无法从表达式中获取值。

如果工作流被解释器识别,它可能会正常工作,但是由于被认为是无效的,因此它甚至不会出现在“Actions”选项卡中。

目前,您只能在 @ 符号之后使用 tagbranch refcommit hash,就像使用任何一个操作一样。

注意,这里还有其他人遇到了同样的问题


https://dev59.com/_1EG5IYBdhLWcg3wP35V#69785356 可以作为一种解决方法吗? - TWiStErRob
值得测试一下,看看是否按预期工作。我会检查的!谢谢分享。 - GuiFalourd
2
“Yet”已经到来:https://dev59.com/_1EG5IYBdhLWcg3wP35V#72498960 - TWiStErRob
1
@TWiStErRob在下面提供了最新和正确的答案。 - Mark Han

4

更新:不要使用此方法,请参见其他答案


我将为您翻译编程相关内容。以下是需要翻译的文本:

这是一种非常粗糙(且未经测试)的方法来解决此问题。

基于工作流可以包含多个作业的事实,并假设PR环境变化率较低,可以设置如下内容:

jobs:
  tag-my-workflow:
    steps:
      - name: git tag ${{ github.ref }} as "current-branch"
        uses: see for example https://levelup.gitconnected.com/how-to-move-a-git-tag-using-github-actions-e23a523eb325

  call-workflow:
    needs: tag-my-workflow
    uses: my/repo/.github/workflows/called.yml@current-branch

如果多个工作流程(由不同的提交触发)并行运行会发生什么? - Johnny Oshika
2
同样的工作流在不同的提交上运行...这就是我的“假设低变更率PR环境”的应用场景。 :) 最终,冲突的时间窗口只有几秒钟,因为标记应该非常快速,一旦调用工作流开始,我认为标记可以移动。 - TWiStErRob
这很有道理。一个不错的解决方法,但我希望GitHub能尽快添加一个适当的解决方案。 - Johnny Oshika
未来的读者请注意:如果您遇到此问题,请为该问题点赞并让GitHub知道您的问题。没有反馈,问题很难得到解决。 - TWiStErRob
很遗憾,这个解决方案并没有按预期工作。工作流在任何操作之前都已经被加载和解释了。这意味着你总是会使用之前的“当前分支”,而不是在设置作业中“准备好”的新分支。 - solikhver
@solikhver 即使它是 needs: 也可以吗?如果一个工作流触发另一个工作流呢? - TWiStErRob

3

我使用了在这里描述的workflow-dispatch github action成功触发了同一仓库中工作流B(请注意,您需要设置个人访问令牌密钥,并包含ref: ${{ github.event.pull_request.head.ref }}以引用当前分支)。

但不幸的是,在触发工作流B之后,工作流A继续运行,而不是等待看看工作流B是否成功。如在此帖子中建议的那样,可能可以使用另一个github action使工作流A等待工作流B成功完成,但对于我来说好像有些过度...也许对其他人有用吧。希望它能得到支持:D


1
我们都知道这是不可行的,必须有一个长期的解决方案:您将需要建立一个共同的流水线,并且可能有数百个存储库调用相同的工作流程。不得不提交到您可重用的工作流程上的 'main' 进行测试可能会破坏依赖它的每个流水线。因此,GHA很快就会拾取这个功能,因为它必须这样做。 解决方法:暂时改为分叉而不是分支怎么样?您可以在分叉上开发和测试,并在其正常工作时提交PR。

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