concurrency 并发控制是什么
用 concurrency 给运行分组:同组内限制并发,可配置新运行取消进行中的旧运行;部署场景建议保留串行而非自动取消。同一分组内未取消的运行按序等待,分组键常用分支或工作流加环境的组合,防止不同环境互相取消。取消只作用于同组运行,不会影响其他分组。
基本信息
| group | 分组键,常用分支或工作流名 |
|---|---|
| cancel-in-progress | 新运行取消同组进行中的运行 |
| 部署建议 | 不自动取消,避免半完成状态 |
| 行为 | 同组未取消的运行按序等待 |
| 取消语义 | 被取消的运行标记为取消并停止后续步骤 |
| 组合键 | 可拼接仓库名与工作流名避免跨工作流冲突 |
两种策略
| 策略 | 配置 | 适用场景 |
|---|---|---|
| 去重取消 | 开启取消进行中 | 测试与检查类任务 |
| 排队串行 | 不自动取消 | 部署与发布任务 |
| 按键隔离 | 分组键加环境名 | 多环境互不干扰 |
| 跨工作流 | 分组键加仓库或工作流前缀 | 避免其他工作流互相影响 |
按分支去重与部署排队
按分支去重与部署排队
# 按分支去重:检查类任务
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
# 部署:按环境排队,不取消
concurrency:
group: deploy-${{ inputs.environment }}典型使用场景
- 频繁推送去重:同一分支只保留最新一次检查运行
- 部署串行:同一环境同一时间只跑一个发布
- 多环境隔离:分组键包含环境名,避免互相取消
- 资源保护:限制共享资源上并发运行的作业数
- 成本控制:取消过期运行,减少排队与用量
- 手动触发排队:同一分支重复触发时只保留有效运行
- 故障隔离:异常运行卡住时,同组后续运行按序等待不互相覆盖
部署并发开启自动取消有风险:被取消的发布需要人工确认与清理。
分组键粒度要按场景选择:过粗互相取消、过细则失去限制意义。
分组键按字符串比较:拼写不一致的运行不会互相约束,先在测试仓库验证语义。