Сборка и развертывание одной командой

Собрать образы и развернуть приложение в production:

werf converge --repo ghcr.io/group/project --env production

Собрать образы с кастомными тегами и развернуть приложение в окружение по умолчанию:

werf converge --repo ghcr.io/group/project --use-custom-tag "%image%-$CI_JOB_ID"

Компоненты пайплайна

Приведенные ниже команды позволяют организовать пайплайн, адаптированный под ваши нужды.

При выполнении большинства команд будет проверено наличие собранных образов в указанном репозитории container registry. При отсутствии нужных образов, будут запущены инструкции сборки. В некоторых сценариях (например, запуск тестов в CI системе) правильнее вначале собирать образы с помощью команды werf build, а затем использовать те же самые образы на следующих шагах пайплайна, указывая флаг --require-built-images. В этом случае команда завершится с ошибкой, если нужные образы отсутствуют.

Интеграция с CI-системой (в настоящее время поддерживаются GitLab и GitHub Workflows)

Задать значения по умолчанию для команд werf и выполнить авторизацию в container registry, используя переменные окружения GitLab:

. $(werf ci-env gitlab --as-file)

Сборка, тегирование и публикация образов

Собрать образы с использованием container registry:

werf build --repo ghcr.io/group/project

Собрать образы и прикрепить к ним кастомные теги в дополнение к тегам на основе содержимого:

werf build --repo ghcr.io/group/project --add-custom-tag latest --add-custom-tag 1.2.1

Собрать и сохранить конечные образы в отдельный registry, развернутый в кластере Kubernetes:

werf build --repo ghcr.io/group/project --final-repo fast-in-cluster-registry.cluster/group/project

Собрать образы с использованием реестра контейнеров (можно использовать локальное хранилище) и экспортировать их в другой реестр контейнеров:

werf export --repo ghcr.io/group/project --tag ghcr.io/group/otherproject/%image%:latest

Выполнение разовых задач (юнит-тесты, линтеры, разовые job’ы)

Запустить тесты с использованием предварительно созданного образа frontend_image в Pod’е Kubernetes:

werf kube-run frontend_image --repo ghcr.io/group/project -- npm test

Запустить тесты в Pod’е, но перед выполнением команды скопировать файл с секретными ENV-переменными в контейнер:

werf kube-run frontend_image --repo ghcr.io/group/project --copy-to ".env:/app/.env" -- npm run e2e-tests

Запустить тесты в Pod’е Kubernetes и скачать отчет о покрытии тестов из контейнера после завершения:

werf kube-run frontend_image --repo ghcr.io/group/project --copy-from "/app/report:." -- go test -coverprofile report ./...

Запустить команду по умолчанию собранного образа в Pod’е Kubernetes с заданными CPU requests:

werf kube-run frontend_image --repo ghcr.io/group/project --overrides='{"spec":{"containers":[{"name": "%container_name%", "resources":{"requests":{"cpu":"100m"}}}]}}'

Запуск интеграционных тестов

Как правило, для запуска интеграционных тестов (e2e, acceptance, security и т.д.) необходимо production-окружение (его можно подготовить с помощью converge или bundle) и контейнер с соответствующей командой.

Запустить интеграционные тесты с помощью converge:

werf converge --repo ghcr.io/group/project --env integration

Запустить интеграционные тесты, подготовив окружение с помощью converge, и выполнить разовую задачу с помощью kube-run:

werf converge --repo ghcr.io/group/project --env integration_infra
werf kube-run --repo ghcr.io/group/project --env integration -- npm run acceptance-tests

Подготовка артефактов релиза (по желанию)

Бандлы werf позволяют подготовить артефакты релиза, которые могут быть протестированы или развернуты позже (с помощью werf, Argo CD или Helm), и сохранить их в реестре контейнеров с указанным тегом.

Использовать тег semver, совместимый с OCI-чартом Helm:

werf bundle publish --repo ghcr.io/group/project --tag 1.0.0

Использовать произвольный символьный тег:

werf bundle publish --repo ghcr.io/group/project --tag latest

Развертывание приложения

Собрать и развернуть приложение в production:

werf converge --repo ghcr.io/group/project --env production

Развернуть приложение, собранное на предыдущем шаге, и использовать кастомный тег вместо тега по умолчанию на основе содержимого:

werf converge --require-built-images --repo ghcr.io/group/project --use-custom-tag "%image%-$CI_JOB_ID"

Развернуть ранее опубликованный бандл с тегом 1.0.0 в production:

werf bundle apply --repo ghcr.io/group/project --env production --tag 1.0.0

Очистка реестра контейнеров

Процедура должна запускаться по расписанию. Иначе количество образов и метаданных werf может значительно увеличить занимаемый размер реестра и время выполнения операций

Выполнить безопасную процедуру очистки неактуальных образов и метаданных werf из реестра контейнеров с учётом пользовательских политик очистки и запущенных в K8s-кластере образов:

werf cleanup --repo ghcr.io/group/project

Локальная разработка

У большинства команд werf имеется флаг --dev для локальной разработки. Он позволяет выполнять команды, не добавляя (git add) их в Git. Флаг --follow перезапускает команду при изменении файлов в репозитории.

Отрендерить и показать манифесты:

werf render --dev

Собрать образ и запустить интерактивную оболочку в контейнере с неудавшейся стадией в случае ошибки:

werf build --dev [--follow] --introspect-error

Собрать образ, запустить его в Pod’е Kubernetes и выполнить в нем команду:

werf kube-run --dev [--follow] --repo ghcr.io/group/project frontend -- npm lint

Запустить командную оболочку в контейнере в Pod’e Kubernetes для указанного образа:

werf kube-run --dev --repo ghcr.io/group/project -it frontend -- bash

Собрать образ и развернуть его в dev-кластере (может быть локальным):

werf converge --dev [--follow] --repo ghcr.io/group/project

Собрать образ и развернуть его в dev-кластере; использовать стадии из вторичного read-only-реестра для ускорения сборки:

werf converge --dev [--follow] --repo ghcr.io/group/project --secondary-repo ghcr.io/group/otherproject

Выполнить команду docker-compose up с переданными именами образов:

werf compose up --dev [--follow]