跳转到内容
Guides 3 分钟阅读 951 次浏览

在 GitHub Actions 与 CI/CD 中配置代理

本指南详细介绍如何借助 GProxy 在 GitHub Actions 和 CI/CD 流水线中有效设置并管理代理配置。

在 GitHub Actions 与 CI/CD 中配置代理

在 GitHub Actions 和 CI/CD 中配置代理,指的是在 workflow 定义中(通常位于 job 或 step 级别)设置 HTTP_PROXYHTTPS_PROXYNO_PROXY 等标准代理环境变量。这样,CI/CD 流水线中执行的 action、脚本和工具就会将网络流量经由指定的代理服务器转发。

企业经常部署代理服务器,用于控制出站网络访问、执行安全策略、过滤内容以及缓存高频访问的资源。对于运行在此类环境中的 CI/CD 流水线,配置代理是必需的,只有这样构建工具、依赖管理器和测试脚本才能访问外部服务、软件包仓库或 API。GitHub Actions 的 runner,尤其是 self-hosted runner,可能需要配置代理才能访问 GitHub 本身或其他互联网资源。

设置代理环境变量

在基于 Linux 的环境中(GitHub 托管的 runner 主要使用该环境),配置代理最常见、通用性最强的方法就是环境变量。

  • HTTP_PROXY:指定用于 HTTP 请求的代理服务器。
  • HTTPS_PROXY:指定用于 HTTPS 请求的代理服务器。
  • NO_PROXY:以逗号分隔的主机名、域名或 IP 地址列表,这些目标将绕过代理。对于直接访问内部资源而言至关重要。

HTTP_PROXYHTTPS_PROXY 的格式通常为 http://[user:password@]host:port
多数工具对这些变量的大写形式(HTTP_PROXY)和小写形式(http_proxy)都能识别;环境变量使用大写是通行做法。

workflow 级别的代理配置

在 job 级别设置代理,可确保该 job 内的所有 step 都继承该配置。

name: CI with Proxy
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      HTTP_PROXY: http://proxy.example.com:8080
      HTTPS_PROXY: http://proxy.example.com:8080
      NO_PROXY: localhost,127.0.0.1,.internal.company.com,github.com
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install Node.js dependencies
        run: npm install

      - name: Download a file via curl
        run: curl -v https://api.example.com/data

      - name: Access internal service (bypasses proxy)
        run: curl -v http://internal-service.internal.company.com/status

step 级别的代理配置

如果某些 step 需要不同的代理设置,或需要覆盖 job 级别的配置,可以在 step 级别定义环境变量。

name: CI with Specific Step Proxy
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    env: # job 的默认代理(如有)
      HTTP_PROXY: http://default-proxy:8080
      HTTPS_PROXY: http://default-proxy:8080
      NO_PROXY: localhost,127.0.0.1
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Step using default proxy
        run: curl https://external-api.com/v1

      - name: Step using a different proxy
        env:
          HTTP_PROXY: http://special-proxy:3128
          HTTPS_PROXY: http://special-proxy:3128
          NO_PROXY: localhost,127.0.0.1,api.special-domain.com
        run: curl https://api.special-domain.com/v2

使用 secrets 进行代理认证

如果代理需要认证,请将用户名和密码直接写入代理 URL。出于安全考虑,请将凭据保存为 GitHub Actions secret,并在 workflow 中引用。

首先在 GitHub 仓库设置中创建仓库 secret(例如 PROXY_USERPROXY_PASS)。

name: Authenticated Proxy Workflow
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      HTTP_PROXY: http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASS }}@proxy.example.com:8080
      HTTPS_PROXY: http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASS }}@proxy.example.com:8080
      NO_PROXY: localhost,127.0.0.1,.internal.company.com
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Perform network operation
        run: npm install # 或 curl 等

常用工具与代理的交互

虽然 HTTP_PROXYHTTPS_PROXY 被广泛支持,但部分工具提供了各自专门的配置方式。

git 命令

git 在远程操作中通常会遵循 HTTP_PROXYHTTPS_PROXY。若需要显式配置,或环境变量不足以生效,可以使用 git config

# 为 HTTP 和 HTTPS 的 git 操作设置代理
git config --global http.proxy http://proxy.example.com:8080
git config --global https.proxy http://proxy.example.com:8080

# 为特定 remote 配置专用代理
git config http.https://github.com/.proxy http://github-proxy:8080

npmyarn

npmyarn 等 Node.js 包管理器会遵循 HTTP_PROXYHTTPS_PROXY 环境变量。它们同时提供各自的配置命令用于持久化设置。

# 使用 npm config
npm config set proxy http://proxy.example.com:8080
npm config set https-proxy http://proxy.example.com:8080
npm config set no-proxy localhost,127.0.0.1,.internal.com

# 使用 yarn config
yarn config set proxy http://proxy.example.com:8080
yarn config set httpsProxy http://proxy.example.com:8080
yarn config set no-proxy localhost,127.0.0.1,.internal.com

docker(镜像构建与容器运行时)

Docker 的代理设置需要分别处理镜像构建阶段和容器运行阶段。

Docker 构建阶段代理

对于在 docker build 过程中执行的命令(例如 RUN apk addRUN apt-get update),必须将代理设置作为构建参数传入。

Dockerfile 示例:

FROM alpine:latest

# 定义代理设置的构建参数
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY

# 为后续 RUN 命令设置环境变量
ENV HTTP_PROXY=$HTTP_PROXY
ENV HTTPS_PROXY=$HTTPS_PROXY
ENV NO_PROXY=$NO_PROXY

# 示例:安装软件包时使用代理
RUN apk add --no-cache curl

# ... Dockerfile 的其余部分

GitHub Actions workflow step:

- name: Build Docker image with proxy
  run: |
    docker build . \
      --build-arg HTTP_PROXY=${{ env.HTTP_PROXY }} \
      --build-arg HTTPS_PROXY=${{ env.HTTPS_PROXY }} \
      --build-arg NO_PROXY=${{ env.NO_PROXY }} \
      -t my-app:latest
Docker 容器运行时代理

如果 workflow 运行 Docker 容器(例如使用 container: 键或 docker run),必须将代理设置作为环境变量传入容器。

使用 container: 键:

jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: my-custom-image:latest
      env:
        HTTP_PROXY: ${{ env.HTTP_PROXY }}
        HTTPS_PROXY: ${{ env.HTTPS_PROXY }}
        NO_PROXY: ${{ env.NO_PROXY }}
    steps:
      - name: Run command inside container
        run: curl https://external-api.com/data

在 step 中使用 docker run

- name: Run Docker container with proxy
  run: |
    docker run \
      -e HTTP_PROXY=${{ env.HTTP_PROXY }} \
      -e HTTPS_PROXY=${{ env.HTTPS_PROXY }} \
      -e NO_PROXY=${{ env.NO_PROXY }} \
      my-app:latest /app/script.sh

Java 应用(MavenGradle

Java 应用(包括 Maven、Gradle 等构建工具)通常要求以 Java 系统属性的形式传入代理设置。常见做法是通过 MAVEN_OPTS_JAVA_OPTIONS 环境变量设置。

# Maven 用
export MAVEN_OPTS="-Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.example.com -Dhttps.proxyPort=8080 -Dhttp.nonProxyHosts='localhost|127.0.0.1|*.internal.com'"

# Gradle 用(同样适用于其他基于 JVM 的工具)
export JAVA_OPTS="-Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxy.example.com -Dhttps.proxyPort=8080 -Dhttp.nonProxyHosts='localhost|127.0.0.1|*.internal.com'"

此外,Maven 也可以通过 ~/.m2/settings.xml 配置,Gradle 可以通过项目目录或用户主目录中的 gradle.properties 配置。

代理问题排查

  • 确认环境变量:在某个 step 中执行 run: env | grep -i proxy,确认代理环境变量已正确设置且对 runner 的 shell 可见。
  • 检查 NO_PROXY:确保内部主机和 GitHub 相关域名已正确列入 NO_PROXY,避免不必要的代理转发或路由问题。
  • 代理服务器日志:如有条件,请在代理服务器日志中查找来自 GitHub Actions runner IP 地址的连接尝试。这有助于判断请求是否到达代理,以及被拒绝的原因(例如认证失败、访问被拒)。
  • 网络连通性:在 workflow step 中使用 curl -v --proxy <your-proxy-url> <target-url>,显式测试经由代理到某个已知外部端点的连通性。
  • SSL/TLS 证书问题:如果使用 HTTPS 代理,或通过 HTTP 代理访问 HTTPS 站点,且代理会做 SSL 检测,runner 可能出现证书校验错误。此时需要将代理的根 CA 证书加入 runner 的信任库。这属于复杂配置,通常在 self-hosted runner 环境中处理。

代理配置速查

工具/场景 主要代理配置方式 说明
通用 shell 命令 HTTP_PROXYHTTPS_PROXYNO_PROXY 环境变量 标准做法,curlwgetaptyum 等工具广泛支持。对 http_proxy 的大小写不敏感支持很常见。
git HTTP_PROXYHTTPS_PROXY 环境变量;git config git config 写入持久化配置,适用于特定 git 行为,或环境变量未被稳定应用的场景。
npmyarn HTTP_PROXYHTTPS_PROXY 环境变量;npm config set 环境变量通常已足够。工具自带的配置命令可持久化设置或覆盖环境变量。
docker build docker build--build-arg HTTP_PROXY 参数;Dockerfile 中的 ARG/ENV 必须以构建参数显式传入代理设置,才能在 Docker 构建上下文中生效。ENV 使其对后续 RUN 命令可用。
docker run(容器运行时) docker run-e HTTP_PROXY 参数;workflow container: 定义中的 env 将代理环境变量传入运行中的容器。适用于 workflow 本身为 job 或 step 运行容器的情况。
Java 应用(MavenGradle -Dhttp.proxyHost_JAVA_OPTIONSMAVEN_OPTS 环境变量 Java 应用需要特定系统属性来配置其 HTTP 客户端。这些属性可通过 JVM 读取的环境变量设置,也可以改用工具自带的配置文件。
已更新: 03.03.2026
返回分类

试用我们的代理

遍布 100+ 国家的 20,000+ 代理

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.