Настройка прокси-сервера в 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). |