自托管Runner在Windows服务器执行npm install时总超时怎么办?
我在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的并发限制问题?或者需要配置代理?
github:xxx这种写法,或者用了 private repo 的包。你在 Windows 自托管 runner 上跑的时候,runner 服务是以系统账户运行的,默认没有配置 git 凭据,也没法弹出认证窗口,所以卡住然后超时。即使你本地能装,在服务器上还是会挂。
先确认下是不是 git 导致的:在服务器上手动切到 runner 的工作目录,用和 runner 相同的用户身份(比如 Local System 或你指定的服务账户)执行 npm install --verbose,看具体卡在哪一步。如果看到克隆 git 仓库失败,基本就是这个原因。
解决办法有几个,按安全程度推荐:
第一,用 HTTPS + Personal Access Token 替代 SSH。在 .npmrc 里加上:
如果是 GitHub Packages,也配对应的 registry 地址和 token。token 记得用最小权限,别用个人密码。
第二,如果你必须走 git 协议,那就得给 runner 配 ssh key。但注意别把私钥硬编码在系统里。建议把私钥放在 runner 机器的用户 .ssh 目录下,然后用 ssh-agent 启动 runner 服务,防止注入和泄露。
还有个细节是 Windows 上的路径权限问题,确保 runner 工作目录对服务账户可读写,不然 git clone 下来后没法操作也会崩。
至于 taobao 镜像,虽然能加速下载,但对 git 包无效,所以改了也不一定起作用。你可以继续用镜像优化性能,但先解决认证问题。
最后提醒一点,别为了省事直接用管理员账户跑 runner 并开启 interactive session,这种容易被当成跳板机攻击入口,最好隔离运行环境,限制网络出站规则,只放行必要的域名。
先确认几个基本点:
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 代理:**
4. **Runner 以服务方式运行?**
- 如果你用的是 Windows Service 启动 Runner,确保服务运行账户有网络访问权限(默认的 Local System 是没权限的)
- 推荐使用
npm账户或者配置一个专用账户运行 Runner 服务5. **npm 配置代理:**
6. **尝试使用 yarn 替代 npm:**
如果以上都试过还没解决,可以试试在 workflow 中加一个 pre-step,手动下载
package-lock.json中的 registry 地址,确认是否能正常访问。问题大概率还是出在网络代理或 Git 依赖上。