GitHub Actions concurrency 怎么取消同分支的旧运行
来源:17golang原创
时间:2026-11-11 05:21:46 370浏览 收藏
同一分支连续推送时,如果每次提交都启动一轮完整 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 会重新解析配置。若只想限制一个耗时 job,也可以把 concurrency 放到 jobs. 下;但那只约束这个 job,不会自动取消整个工作流中的其他 job。
在 Actions 页面核对新旧运行
打开仓库的 Actions 页面,进入刚修改的工作流,再连续推送两次同一分支。查看运行列表时,不要只看最新一条绿色或红色结果,而要确认两条运行是否属于同一个并发组。
- 在左侧选择对应工作流,确认分支筛选与推送分支一致。
- 先观察较早的运行:如果它尚未结束,新运行进入同组后,旧运行应变为已取消或不再继续占用 runner。
- 打开较新的运行,确认它仍在执行测试;这条运行才是当前分支要保留的结果。
图 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 顶层。
-
314 收藏
-
459 收藏
-
264 收藏
-
285 收藏
-
140 收藏
-
319 收藏
-
479 收藏
-
147 收藏
-
174 收藏
-
223 收藏
-
181 收藏
-
327 收藏
-
439 收藏
-
299 收藏
-
415 收藏
-
289 收藏
-
193 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习