【问题标题】:How can I reuse a GitHub Actions workflow from the branch I'm currently working on?如何从我当前正在处理的分支中重用 GitHub Actions 工作流程?
【发布时间】:2022-01-04 05:12:34
【问题描述】:

我想用reusable workflow 抽象我的一些 GitHub 操作。

为此,我需要以{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 }}

但是,事实证明这不可能作为 can't be used 属性中的 can't be used 表达式。

我怎样才能做到这一点?

【问题讨论】:

  • 如你所说。目前无法完成,因为 Github Actions 不支持具有uses 属性的表达式。没有解决方法(还没有?),因为工作流解释器(也检查将工作流推送到存储库的工作流语法)此时无法从表达式中获取值。如果工作流被解释器识别,它可能会起作用,但它不会出现在“操作”选项卡上,因为它被认为是无效的。
  • 目前,您只能在@ 符号后使用tagbranch refcommit hash,与使用任何操作的方式相同。 (其他人在这里遇到了同样的问题:stackoverflow.com/questions/69500491/…
  • @GuiFalourd 你应该回答这个问题,这样你才能获得适当的奖励。即使无法完成 OP 请求,我相信其他人也会寻找相同的问题并感谢您知道目前不可能以及原因。
  • @croakPedlar 感谢您的反馈。我会按照你的建议添加它????
  • 我在此处添加了状态更新和潜在的解决方法,如果这有帮助的话。 stackoverflow.com/a/70571455/162830

标签: github-actions


【解决方案1】:

正如你所说:Github Actions 不支持uses 属性的表达式,暂时做不到。

没有解决方法(还没有?)因为工作流解释器(当您将工作流推送到存储库时也会检查工作流语法)此时无法从表达式中获取值.

如果工作流被解释器识别,它可能会起作用,但它不会出现在 Actions 选项卡上,因为它被认为是无效的。

目前,您只能在@ 符号后使用tagbranch refcommit hash,与使用任何操作的方式相同。

Note that someone else had the same issue here

【讨论】:

【解决方案2】:

解决方法的一种非常老套(且未经测试)的方法。

基于一个工作流可以包含多个作业这一事实,并假设一个低流失率的 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

【讨论】:

  • 如果多个工作流(由不同的提交触发)并行运行会怎样?
  • 相同的工作流程在不同的提交上运行......这就是我的“假设一个低流失的 PR 环境”发挥作用的地方。 :) 最后冲突的窗口是几秒钟,因为标记应该非常快,一旦呼叫工作流开始,我认为标记可以移动。
  • 这是有道理的。一个巧妙的解决方法,但我希望 GitHub 尽快添加一个合适的解决方案。
  • 未来读者请注意:如果您遇到此问题,请为该问题投票并让 GitHub 知道您的问题。没有反馈就不可能得到修复。
  • 不幸的是,这个解决方案没有按预期工作。在任何操作之前加载和解释工作流。这意味着您将始终采用以前的“当前分支”,而不是在设置作业中“准备”的新分支。
【解决方案3】:

我使用here 描述的工作流调度 github 操作成功触发了同一 repo 中的工作流 B(请注意,您需要设置个人访问令牌密码并包含 ref: ${{ github.event.pull_request.head.ref }} 以引用当前分支) .

但不幸的是,一旦工作流 B 被触发,工作流 A 就会继续,而不是等待工作流 B 是否成功。正如this thread 中所建议的那样,可能可以使用另一个github action 来使工作流A 等待工作流B 成功完成,但这对我来说似乎有点矫枉过正......也许这对其他人有用。手指交叉它得到支持:D

【讨论】:

    【解决方案4】:

    我们都知道这是站不住脚的,必须有一个长期的解决方案:您将要建立一个通用管道,并且可能有数百个 repos 调用相同的工作流。必须在您的可重用工作流上提交“主要”来测试它可能会破坏依赖它的每个管道。因此,GHA 将很快采用此功能,因为它必须这样做。 解决方法: 现在分叉而不是分支怎么样?您可以在 fork 上进行开发和测试,并在它工作时提交 PR。

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2020-08-20
      • 1970-01-01
      • 2020-03-20
      • 2022-01-10
      • 2022-07-04
      • 2020-04-02
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多