如何强制停止某个 GitHub Actions?
背景
有时候 GitHub Actions 的任务会一直卡住,比如部署任务没有退出、runner 异常、docker 子进程没结束,或者 self-hosted runner 本身已经失去响应。这种情况下,普通的取消操作可能不生效,就需要用强制停止的方式来处理。
解决
方法一:在 GitHub 网页上取消
这是最直接的方式。
- 打开对应仓库的 Actions 页面
- 进入正在运行的 workflow
- 点击右上角的
Cancel workflow或Cancel jobs - 如果普通取消没有效果,再点击
Force cancel workflow
Force cancel workflow 会尝试直接终止当前运行的任务,适合 workflow 已经卡住的情况。
方法二:使用 GitHub CLI 取消
如果你本地已经安装了 GitHub CLI,用命令行处理会更快。
先查看当前运行中的任务:
gh run list
输出通常类似这样:
STATUS TITLE WORKFLOW BRANCH
running deploy CI main
普通取消:
gh run cancel <run-id>
例如:
gh run cancel 26392735720
如果普通取消失败,可以强制取消:
gh run cancel 26392735720 --force
方法三:通过 API 强制取消
GitHub Actions 提供了强制取消 workflow run 的 REST API。
接口格式如下:
POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel
例如这个页面地址:
https://github.com/openHacking/PyDeskUI/actions/runs/26392735720/job/77686565248
其中:
OWNER是openHackingREPO是PyDeskUIRUN_ID是26392735720- 后面的
77686565248是job id,不是run id
所以对应的 API 地址就是:
https://api.github.com/repos/openHacking/PyDeskUI/actions/runs/26392735720/force-cancel
完整示例:
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <TOKEN>" \
https://api.github.com/repos/openHacking/PyDeskUI/actions/runs/26392735720/force-cancel
如果你已经登录了 GitHub CLI,通常直接执行下面这条更方便:
gh run cancel 26392735720 --force
方法四:处理 self-hosted runner 卡死
如果仓库使用的是 self-hosted runner,有时问题不是 workflow 本身,而是 runner 进程已经卡住了。这时候即使网页上点了 Force cancel workflow,任务也可能还是停不下来。
可以直接在 runner 所在机器上处理进程。
先查找相关进程:
ps aux | grep Runner
或者:
ps aux | grep actions
找到进程后强制结束:
kill -9 <pid>
如果你的 runner 是跑在 Docker 里的,也可以直接杀掉容器:
docker ps
docker kill <container-id>
补充
如果某类 workflow 经常出现重复排队、旧任务占住 runner 的情况,可以在 workflow 配置里加上并发控制,让新任务自动取消旧任务:
concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: true
这样同一分支的新部署开始时,旧的部署会自动被取消,能减少卡住后手动清理的次数。

评论