仅在合并PR时触发Github Actions。

91

我有一个 Github Actions 的 YAML 文件如下:

name: Test deployment
on:
  pull_request:
    branches:
    - master

jobs:
  deploy:
    runs-on: ubuntu-18.04
    steps:
    - name: Random name
      run: date

当我将一个分支的 PR 提交到 master 分支时,会触发 Github Action。因此,我更新了我的 YAML:

name: Test deployment
on:
  pull_request:
    types:
    - closed
    branches:
    - master

现在它在我合并PR时触发,而不是在创建PR时触发。但是它也会在我关闭PR而没有合并它时触发。

我在文档中没有找到类似于“merged”类型的内容。

即使是我尝试的以下语法也不能按预期工作:

jobs:
  ...
    if: github.event_name == 'pull_request' && github.event.action == 'closed'

有人能帮我吗? 我能否检查至少有一位审阅者批准了PR?(我可以启用分支保护,但想知道是否存在在GitHub Actions中执行此操作的选项)

Translated:

请问有没有人能帮助我呢?我想知道是否可能检查至少有一位审阅者已经批准了我的 PR。我知道可以启用分支保护,但我想知道是否有 GitHub Actions 中的选项可以实现这个功能。


1
你是如何检查至少有一个PR被批准后再合并的? - Vipin Sharma
7个回答

146

没有“pull-request-merged”事件。

你可以订阅“push”事件,因为合并的PR将始终创建一个推送事件到它被合并到的分支。如果你只关心对master的PR,请指定该分支:

on:
  push:
    branches:
      - master

您可以做的另一件事是在每个步骤上单独筛选

      - name: Do something
        if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true
        run: ...

(2022年修订) 根据GitHub文档,现在可以通过以下方式实现:

on:
  pull_request:
    types:
      - closed

jobs:
  if_merged:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
    - run: |
        echo The PR was merged


20
如果 github.event.pull_request.merged 为真,那应该已经足够了。 - Portekoi
这对我没有帮助,我的工作被跳过了。我想在 PR 合并后将我的 develop 分支部署到 Heroku 上。似乎什么都不起作用。 - undefined

40

虽然在拉取请求中没有特定的 merged 类型,但是在API响应上有一个merged标志。这使您只能在合并时运行操作,而不是所有推送到目标分支。

假设我们想在任何对main分支的合并上运行操作,可以使用以下方法:

on:
  pull_request:
    branches: 
      - main
    types: [closed]

jobs:
  my-action:
    if: ${{ github.event.pull_request.merged }}
    runs-on: ...


2
截至今天的文档确认了这里,参见:https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#running-your-workflow-when-a-pull-request-merges - davidmpaz
如果我想让这个工作流程使用 workflow_dispatch,该怎么处理 if - kelin
我需要在每个作业操作中加入这个if语句吗? 示例: jobs: my-action: if: ${{ github.event.pull_request.merged }} runs-on: ... next-action: if: ${{ github.event.pull_request.merged }} runs-on: ... last-action: if: ${{ github.event.pull_request.merged }} runs-on: ... - Pavlo Chechehov

9

1
我不明白为什么楼主选择了这个答案作为采纳的答案。 - undefined
同意,@michael的回答似乎更合适,更符合工作流程。然而,楼主提到_(我可以启用分支保护,但想知道是否有任何选项可以在github actions中执行)_。虽然“action”经常与“workflow”互换使用,但它们并不完全相同(由下拉菜单标题为Actions而不是Workflows更加混淆),楼主可能本意是指一个单独的操作。另外,由于分支保护被禁用,可能缺少楼主不希望工作流在没有PR合并的情况下运行的标准。 - undefined
在我的回答中,我专注于问题中提到的这个要求。
请问有人可以帮帮我吗?我能否检查至少有一个审阅者是否批准了PR?
在我的回复中,我提供了代码链接,其中 review.state === "approved" 可以让你至少检查PR是否被批准。
- undefined

3

这个程序在PR分支上运行还是在PR目标分支上运行? - Joel Harkes
这在分支上运行自PR,而不是合并后的目标分支。 - atineoSE

1
因此,我刚尝试了提出的解决方案,从输出结果来看,我发现了一些奇怪的东西:工作流程被触发,但我看到它运行在正在合并的分支上,而不是被合并的分支上(在我的情况下是main)。 这有点令人不安,因为我的工作流程正在构建和推送Docker镜像。如果在主分支上有更改,而这些更改在被合并的分支上没有,那么被推送的镜像可能不完全是我期望的吗? 我的工作流程运行在这里:https://github.com/Axual/ksml/actions - 你可以看到一个工作流程在main上运行(由push触发),另一个在一个分支上运行。 是否有一种方法可以在PR合并后运行一个工作流程,或者类似这样的方式?

0

一旦合并了PR请求,将提交一个带有消息“Merge pull request <your PR, etc>”的提交。然后,您可以将其与作业的if语句一起使用。

name: build-on-merge

on:
  push:
    branches: ["master"]
jobs:
  build-on-merge:
    if: startsWith(github.event.head_commit.message, 'Merge pull request')
  runs-on: ubuntu-latest
  steps:

2
抱歉,不想太苛刻,但如果你认为基于提交字符串消息的测试是最佳解决方案,那么这是一个可怕且容易出错的解决方案! - Sun
1
此外,在合并时,消息文本是可编辑的,因此合并用户可以将消息设置为任何值。 - Michaelvsk

-1

这将在有人批准PR时运行,而不是像OP所要求的那样在合并时运行。 - Matt Calhoun

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