如何强制终止卡住且无法取消的GitHub Actions工作流?
强制终止卡住的GitHub Actions工作流的解决方案
问题根源分析
将concurrency配置从根工作流移至子工作流(workflow_call)后,易出现并发锁未正确释放的异常:系统误判工作流已完成,但实际锁仍被占用,导致后续工作流排队阻塞;部分卡住的工作流因平台状态同步延迟,常规取消命令无法生效。
解决方法
1. 清理并发锁(针对concurrency导致的排队阻塞)
若确认是并发组锁占用导致后续工作流无法运行,直接删除对应并发组的锁:
- 先查询当前仓库中处于排队/运行状态的工作流及其并发组:
gh api repos/{owner}/{repo}/actions/runs --filter ".workflow_runs[] | select(.status == \"queued\" or .status == \"in_progress\") | .name, .id, .concurrency_group" - 替换
{owner}、{repo}为实际值,找到卡住的并发组名称后,执行删除命令:gh api --method DELETE repos/{owner}/{repo}/actions/concurrency-groups/{group-name}
2. 强制更新工作流状态(针对系统误判为“已完成”的卡住实例)
对于提示gh: Cannot cancel a workflow run that is completed. (HTTP 409)但实际卡住的工作流,强制将其状态标记为失败:
- 获取目标工作流的
run-id(在Actions页面的run详情URL中提取数字) - 执行状态更新命令:
gh api --method PATCH repos/{owner}/{repo}/actions/runs/{run-id} -f status="completed" -f conclusion="failure" - 若上述命令无效,重复执行取消命令(部分情况是状态同步延迟导致的误判):
gh api --method POST repos/{owner}/{repo}/actions/runs/{run-id}/cancel
3. 极端情况:请求GitHub官方支持
如果所有命令都无法解决问题,说明是平台内部状态不一致导致的异常,需提交支持工单:
- 进入仓库的
Settings->Support->Contact GitHub Support - 提供以下信息:卡住的工作流run ID、
concurrency配置代码片段、已尝试的操作记录,请求手动清理锁或重置工作流状态
后续配置建议
- 避免在子工作流单独配置
concurrency,建议在根工作流统一配置,确保锁的释放逻辑一致 - 若需在子工作流使用并发控制,确保根、子工作流的
concurrency.group名称匹配,例如使用动态变量:concurrency: group: ${{ github.head_ref || github.run_id }} cancel-in-progress: true
内容的提问来源于stack exchange,提问作者Dimitri Kopriwa
相关产品推荐
相关产品推荐

