首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CI/CD 流水线拉取海外依赖总是超时?排查网络出口的 IP 类型

CI/CD 流水线拉取海外依赖总是超时?排查网络出口的 IP 类型

原创
作者头像
1024_officlal
发布于 2026-09-27 09:48:14
发布于 2026-09-27 09:48:14
970
举报

最近在给项目配 CI/CD 流水线,用的是 GitHub Actions 加自建 Runner。流水线逻辑很简单:拉代码 → 装依赖 → 跑测试 → 构建镜像。但部署到自建 Runner 后,npm install 和 pip install 阶段频繁超时,偶尔能跑通,大部分时候卡在下载依赖那一步。

一开始以为是 Runner 机器配置不够,加了内存和 CPU 之后问题依旧。后来抓包才发现,问题出在网络出口上。

一、症状:依赖下载阶段频繁超时

流水线日志里反复出现这类报错:

代码语言:javascript
复制
npm ERR! code ETIMEDOUT
npm ERR! network request to https://registry.npmjs.org/xxx failed

或者:

代码语言:javascript
复制
ReadTimeoutError: HTTPSConnectionPool(host='pypi.org', port=443): Read timed out.

手动在 Runner 机器上跑 npm install 也一样慢。但用浏览器访问 npmjs.com 却正常。

二、排查:网络通,但下载速度极慢

先确认基本连通性:

代码语言:javascript
复制
ping -c 20 registry.npmjs.org

延迟 180ms 左右,有轻微丢包,但不至于断连。

用 curl 测试实际下载速度:

代码语言:javascript
复制
curl -o /dev/null -w "%{speed_download} bytes/s\n" https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz

速度只有 30K 左右,稳定地慢。

接着查 Runner 机器的出口 IP 归属:

代码语言:javascript
复制
curl -s https://ipinfo.io/json | jq '.org, .asn'

结果显示是某云服务商的数据中心网段。

三、定位:数据中心 IP 被包仓库限速了

npm、PyPI、Maven Central 这些包仓库,对数据中心 IP 普遍有速率限制。原因是机房 IP 常被用于大规模爬取和自动化滥用,仓库为了保障正常开发者的下载体验,会对机房 IP 做 QoS 降级。表现就是:能连上,但下载速度被压得很低,且频繁超时。

这也解释了为什么浏览器访问正常——网页流量小,不容易触发限速,而 CI/CD 流水线一次性拉取几百个依赖包,持续大流量传输,直接撞上限速策略。

四、解决:让 Runner 走住宅 IP 出口

既然瓶颈在出口 IP,解决方案就是换一个住宅 IP 出口。住宅 IP 的 ASN 归属于当地运营商,在包仓库的访问策略中不会被限速。

GitHub Actions 的自建 Runner 支持通过环境变量配置代理,配置方法如下:

1. 在 Runner 的 .env 文件中配置代理

代码语言:javascript
复制
# ============================================
# 住宅 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.1

2. 在流水线 YAML 中显式传递代理

代码语言:javascript
复制
# ============================================
# 住宅 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 install

3. 单独给 npm 和 pip 配置代理

如果不想全局走代理,也可以只针对包管理器配置:

代码语言:javascript
复制
# 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 分钟左右
  • 流水线成功率从 60% 提升到接近 100%

六、其他类似场景

不只是 CI/CD,以下场景也可能因为出口 IP 是数据中心而变慢:

  • Docker 拉取海外镜像
  • Git 克隆海外仓库
  • Hugging Face 模型下载
  • apt update 海外源

这些场景都可以用同样的思路解决:配置代理,让流量走住宅 IP 出口。

以下是一个在流水线中配置 Docker 代理的示例:

代码语言:javascript
复制
# ============================================
# 住宅 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 docker

七、小结

CI/CD 流水线拉取海外依赖超时,不一定是 Runner 配置的问题,也不一定是包仓库挂了。出口 IP 的类型是一个容易被忽略的关键因素。数据中心 IP 在海外包仓库的信誉体系中优先级较低,容易被限速。切换到住宅 IP 出口后,速度通常会有数量级的提升。

以上配置方法供参考,具体服务商可根据实际需求测试选择。


本文仅做技术交流,请遵守相关平台规则与法律法规。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、症状:依赖下载阶段频繁超时
  • 二、排查:网络通,但下载速度极慢
  • 三、定位:数据中心 IP 被包仓库限速了
  • 四、解决:让 Runner 走住宅 IP 出口
  • 五、效果对比
  • 六、其他类似场景
  • 七、小结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档