如何基于整个GitHub Actions工作流的成功或失败来设置GitHub分支保护规则?

3
我想根据 Github Actions 工作流的成功或失败来设置 Github 分支保护规则。
你可以在这里看到工作流程:

https://github.com/apostrophecms/apostrophe/blob/main/.github/workflows/main.yml

工作流已通过,我甚至有了一个可用的徽章,但我无法设置分支保护规则,要求它作为状态检查项通过。

我可以根据矩阵中任何一个单独的构建设置分支保护规则,但我不想单独设置所有构建并跟踪我的矩阵规则更改。

正如您从截图中看到的,我无法选择“build”,即作业名称(尽管我可以选择任何子构建),我也无法选择“tests”,即整个工作流的名称(如果我使用大写字母t,它也不会改变)。

我错过了什么?感谢您的帮助!

第一张截图:我可以选择子构建,但不能选择整个构建任务。

I can pick a sub-build but not the entire build job

第二张截图:我完全无法选择整个“Tests”工作流的名称。

I can't pick the name of the overall "Tests" workflow at all

3个回答

6

有一个技巧可以在工作流程中添加一步,将矩阵中的所有作业收集到一个检查中:

  tests:
    runs-on: ubuntu-latest
    needs: build
    if: always()
    steps:
      - name: All tests ok
        if: ${{ !(contains(needs.*.result, 'failure')) }}
        run: exit 0
      - name: Some tests failed
        if: ${{ contains(needs.*.result, 'failure') }}
        run: exit 1

if: always()是必须的,用于收集失败的任务,否则PR将永远无法获得适当的状态检查。此外,如果您使用付费计划,则这是您需要支付的额外步骤。


如果构建任务被取消,这个方法还能起作用吗?或者是在构建中的单个任务呢? - Max

1
在这种情况下,您需要处理一个带有矩阵的单个作业。这意味着您将得到9种可能性(3个节点选项×3个MongoDB选项)。每个都被视为单独的状态检查,并且可以单独启用或禁用其强制性。这样,您就可以添加新选项,而无需立即使它们成为强制性选项。
如果您想要每个作业都通过,那么您需要选择这九个作业并将它们标记为必需。

所以,仅仅通过“一切都正常”来进行状态检查是不可能的吗? - Tom Boutell
我不知道有什么方法可以要求每个状态检查都通过。 - bk2204
好的,谢谢你,满分,这不是你的错,只是不是我想听到的答案 (: - Tom Boutell
@bk2204,能否添加另一个依赖于矩阵作业的作业,并检查它?这将是一个虚拟作业,实际上不会做任何事情,但它将标记具有矩阵的作业已成功完成。 - Giora Guttsait
我不知道,说实话。你可以试试看。 - bk2204

0
@stachel的解决方案在矩阵为空时无效。在这种情况下,GitHub遗憾地返回result: failure。当您动态生成测试用例时,可能会出现空矩阵,但没有匹配的情况。
为了解决这个问题,您需要添加一个额外的输出来区分“失败因为没有作业”和“矩阵作业失败”。
如果您有一个test矩阵,请在其上添加一个自定义的did_run输出:
例如:
test:
    runs-on: "ubuntu-latest"
    needs:
      - detect-packages
    outputs:
      did_run: ${{ steps.did_run.outputs.did_run }}
    strategy:
      fail-fast: false
      matrix:
        packages: ${{ fromJson(needs.detect-packages.outputs.packages) }}
    steps:
      - name: Setting Did Run flag to true
        id: did_run
        if: always()
        run: echo "did_run=true" >> $GITHUB_OUTPUT

关键是将did_run添加到outputs部分,并设置相应的步骤来设置输出。
然后,最后,您可以使用jq解析needs.test输出来生成汇总结果。
test-rollup:
    runs-on: "ubuntu-latest"
    needs: test
    if: always()
    steps:
      - name: Ensure tests succeeded
        run: echo '${{ toJson(needs.test) }}' | jq '.result == "success" or (.result == "failure" and .outputs.did_run == null)'

调试输出

由于反复运行 GitHub Actions 来查看返回的输出并不有趣,因此以下是在以下情况下needs.test的输出

矩阵有测试,所有测试都成功运行

{
    "result": "success",
    "outputs": {
        "did_run": "true"
    }
}

矩阵有测试,但至少有一个测试失败。
{
    "result": "failure",
    "outputs": {
        "did_run": "true"
    }
}

Matrix没有任何测试

{
    "result": "failure",
    "outputs": {}
}

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