Обзор
При использовании CI/CD-системы пользователь должен учитывать её особенности и интегрироваться с существующими примитивами и компонентами.
werf предлагает готовую интеграцию для GitLab CI/CD и GitHub Actions. Используя служебные переменные окружения CI-заданий, интеграция выполняет следующие действия:
- Создание временной Docker-конфигурации на основе текущей пользовательской и авторизация в container registry CI.
- Простановка значений по умолчанию для команд werf:
- Использование container registry CI (
WERF_REPO). - Определение текущего окружения (
WERF_ENV). - Аннотирование выкатываемых ресурсов чарта, связывание с CI-системой (
WERF_ADD_ANNOTATION_*). Во все выкатываемые ресурсы добавляются аннотации, которые позволяют пользователю перейти в связанный пайплайн, задание и коммит при необходимости. - Настройка логирования werf (
WERF_LOG_*). - Включение автоматической очистки процессов werf для отменённых CI-заданий (
WERF_ENABLE_PROCESS_EXTERMINATOR=1). Процедура требуется только в тех CI-системах, которые не умеют посылать сигнал о завершении порожденным процессам (например, в GitLab CI/CD).
- Использование container registry CI (
Конфигурация Docker
По умолчанию werf ci-env копирует текущую директорию конфигурации Docker (из ~/.docker или пути, указанного через --docker-config/WERF_DOCKER_CONFIG) во временную директорию и экспортирует переменную окружения DOCKER_CONFIG, указывающую на неё. Это изолирует Docker-операции CI-задания от конфигурации хоста.
Флаг --use-docker-auth-config (или WERF_USE_DOCKER_AUTH_CONFIG=1) меняет это поведение: вместо копирования существующей конфигурации Docker создаётся новая на основе переменной окружения DOCKER_AUTH_CONFIG. Это полезно, когда:
- CI-раннер не имеет постоянной конфигурации Docker (например, эфемерные раннеры).
- Учётные данные реестра передаются через
DOCKER_AUTH_CONFIG(распространено в GitLab CI/CD). - Требуется чистая конфигурация Docker без унаследованных credential helpers или настроек.
Значение DOCKER_AUTH_CONFIG должно быть валидной JSON-строкой в формате Docker config, например:
{"auths": {"registry.example.com": {"auth": "base64-encoded-user:password"}}}
Если флаг --use-docker-auth-config включён, но DOCKER_AUTH_CONFIG не задан, werf ci-env завершится с ошибкой.
После создания временной конфигурации, если включён флаг
--login-to-registry(по умолчанию включен),werf ci-envдополнительно авторизуется в container registry CI, добавляя учётные данные к временной конфигурации.
GitLab CI/CD
Вся интеграция сводится к вызову команды ci-env и последующим выполнением инструкций, которые команда выводит в stdout.
. $(werf ci-env gitlab --as-file)
Далее в рамках shell-сессии все команды werf будут использовать проставленные значения по умолчанию и работать с container registry CI.
К примеру, стадия пайплайна для выката на production может выглядеть следующим образом:
Deploy to Production:
stage: deploy
script:
- . $(werf ci-env gitlab --as-file)
- werf converge
environment:
name: production
Если CI-раннер предоставляет учётные данные реестра через переменную окружения DOCKER_AUTH_CONFIG, можно использовать --use-docker-auth-config для создания конфигурации Docker на её основе:
Deploy to Production:
stage: deploy
script:
- . $(werf ci-env gitlab --as-file --use-docker-auth-config)
- werf converge
environment:
name: production
Полный
.gitlab-ci.ymlдля готовых рабочих процессов, а также особенности использования werf c Shell, Docker и Kubernetes executors можно найти в конфигураторе «Быстрый старт», указав в нём CI/CD как сценарий использования и GitLab CI/CD как CI/CD-систему, а затем выбрав интересующий вас тип CI-раннера.
GitHub Actions
По аналогии с GitLab CI/CD интеграция сводится к вызову команды ci-env и последующим выполнением инструкций, которые команда выводит в stdout.
. $(werf ci-env github --as-file)
Далее в рамках шага все команды werf будут использовать проставленные значения по умолчанию и работать с container registry CI.
К примеру, задание для выката на production может выглядеть следующим образом:
converge:
name: Converge
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Install werf
uses: werf/actions/install@v2
- name: Run script
run: |
. $(werf ci-env github --as-file)
werf converge
env:
WERF_KUBECONFIG_BASE64: ${{ secrets.KUBE_CONFIG_BASE64_DATA }}
WERF_ENV: production
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Полный набор конфигураций (
.github/workflows/*.yml) для готовых рабочих процессов можно найти в конфигураторе «Быстрый старт», выбрав в нём CI/CD как сценарий использования и GitHub Actions — как CI/CD-систему.