最近在给项目配 CI/CD 流水线,用的是 GitHub Actions 加自建 Runner。流水线逻辑很简单:拉代码 → 装依赖 → 跑测试 → 构建镜像。但部署到自建 Runner 后,npm install 和 pip install 阶段频繁超时,偶尔能跑通,大部分时候卡在下载依赖那一步。
一开始以为是 Runner 机器配置不够,加了内存和 CPU 之后问题依旧。后来抓包才发现,问题出在网络出口上。
流水线日志里反复出现这类报错:
npm ERR! code ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org/xxx failed或者:
ReadTimeoutError: HTTPSConnectionPool(host='pypi.org', port=443): Read timed out.手动在 Runner 机器上跑 npm install 也一样慢。但用浏览器访问 npmjs.com 却正常。
先确认基本连通性:
ping -c 20 registry.npmjs.org延迟 180ms 左右,有轻微丢包,但不至于断连。
用 curl 测试实际下载速度:
curl -o /dev/null -w "%{speed_download} bytes/s\n" https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz速度只有 30K 左右,稳定地慢。
接着查 Runner 机器的出口 IP 归属:
curl -s https://ipinfo.io/json | jq '.org, .asn'结果显示是某云服务商的数据中心网段。
npm、PyPI、Maven Central 这些包仓库,对数据中心 IP 普遍有速率限制。原因是机房 IP 常被用于大规模爬取和自动化滥用,仓库为了保障正常开发者的下载体验,会对机房 IP 做 QoS 降级。表现就是:能连上,但下载速度被压得很低,且频繁超时。
这也解释了为什么浏览器访问正常——网页流量小,不容易触发限速,而 CI/CD 流水线一次性拉取几百个依赖包,持续大流量传输,直接撞上限速策略。
既然瓶颈在出口 IP,解决方案就是换一个住宅 IP 出口。住宅 IP 的 ASN 归属于当地运营商,在包仓库的访问策略中不会被限速。
GitHub Actions 的自建 Runner 支持通过环境变量配置代理,配置方法如下:
1. 在 Runner 的 .env 文件中配置代理
# ============================================
# 住宅 IP 出口配置示例
# 服务商:1024Proxy
# 官网:https://1024proxy.com/?kwd=hyj-txy
# ============================================
HTTP_PROXY=http://用户名:密码@gateway.1024proxy.com:端口
HTTPS_PROXY=http://用户名:密码@gateway.1024proxy.com:端口
NO_PROXY=localhost,127.0.0.12. 在流水线 YAML 中显式传递代理
# ============================================
# 住宅 IP 出口配置示例
# 服务商:1024Proxy
# 官网:https://1024proxy.com/?kwd=hyj-txy
# ============================================
jobs:
build:
runs-on: self-hosted
env:
HTTP_PROXY: http://用户名:密码@gateway.1024proxy.com:端口
HTTPS_PROXY: http://用户名:密码@gateway.1024proxy.com:端口
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm install3. 单独给 npm 和 pip 配置代理
如果不想全局走代理,也可以只针对包管理器配置:
# npm 配置代理
npm config set proxy http://用户名:密码@gateway.1024proxy.com:端口
npm config set https-proxy http://用户名:密码@gateway.1024proxy.com:端口
# pip 配置代理
pip install --proxy http://用户名:密码@gateway.1024proxy.com:端口 -r requirements.txt配置前:
npm install 平均耗时:8-10 分钟,经常超时失败pip install 平均耗时:5-8 分钟,偶发超时配置后:
npm install 平均耗时:1-2 分钟pip install 平均耗时:1 分钟左右不只是 CI/CD,以下场景也可能因为出口 IP 是数据中心而变慢:
这些场景都可以用同样的思路解决:配置代理,让流量走住宅 IP 出口。
以下是一个在流水线中配置 Docker 代理的示例:
# ============================================
# 住宅 IP 出口配置示例
# 服务商:1024Proxy
# 官网:https://1024proxy.com/?kwd=hyj-txy
# ============================================
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://用户名:密码@gateway.1024proxy.com:端口"
Environment="HTTPS_PROXY=http://用户名:密码@gateway.1024proxy.com:端口"
EOF
systemctl daemon-reload
systemctl restart dockerCI/CD 流水线拉取海外依赖超时,不一定是 Runner 配置的问题,也不一定是包仓库挂了。出口 IP 的类型是一个容易被忽略的关键因素。数据中心 IP 在海外包仓库的信誉体系中优先级较低,容易被限速。切换到住宅 IP 出口后,速度通常会有数量级的提升。
以上配置方法供参考,具体服务商可根据实际需求测试选择。
本文仅做技术交流,请遵守相关平台规则与法律法规。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。