当前位置:首页 > 文章列表 > 文章 > 软件教程 > GitHub Actions concurrency 怎么取消同分支的旧运行

GitHub Actions concurrency 怎么取消同分支的旧运行

来源:17golang原创 2026-11-11 05:21:46 0浏览 收藏

同一分支连续推送时,如果每次提交都启动一轮完整 CI,旧运行往往已经失去价值。GitHub Actions 可以用 concurrency 建立并发组,再把 cancel-in-progress 设为 true,让同组的新运行接替旧运行。关键是把工作流名和分支引用放进组名,避免两个不同工作流互相取消。

官方地址:https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency

最稳妥的默认写法是 group: ${{ github.workflow }}-${{ github.ref }} 配合 cancel-in-progress: true。这样同一工作流、同一分支的新运行会取消旧运行,而不同工作流不会因为恰好使用同一分支而互相影响。

先把并发组命名想清楚

并发控制不是“全仓库只留一个运行”。GitHub Actions 会按照 group 判断哪些任务属于同一组;组名相同,运行才会互相等待或取消。只写固定字符串虽然简单,却可能把测试、构建和部署等不同工作流放进同一条取消链。

这个场景适合用两个稳定变量拼接组名:

  • github.workflow 区分工作流;
  • github.ref 区分分支或标签引用。

准备文件时先打开仓库的 .github/workflows/,找到需要“新提交覆盖旧提交”的工作流。不要把并发组放到无关的第三方 action 参数里,它属于 workflow 或 job 的 YAML 配置。

把 concurrency 放在 workflow 级别

在工作流触发条件之后加入 concurrency。下面的配置会让同一个工作流在同一分支上保持一条最新运行;代码块中的注释说明了每个关键字段的作用。

name: test

on:
  push:
    branches: [main, develop]

# workflow 级并发:同一工作流、同一引用归入同一组
concurrency:
  # 加上 workflow 名,避免不同工作流互相取消
  group: ${{ github.workflow }}-${{ github.ref }}
  # 新运行进入同组后,取消仍在运行的旧任务
  cancel-in-progress: true

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 运行测试
        run: go test ./... # 这里替换成仓库自己的测试命令

选择入口后,编辑器中的关键位置应该是工作流顶层,而不是 jobs.test.steps 下的某个步骤。图 1 是原创界面说明图,展示了 group、分支引用和取消开关的对应关系,不是 GitHub 页面截图。

GitHub Actions 并发配置界面说明图,展示工作流名、分支引用和取消旧运行开关
图1:并发配置操作示意图,展示 workflow 级 concurrency 的关键字段。

保存工作流文件后,GitHub 会重新解析配置。若只想限制一个耗时 job,也可以把 concurrency 放到 jobs. 下;但那只约束这个 job,不会自动取消整个工作流中的其他 job。

在 Actions 页面核对新旧运行

打开仓库的 Actions 页面,进入刚修改的工作流,再连续推送两次同一分支。查看运行列表时,不要只看最新一条绿色或红色结果,而要确认两条运行是否属于同一个并发组。

  1. 在左侧选择对应工作流,确认分支筛选与推送分支一致。
  2. 先观察较早的运行:如果它尚未结束,新运行进入同组后,旧运行应变为已取消或不再继续占用 runner。
  3. 打开较新的运行,确认它仍在执行测试;这条运行才是当前分支要保留的结果。

图 2 用原创界面说明图表达“新运行:运行中、旧运行:已取消”的关系。它只帮助理解页面状态,不是实际运行记录或线上证据。

GitHub Actions 工作流运行列表说明图,展示新运行和旧运行的取消状态
图2:运行结果示意图,展示新运行接替旧运行后的状态差异。

给发布分支保留例外

测试分支通常适合“新提交覆盖旧提交”,但发布分支未必适合无条件取消。可以让并发组仍然按工作流和引用区分,同时把取消规则改成表达式:

# 发布分支保留当前运行,其它分支允许新运行取消旧运行
concurrency:
  # 同一工作流和引用仍然使用独立并发组
  group: ${{ github.workflow }}-${{ github.ref }}
  # release/ 开头的引用不取消进行中的运行
  cancel-in-progress: ${{ !startsWith(github.ref, 'refs/heads/release/') }}

如果工作流同时响应拉取请求和 push,某些事件并不提供相同的引用字段。此时要为可能为空的上下文准备回退值,并把组名设计成不会与其他工作流重叠的形式。GitHub 文档还说明,并发组名称不区分大小写,因此不要只靠大小写区分两个组。

常见误区和快速核对

现象优先检查
不同工作流互相取消group 是否缺少 github.workflow
旧运行仍继续cancel-in-progress 是否为 true 或满足条件的表达式
同一分支没有形成替换两次运行的 github.ref 是否一致、配置是否在目标 workflow 中
发布任务被误取消是否应对 release 引用设置条件例外

把并发控制当成“同一工作流、同一引用只保留最新意图”的配置即可。先用固定的 workflow 加分支组名解决测试浪费,再根据发布流程增加条件取消;这样既能减少重复 CI,也不会把生产动作交给一个过宽的取消规则。

相关问答

只写 cancel-in-progress 不写 group 可以吗?

不建议。取消规则需要依附并发组才能判断哪些运行属于同一组;先定义稳定的 group,再决定是否取消进行中的旧运行。

workflow 级和 job 级 concurrency 有什么区别?

workflow 级影响整轮工作流,job 级只影响指定 job。若目标是新提交替换整轮 CI,优先把配置放在 workflow 顶层。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
7-Zip 怎么把压缩包中的单个文件直接输出到管道7-Zip 怎么把压缩包中的单个文件直接输出到管道
上一篇
7-Zip 怎么把压缩包中的单个文件直接输出到管道
GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
下一篇
GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    976次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    982次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    1098次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    1068次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    906次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码