自托管Runner在Windows服务器执行npm install时总超时怎么办?

司徒子聪 阅读 51

我在Windows服务器上配置了自托管Runner,但每次执行npm install都会超时,试过调整timeout-minutes到60也没用,卡在下载依赖包阶段。查看日志显示错误是Process completed with exit code 128.,但本地执行没问题,服务器网络应该也没问题,这是什么原因?

我的workflow配置是这样的:

jobs:
  build:
    runs-on: self-hosted
    steps:
      - name: Install dependencies
        run: npm install
        timeout-minutes: 60

服务器防火墙已经放行了github相关的端口,还尝试过手动设置npm registry为taobao镜像,但依然没解决。难道是自托管Runner的并发限制问题?或者需要配置代理?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
上官世杰
这问题我之前踩过坑,exit code 128 多半不是网络问题,而是 git 相关的操作失败导致的,尤其是 npm install 时某些包是从 git 仓库拉的,比如依赖里有 github:xxx 这种写法,或者用了 private repo 的包。

你在 Windows 自托管 runner 上跑的时候,runner 服务是以系统账户运行的,默认没有配置 git 凭据,也没法弹出认证窗口,所以卡住然后超时。即使你本地能装,在服务器上还是会挂。

先确认下是不是 git 导致的:在服务器上手动切到 runner 的工作目录,用和 runner 相同的用户身份(比如 Local System 或你指定的服务账户)执行 npm install --verbose,看具体卡在哪一步。如果看到克隆 git 仓库失败,基本就是这个原因。

解决办法有几个,按安全程度推荐:

第一,用 HTTPS + Personal Access Token 替代 SSH。在 .npmrc 里加上:

_auth = your_base64_token
//registry.npmjs.org/:_authToken=your_npm_token


如果是 GitHub Packages,也配对应的 registry 地址和 token。token 记得用最小权限,别用个人密码。

第二,如果你必须走 git 协议,那就得给 runner 配 ssh key。但注意别把私钥硬编码在系统里。建议把私钥放在 runner 机器的用户 .ssh 目录下,然后用 ssh-agent 启动 runner 服务,防止注入和泄露。

还有个细节是 Windows 上的路径权限问题,确保 runner 工作目录对服务账户可读写,不然 git clone 下来后没法操作也会崩。

至于 taobao 镜像,虽然能加速下载,但对 git 包无效,所以改了也不一定起作用。你可以继续用镜像优化性能,但先解决认证问题。

最后提醒一点,别为了省事直接用管理员账户跑 runner 并开启 interactive session,这种容易被当成跳板机攻击入口,最好隔离运行环境,限制网络出站规则,只放行必要的域名。
点赞 3
2026-02-09 21:00
设计师淑萍
exit code 128 通常是 Git 被中断导致的,不是 npm 的问题。你卡在下载依赖包阶段,说明网络层面没有完全通顺。

先确认几个基本点:

1. **Git 是否正常?**
- 在服务器上手动执行 git clone https://registry.npmjs.org/某个包,看是否能下载完整
- 如果失败,说明 Git 的访问被拦截或 DNS 有干扰

2. **npm 包含 Git 依赖了吗?**
- 如果 package.json 中有类似 git+https://github.com/xxx 的依赖,npm install 会调用 Git,这时候即使设置了 registry 也没用

3. **设置 Git 代理:**
git config --global http.proxy http://your-proxy:port
git config --global https.proxy http://your-proxy:port


4. **Runner 以服务方式运行?**
- 如果你用的是 Windows Service 启动 Runner,确保服务运行账户有网络访问权限(默认的 Local System 是没权限的)
- 推荐使用 npm 账户或者配置一个专用账户运行 Runner 服务

5. **npm 配置代理:**
npm config set proxy http://your-proxy:port
npm config set https-proxy http://your-proxy:port


6. **尝试使用 yarn 替代 npm:**
yarn config set registry https://registry.npmmirror.com
yarn install


如果以上都试过还没解决,可以试试在 workflow 中加一个 pre-step,手动下载 package-lock.json 中的 registry 地址,确认是否能正常访问。问题大概率还是出在网络代理或 Git 依赖上。
点赞 7
2026-02-04 11:00