如何强制停止某个 GitHub Actions?

背景

有时候 GitHub Actions 的任务会一直卡住,比如部署任务没有退出、runner 异常、docker 子进程没结束,或者 self-hosted runner 本身已经失去响应。这种情况下,普通的取消操作可能不生效,就需要用强制停止的方式来处理。

解决

方法一:在 GitHub 网页上取消

这是最直接的方式。

  1. 打开对应仓库的 Actions 页面
  2. 进入正在运行的 workflow
  3. 点击右上角的 Cancel workflowCancel jobs
  4. 如果普通取消没有效果,再点击 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

其中:

  • OWNERopenHacking
  • REPOPyDeskUI
  • RUN_ID26392735720
  • 后面的 77686565248job 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

这样同一分支的新部署开始时,旧的部署会自动被取消,能减少卡住后手动清理的次数。

参考

评论