在 github-actions 中推送新提交(更新当前)时如何取消 PR 中的先前运行

Max*_*Max 5 git yaml github github-actions

当我将提交推送到 PR 时,我的测试会为此提交触发。之后,如果我向这个 PR 推送额外的提交,Github Actions 中的测试会在两个提交上运行。

我需要取消之前的运行并仅在最近的推送提交上运行它们。

如何配置我的 yaml 文件来实现这一目标?

Dav*_*uel 146

要在触发新工作流程时从同一 PR、分支或标签取消当前正在运行的工作流程,您可以使用:

name: Workflow X

on: # ...

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs: # ...
Run Code Online (Sandbox Code Playgroud)

解释:

  • ${{ github.workflow }}:工作流名称用于生成并发组(例如Workflow 1)。这允许您在同一事件(例如 PR)上触发多个不同的工作流程(例如workflow1.yaml和)。workflow2.yaml否则,workflow1.yaml将取消workflow2.yaml,反之亦然。
  • ${{ github.event.pull_request.number:当触发事件为PR时,会使用PR号生成并发组(例如workflow1-33)。
  • || github.ref }}:当触发器不是 PR 而是推送时,会使用分支或标签名来生成并发组(例如workflow1-branch1)。
  • cancel-in-progress: true:如果cancel-in-progress被省略或设置为false,当触发新的工作流程时,当前正在运行的工作流程不会被取消,并且新的工作流程将排队等待,直到前一个工作流程完成。

参考: https: //docs.github.com/en/actions/using-jobs/using-concurrency

  • 我还会考虑将 `${{ github.ref }}` 更改为 `${{ github.ref || github.run_id }}` 如有关并发的 GitHub 文档中所述。这允许可能没有引用的任意事件(例如“workflow_dispatch”)在自己的组中运行工作流。因此,总结我的两条评论:`group: ${{ github.workflow }}-${{ github.ref || github.run_id }}` (6认同)
  • 这是一个很好的解释,特别是因为当需要考虑不同的工作流程时,添加 `${{ github.workflow}}` 非常重要。由于用于拉取请求的“github.ref”是“refs/pull/<pr_number>/merge”,因此它也足够独特。似乎一个稍微简单的组也同样有效: `group: ${{ github.workflow }}-${{ github.ref }}` 因此我很好奇为什么特定逻辑需要处理 `event. pull_request.number` 在你的答案中。 (2认同)

Emm*_*ess 11

您可以使用并发

并发确保一次只运行一个使用相同并发组的作业或工作流。

concurrency: 
  group: ${{ github.head_ref }}
  cancel-in-progress: true
Run Code Online (Sandbox Code Playgroud)

  • @naspinski工作示例https://github.com/TeamAmaze/AmazeFileManager/blob/release/3.7/.github/workflows/android-feature.yml (9认同)
  • @Max 这应该是公认的答案 (3认同)
  • 这是什么水平?每个示例都只是单独显示它......而不是在完整的文件或示例中。谢谢。 (3认同)
  • @CsabaToth `github.ref` 请参阅[此处](https://docs.github.com/es/actions/learn-github-actions/contexts#github-context)。`head_ref` “仅当触发工作流运行的事件是 pull_request 或 pull_request_target 时才可用。” 但“ref”只是“触发工作流程运行的分支或标签引用”。 (3认同)

Phi*_*lip 10

您还需要确保在同一存储库中拥有多个工作流程,以便仅取消同一工作流程的正在进行的运行。

使用并发GitHub 文档的片段:

concurrency: 
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
Run Code Online (Sandbox Code Playgroud)

完整的工作示例(来源):

name: CI with in-progress cancellations

on:
  pull_request:
    branches: [ main ]
  workflow_dispatch:

# This is what will cancel the workflow
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Print concurrency group
        run: echo '${{ github.workflow }}-${{ github.ref }}'
      - name: Sleep 15s
        run: sleep 15s
Run Code Online (Sandbox Code Playgroud)