Перейти к содержимому
Гайды 7 мин чтения 3 просмотров

Настройка прокси в GitHub Actions и CI/CD

Подробное руководство по настройке прокси-серверов в GitHub Actions. Решите проблемы с доступом, обойдите ограничения и повысьте безопасность CI/CD.

Настройка прокси-сервера в GitHub Actions позволяет маршрутизировать исходящий сетевой трафик рабочих процессов через определённый прокси, что необходимо для доступа к внешним ресурсам из закрытых сетей, контроля трафика или обхода географических ограничений.

Зачем использовать прокси в GitHub Actions?

Использование прокси-сервера в GitHub Actions решает несколько задач:
* Доступ к внутренним ресурсам: Рабочие процессы могут требовать доступа к ресурсам, расположенным во внутренней сети организации (например, приватным репозиториям пакетов, базам данных, API), которые недоступны напрямую из публичного интернета. Прокси может выступать шлюзом.
* Безопасность и контроль: Весь исходящий трафик рабочих процессов может быть маршрутизирован через корпоративный прокси-сервер для мониторинга, фильтрации и применения политик безопасности.
* Обход сетевых ограничений: В некоторых случаях требуется доступ к внешним ресурсам, которые могут быть заблокированы по географическому признаку или другим сетевым политикам. Прокси позволяет обойти эти ограничения.
* Кэширование и производительность: Прокси-сервер может кэшировать запросы к внешним ресурсам, что потенциально ускоряет повторные сборки и сокращает время выполнения рабочих процессов.

GitHub Actions запускаются на виртуальных машинах (раннерах), которые получают доступ к интернету. Эти раннеры не имеют предустановленных настроек прокси, поэтому конфигурация должна быть выполнена в рамках самого рабочего процесса.

Методы настройки прокси

Настройка прокси может быть выполнена на нескольких уровнях: через переменные окружения, для Docker-контейнеров, или для конкретных инструментов.

Настройка через переменные окружения

Наиболее распространённый и универсальный способ настройки прокси в GitHub Actions — использование стандартных переменных окружения. Большинство HTTP-клиентов и инструментов автоматически учитывают эти переменные.

Переменные HTTP_PROXY, HTTPS_PROXY, NO_PROXY

  • HTTP_PROXY: Определяет прокси-сервер для HTTP-трафика.
  • HTTPS_PROXY: Определяет прокси-сервер для HTTPS-трафика.
  • NO_PROXY: Список хостов, для которых прокси не должен использоваться. Значения разделяются запятыми. Важно включать в этот список домены GitHub (например, github.com, api.github.com) и любые внутренние ресурсы, к которым требуется прямой доступ без прокси.

Формат:
http://[user:password@]host:port
https://[user:password@]host:port

Пример использования в рабочем процессе

Переменные окружения могут быть установлены глобально для всего рабочего процесса или для конкретного шага.

name: CI with Proxy

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      # Глобальная настройка прокси для всех шагов в этом job
      HTTP_PROXY: http://proxy.example.com:8080
      HTTPS_PROXY: http://proxy.example.com:8080
      NO_PROXY: github.com,api.github.com,localhost,127.0.0.1,.internal.domain
      # Если прокси требует аутентификации, используйте GitHub Secrets
      # HTTP_PROXY: http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASSWORD }}@proxy.example.com:8080
      # HTTPS_PROXY: http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASSWORD }}@proxy.example.com:8080

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install dependencies via npm
        run: npm install # npm автоматически использует переменные окружения

      - name: Fetch external resource via curl
        run: curl -v https://external-api.example.com/data # curl также использует переменные окружения

      - name: Direct access to GitHub API (should bypass proxy)
        run: curl -v https://api.github.com/zen

Настройка для Docker-контейнеров и Actions

Многие GitHub Actions запускаются внутри Docker-контейнеров. Настройка прокси для таких действий требует передачи переменных окружения в контейнер.

Передача переменных окружения в контейнеры

Если действие использует docker или docker-compose, переменные окружения можно передать через секцию env шага. GitHub Actions автоматически передаёт переменные HTTP_PROXY, HTTPS_PROXY, NO_PROXY в контейнеры, запускаемые в рамках run команд, если они были определены на уровне job или step.

name: Docker Action 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: github.com,api.github.com,localhost,127.0.0.1

    steps:
      - name: Run a custom Docker action
        uses: docker/build-push-action@v5 # Пример действия, которое запускает Docker
        with:
          context: .
          push: false
          tags: my-image:latest
          build-args: | # Передача прокси-переменных в Dockerfile при сборке
            HTTP_PROXY=${{ env.HTTP_PROXY }}
            HTTPS_PROXY=${{ env.HTTPS_PROXY }}
            NO_PROXY=${{ env.NO_PROXY }}

Настройка прокси для сборки Docker-образов

При сборке Docker-образов с помощью docker build, прокси-переменные могут быть переданы как build-args. Это позволяет Dockerfile использовать прокси для скачивания пакетов или зависимостей во время сборки.

Dockerfile:

# Dockerfile
ARG HTTP_PROXY
ARG HTTPS_PROXY
ARG NO_PROXY

ENV HTTP_PROXY=$HTTP_PROXY
ENV HTTPS_PROXY=$HTTPS_PROXY
ENV NO_PROXY=$NO_PROXY

FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl
RUN curl -v https://external-api.example.com/data # Использует прокси, установленный через ENV

Workflow:

      - 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 .

Настройка для специфических инструментов

Некоторые инструменты могут не полностью поддерживать стандартные переменные окружения или требовать специфической конфигурации.

Git

Git может быть настроен для использования прокси через свою конфигурацию.

      - name: Configure Git proxy
        run: |
          git config --global http.proxy "${{ env.HTTP_PROXY }}"
          git config --global https.proxy "${{ env.HTTPS_PROXY }}"
          # Для Git не существует прямого аналога NO_PROXY,
          # но можно использовать `http.proxy` для конкретных доменов или `url.<base>.insteadOf`
          # или обеспечить, чтобы `NO_PROXY` был установлен для общей среды выполнения.
          # Большинство операций с GitHub репозиториями будут работать без прокси,
          # если `NO_PROXY` правильно настроен в env.

npm/yarn

Node.js пакетные менеджеры обычно уважают переменные окружения, но также имеют собственные настройки.

      - name: Configure npm proxy
        run: |
          npm config set proxy "${{ env.HTTP_PROXY }}"
          npm config set https-proxy "${{ env.HTTPS_PROXY }}"
          npm config set no-proxy "${{ env.NO_PROXY }}" # npm имеет свою no-proxy опцию
          npm install

Для Yarn:

      - name: Configure yarn proxy
        run: |
          yarn config set proxy "${{ env.HTTP_PROXY }}"
          yarn config set https-proxy "${{ env.HTTPS_PROXY }}"
          yarn config set no-proxy "${{ env.NO_PROXY }}"
          yarn install

cURL/wget

Эти утилиты обычно автоматически используют переменные окружения HTTP_PROXY и HTTPS_PROXY. Для явного указания:

      - name: Fetch with explicit curl proxy
        run: curl -x "${{ env.HTTP_PROXY }}" https://external-api.example.com/data

Maven/Gradle

Java-инструменты, такие как Maven и Gradle, могут требовать настройки прокси через параметры JVM или файлы конфигурации.

Maven (settings.xml):
Можно создать или модифицировать ~/.m2/settings.xml для включения прокси-настроек.

<settings>
  <proxies>
    <proxy>
      <id>myproxy</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>proxy.example.com</host>
      <port>8080</port>
      <username>${env.PROXY_USER}</username>
      <password>${env.PROXY_PASSWORD}</password>
      <nonProxyHosts>github.com|api.github.com|*.internal.domain</nonProxyHosts>
    </proxy>
  </proxies>
</settings>

В GitHub Actions этот файл можно создать динамически:

      - name: Configure Maven proxy
        run: |
          mkdir -p ~/.m2
          echo "<settings><proxies><proxy><id>myproxy</id><active>true</active><protocol>http</protocol><host>proxy.example.com</host><port>8080</port><username>${{ secrets.PROXY_USER }}</username><password>${{ secrets.PROXY_PASSWORD }}</password><nonProxyHosts>github.com|api.github.com</nonProxyHosts></proxy></proxies></settings>" > ~/.m2/settings.xml
          mvn clean install
        env:
          PROXY_USER: ${{ secrets.PROXY_USER }}
          PROXY_PASSWORD: ${{ secrets.PROXY_PASSWORD }}

Gradle (gradle.properties или JVM arguments):
Можно установить системные свойства JVM:

      - name: Configure Gradle proxy
        run: |
          gradlew build -Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=8080 \
            -Dhttps.proxyHost=proxy.example.com -Dhttps.proxyPort=8080 \
            -Dhttp.nonProxyHosts="github.com|api.github.com"

Аутентификация прокси-сервера

Если прокси-сервер требует аутентификации, учётные данные должны быть включены в URL прокси.

Использование GitHub Secrets

Никогда не храните учётные данные прокси непосредственно в файле рабочего процесса. Используйте GitHub Secrets для безопасного хранения конфиденциальной информации.

Настройка секрета:
Перейдите в репозиторий > Settings > Secrets and variables > Actions > New repository secret.
Создайте секреты, например, PROXY_USER и PROXY_PASSWORD.

Использование в рабочем процессе:

    env:
      PROXY_HOST: proxy.example.com
      PROXY_PORT: 8080
      HTTP_PROXY: http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASSWORD }}@${{ env.PROXY_HOST }}:${{ env.PROXY_PORT }}
      HTTPS_PROXY: http://${{ secrets.PROXY_USER }}:${{ secrets.PROXY_PASSWORD }}@${{ env.PROXY_HOST }}:${{ env.PROXY_PORT }}
      NO_PROXY: github.com,api.github.com,localhost,127.0.0.1,.internal.domain

Это позволит использовать аутентифицированный прокси без раскрытия учётных данных в логах или коде.

Рекомендации по безопасности

  • Используйте GitHub Secrets: Всегда храните конфиденциальные данные (логины, пароли прокси) в GitHub Secrets.
  • Ограничение доступа: Настраивайте прокси-сервер таким образом, чтобы доступ к нему имели только авторизованные IP-адреса или диапазоны IP-адресов GitHub Actions раннеров, если это возможно. Однако IP-адреса раннеров динамические и меняются, что затрудняет статические правила файрвола.
  • Принцип наименьших привилегий: Предоставляйте прокси-серверу только те разрешения, которые абсолютно необходимы для выполнения задач CI/CD.
  • Регулярный аудит: Проверяйте логи прокси-сервера на предмет подозрительной активности.

Диагностика и устранение проблем

  • Проверка переменных окружения: Добавьте шаг в рабочий процесс для вывода значений переменных окружения:
    yaml - name: Debug proxy environment variables run: | echo "HTTP_PROXY: $HTTP_PROXY" echo "HTTPS_PROXY: $HTTPS_PROXY" echo "NO_PROXY: $NO_PROXY"
  • Тестирование соединения: Используйте curl или wget для проверки возможности доступа к внешнему ресурсу через прокси.
    yaml - name: Test proxy connection run: curl -v --proxy "${{ env.HTTP_PROXY }}" https://external-api.example.com/status
    Если прокси не работает, curl покажет ошибки соединения.
  • Проверка NO_PROXY: Убедитесь, что все внутренние ресурсы и домены GitHub включены в NO_PROXY, чтобы избежать проблем с доступом к ним.
  • Логи прокси-сервера: Если у вас есть доступ к логам прокси-сервера, проверьте их на наличие ошибок аутентификации или блокировки запросов.
  • Версия инструментов: Убедитесь, что используемые инструменты (npm, git, curl) достаточно актуальны и корректно обрабатывают прокси-переменные.

Сравнение методов настройки

Метод Преимущества Недостатки Применимость
Переменные окружения Универсален, поддерживается большинством инструментов, легко настраивается. Может быть переопределён инструментами, не всегда подходит для Dockerfile build. Общая настройка для большинства команд и скриптов в рабочем процессе.
Docker Build Args/Env Позволяет настроить прокси для этапов сборки Docker-образов и выполнения контейнеров. Требует явной передачи в Dockerfile/команды docker run. Сборка Docker-образов, запуск действий на основе Docker.
Специфические настройки инструментов Максимальная точность, обходит потенциальные конфликты с общими переменными. Требует индивидуальной настройки для каждого инструмента, увеличивает сложность. Для инструментов с уникальными требованиями (Maven, Gradle, специфичные CLI).
Обновлено: 03.03.2026
Назад к категории

Попробуйте наши прокси

20,000+ прокси в 100+ странах мира