【问题标题】:Limit GitHub action workflow concurrency on push and pull_request?在 push 和 pull_request 上限制 GitHub 操作工作流并发?
【发布时间】:2023-02-10 22:45:45
【问题描述】:

我想将我的工作流程的并发限制为一次运行:

on:
  pull_request:
    paths:
      - 'foo/**'
  push:
    paths:
      - 'foo/**' 

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

但是,我发现对于 pushhead_ref 是空的,而 run_id 始终是唯一的(如此处所述:https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-using-a-fallback-value

我如何创建一个在 pull_requestpush 事件中保持不变的并发密钥?

【问题讨论】:

    标签: github github-actions


    【解决方案1】:

    试试这个配置:

    concurrency:
      group: ${{ github.head_ref || github.ref_name }} 
      cancel-in-progress: true
    

    这会将组始终设置为<branch-name>。诀窍是 github.head_ref 仅在工作流由 pull_request 触发时设置,并且它包含 PR 的源分支的值。

    GitHub Repo(特别查看Actions 选项卡以查看已取消工作流程的示例)

    【讨论】:

    • 我也试过了。然而,我仍然得到重复的作业/工作流程运行。
    • @pixel 我认为你误解了concurrency 的功能。如果您在我的示例存储库中查看工作流步骤 Echo variables 的日志,您会发现 concurrency.group 对于 pushpull_request 确实是相同的。您还可以看到,第二个工作流运行取消了第一个,因为 concurrency.group 是相等的。我猜您根本不希望第一个工作流运行可见。不幸的是,到目前为止这似乎是不可能的,这很可惜:github.community/t/…
    • 实际上我陷入了另一个问题——我的build 工作是必需的,两个工作开始,然后一个被取消。然后我得到一个无法合并的分支,因为 - Required statuses must pass before merging
    • @pixel 我不确定你的问题是什么,但也许 status checks 可以帮助你。不过,我建议您再问一个问题并添加更多详细信息。
    • @pixel 当需要为相同的分支/路径触发时,我在同一工作流程中也遇到了pushpull_request 的问题。最后,我不再为 pull_request 烦恼,只尝试与 push 一起工作。似乎不可能设置一个设计良好的工作流程,因为 github 操作限制太多,但对于如此简单和常见的用途来说案例.. 不幸的是,这也适用于与 CI/CD 相关的各种其他主题.. 基本上一切都感觉像是黑客
    【解决方案2】:

    在类似情况下,我将此并发密钥用于我的工作流:

    group: ${{ github.workflow }}-${{ github.ref }}
    

    我想将其限制为在单个分支上运行单个工作流——我正在取消以前的运行。 但这允许同时在不同的分支上进行多次运行——不确定你的情况到底是什么。

    如果你想让一个工作流实例在整个存储库中运行,你可以这样做:

    group: ${{ github.workflow }}
    

    【讨论】:

    • 当涉及到工作流事件时,您的配置如何?你也有 pull_request 或 push 吗?
    • group: ${{ github.workflow }}-${{ github.ref }} 这将取消master(或main)分支上的工作流,并使项目看起来很糟糕,因为所有红色 X。我发现很难理解为什么 GitHub 不提供忽略某些(受保护的)分支的选项。与此同时,试图实现条件cancel-in-progress似乎是一项不可能完成的任务。
    【解决方案3】:

    我这样运行它,这样每个分支都可以在需要时同时运行,但每个分支一次不超过一个,并且它适用于推送和拉取请求:

    jobs:
      terraform:
        concurrency:
          group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }}
    

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2022-12-18
      • 2021-09-10
      • 2022-08-23
      • 2022-07-04
      • 2020-03-15
      相关资源
      最近更新 更多