登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

Actions concurrency 怎样取消旧工作流

来源:17golang原创

时间:2026-10-25 11:51:29 465浏览 收藏

要让 GitHub Actions 在同一分支再次提交时取消旧工作流,需要在工作流顶层设置 concurrency,为同类运行生成相同的 group,并开启 cancel-in-progress: true。只写并发组通常只会限制同时运行数量,不能等同于取消正在执行的旧运行。

官方地址:https://github.com/

旧运行为什么没有被取消

常见现象是连续推送后,旧构建仍在执行,新构建显示 Pending。先分清“已经运行”和“等待运行”:默认并发策略会替换同组已有的待运行项;要请求取消正在运行的项,还需要取消选项。已经完成的历史运行不会因此删除。

本文面向 GitHub.com 的普通测试或预览构建,以虚构仓库 demo-team/preview-demo 说明操作。所有配图均为原创界面示意,代码是配置片段,没有实际执行或修改仓库。涉及不可中断的生产发布时,应先评估部署恢复过程,再决定取消策略。

1. 修改工作流并提交取消选项

进入仓库 Code → .github → workflows,打开实际运行的 YAML 文件,点击文件右上角铅笔图标。把下列内容加入顶层,与 jobs 同级。不要放在 steps 里,也不要在已有顶层 concurrency 之外重复添加第二份。

# 添加到工作流顶层,与 jobs 同级;保留现有触发器和任务
concurrency:
  # 固定业务前缀,并按工作流名称与分支或标签引用划分组
  group: preview-build-${{ github.workflow }}-${{ github.ref }}
  # 同组新运行到来时,请求取消仍在运行的旧任务
  cancel-in-progress: true

保留原来的 on 与 jobs 内容。这里的 preview-build 是业务前缀,github.workflow 区分不同工作流,github.ref 区分触发引用。需要相互取消的两次运行必须计算出同一个组名;若把 github.run_id 拼入组名,每次运行都会分到不同组。

编辑后点击 Preview 检查改动范围,再点击 Commit changes...,填写简短说明并选择提交分支。默认分支建议通过新分支和拉取请求合入;只有配置实际进入用于触发的版本后,后续运行才会使用它。最后点击 Commit changes 或 Propose changes,依仓库流程完成提交或合并。

原创操作示意:工作流文件的Commit changes对话框与提交分支选项
图1:操作示意图,确认修改被提交到预期分支;不是实际账号截图。

这一步的完成标志是文件页显示新提交,并能看到顶层 concurrency 及 true 值。仅在编辑框内改完、关闭页面,配置不会生效。受保护分支应按仓库要求走合入流程。

2. 在 Actions 确认旧运行进入取消状态

选择允许重复触发、可以安全中断的测试工作流。在配置生效后,对同一个分支先后触发两次运行,确保第二次到来时第一次仍未结束。进入 Actions → 左侧对应工作流,打开运行列表,比较两次运行的分支、事件和提交。

原创结果示意:同一测试分支旧运行Cancelled,新运行In progress
图2:结果示意图,旧运行取消、新运行继续的预期状态;图中编号为虚构示例。

完成标志是旧运行最终显示 Cancelled,新运行继续排队或执行。取消请求到状态更新需要时间,不能要求新提交一出现旧进程就瞬间消失。如果第一次已完成,这次观察不能证明取消选项是否起作用,应使用仍在执行的测试运行进行观察。

不要把“编号较小”当成唯一依据,要确认它确实属于同一工作流与同一引用。push 与 pull_request 事件的 github.ref 可能不同,因此同一开发分支对应的两种事件不一定进入同一个组。

不生效时检查分组与权限

表现优先检查调整方式
旧运行继续,新运行等待是否缺少 cancel-in-progress 或值为 false在正确层级开启 true
两次运行都执行组名是否每次变化移除 run_id 等唯一值,核对事件引用
其他工作流被取消是否共用了同一个固定组在组名中加入工作流名称或业务标识
修改后没有任何变化文件是否已提交、配置是否在触发版本中确认提交与合入状态,再观察新运行

取消整个运行就使用顶层 concurrency;如果写在 jobs 下某个任务中,作用范围是该任务。组名不区分大小写,因此只把大小写改掉不能隔离两个组。

手动取消需要仓库写入权限。若旧运行本身使用的是旧配置、需要先清理一次,可进入 Actions → 对应工作流 → 处于 queued 或 in progress 的运行,在右上角点击 Cancel workflow。等它显示取消状态再继续。这个操作用于当次运行,不会替代持久的 concurrency 配置。

需要回退时保留排队能力

只想排队,不想中断怎么办?保留组名,把 cancel-in-progress 改为 false 并提交。默认策略仍可能替换待运行项,不能把它理解成保存每一次等待运行。

设置会取消其他仓库的运行吗?本文讨论的是同一仓库内的并发组。先核对本仓库中的工作流是否共用组名,避免把全局资源竞争与这里的运行分组混为一谈。

取消后会自动撤销部署吗?不要依赖这种假设。工作流取消不等于外部系统事务回滚。对于已经触发的外部发布,应按部署系统的恢复机制处理。

如果改动造成意外中断,按团队流程回退本次提交或将取消选项设为 false,再提交生效。保留工作流与分支两层分组,可以继续限制重复构建,同时减少不同任务互相影响。

并发配置文档:https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency

文件编辑文档:https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files

手动取消文档:https://docs.github.com/en/actions/how-tos/manage-workflow-runs/cancel-a-workflow-run

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>