在 GitHub 操作中获取批准状态

Dan*_*ook 9 github-actions

我有一个在添加标签时触发的操作。

pull_request: types: [labeled]

仅当拉取请求获得批准(有一个或多个批准)并且另一个条件正常工作时,该作业才应该有条件地运行:

jobs:
  build:
    if: ${{ (something == 'approved') && (contains(github.event.pull_request.labels.*.name, 'Deployed for QA')) }}
Run Code Online (Sandbox Code Playgroud)

我可以使用什么属性来代替上述条件中的“某物”?

Gui*_*urd 10

您可以将 if:github.event.review.state == 'approved'与您的其他条件一起使用。

实际上,LeadingMoominExpert的这一建议是可能解决方案的一部分。

测试

我按照Dan Cookpull_request: types: [labeled]的问题建议尝试了这个实现,但它不起作用。

问题是因为当事件发生时,pull_request标记的事件没有github.event.review.state在 $G​​ITHUB_CONTEXT 上填充字段,因此该值将为null并且条件将返回false

为了使其正常工作,我必须将工作流触发on条件更改pull_request_review: types: [submitted]为而不是pull_request: types: [labeled]

但行为与预期并不完全相同。

在这种情况下,仅当有人提交评论时才会触发该事件,并且如果拉取请求状态已获得批准并且已经具有预期标签,则将执行工作流的作业。

要检查每个事件的行为,您可以尝试此实现

name: PR approved and labeled

on:
  pull_request:
    types: [labeled]
  pull_request_review:
    types: [submitted]

jobs:
  build:
    runs-on: ubuntu-latest
    if: ${{ (github.event.review.state == 'approved') && (contains(github.event.pull_request.labels.*.name, 'test')) }}
    steps:
      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJSON(github) }}
        run: echo "$GITHUB_CONTEXT"
      - run: echo ${{ github.event.review.state }}
Run Code Online (Sandbox Code Playgroud)

您将看到添加标签(在这种情况下,包含test)不会执行该作业,但提交批准此 PR 的审核以及预期的标签集将运行该作业。

结论

Dan,使用该事件还无法实现您想要实现的目标pull_request: types: [labeled]

上面的示例是一种解决方法,但可能并不完全符合您的预期。


Lea*_*ert 1

您可以if: github.event.review.state == 'approved' 结合您的其他情况使用。