如何使用GitHub Actions中的`workflow_run`事件?

42

另一个经常请求的 Actions 功能是一种基于完成另一个工作流来触发一个工作流的方法。例如,您可能希望获取 CI 工作流的结果并运行一些进一步的分析。

新的 workflow_run 事件使您能够在请求或完成一个或多个工作流时触发新的工作流。由 workflow_run 事件触发的运行始终使用存储库的默认分支,并具有读/写令牌以及密钥。例如,作为维护者,您可以设置一个工作流,该工作流获取由拉取请求工作流生成的构件,进行一些分析,并将评论返回到拉取请求中。此事件也可用作 webhook,并适用于所有存储库。

这是引自Github博客的引用内容。

有人能告诉我如何使用新事件workflow_run实现所提出的示例吗?文档只提供了一个非常简单的示例:

on:
  workflow_run:
    workflows: ["Run Tests"]
    branches: [main]
    types: 
      - completed
      - requested

如果有人能够教我如何实现这个例子,我将非常高兴。


无法回答,但基本上在GitHub社区中询问了相同的问题,链接为https://github.community/t/workflow-run-not-triggered/144999。 - andig
1个回答

58
为了让示例正常工作(即使一个工作流等待另一个完成),您需要两个文件。这两个文件都位于存储库的.github/workflows文件夹中。
第一个文件将像往常一样设置。此文件将由on部分中设置的任何事件触发:
---
name: Preflight

on:
  - pull_request
  - push

jobs:
  preflight-job:
    name: Preflight Step
    runs-on: ubuntu-latest
    steps:
      - run: env

第二个文件表明它应该仅在名称为“Preflight”的任何工作流中触发workflow_run事件的 on 命令。
---
name: Test

on:
  workflow_run:
    workflows:
      - Preflight
    types:
      - completed

jobs:
  test-job:
    name: Test Step
    runs-on: ubuntu-latest
    steps:
      - run: env

这基本上与GitHub Actions手册中的示例相同。

正如您在操作页面上看到的那样,我的示例存储库,Preflight工作流程将首先运行。 完成后,Test工作流将被触发:

Screenshot of workflows screen

正如您也可以看到的那样,"Test"工作流程中没有出现"branch"分支。

这是因为(引用手册):

Screenshot of caveat in the manual

这个事件只会在工作流文件在默认分支上时触发工作流运行。
这意味着“测试”工作流将使用默认分支(通常为mainmaster)中的代码运行。
有一种解决方法...
每个操作都是使用一组contexts运行的。 github 上下文包含有关触发工作流的事件的信息。这包括最初触发事件的/所属的分支:github.event.workflow_run.head_branch
可以在操作中使用这个分支来检出来源分支,使用GitHub提供的actions/checkout操作即可。
要执行此操作,Yaml应该是:
---
name: Test

on:
  workflow_run:
    workflows:
      - Preflight
    types:
      - completed

jobs:
  test-job:
    name: Test Step
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{ github.event.workflow_run.head_branch }}
      - run: git branch
      - run: env

1
我对此感到困惑:在您的示例中,似乎您正在使用main,我猜这是您的默认分支。如果我想在PR上触发workflow_run,即在我的PR分支上运行"测试",该怎么办?(在我想运行测试然后部署到预览环境的情况下很有用。) - maxcountryman
1
有了位于“staging”分支上的Preflight.yml文件,Preflight工作流将使用“staging”分支代码。那么,“main”分支上的测试工作流呢?它会使用“main”分支代码吗?还是会使用“staging”分支代码? - Carlos Fagiani Jr
2
@CarlosFagianiJr 现在我明白你和maxcountryman的意思了。我已经更新了我的答案,解释了分支是如何工作的(以及如何处理它)。 - Potherca
1
@Segfault 啊,没错。欢迎来到被称为“GitHub文档”的丛林!你要找的文档在Webhook事件和负载中。 - Potherca
1
调用和被调用的工作流程需要在同一个代码库中吗? - pkaramol
显示剩余18条评论

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