werf — Open Source CLI-утилита, написанная на Go, предназначенная для упрощения и ускорения доставки вашего приложения.
Вам достаточно описать конфигурацию приложения, правила сборки и развертывания в Kubernetes, в Git-репозитории, едином источнике правды. Проще говоря, это то, что сегодня называется GitOps.
- Собирает Docker-образы, как используя Dockerfile, так и альтернативный сборщик с собственным синтаксисом, основная задача которого — сокращение времени инкрементальной сборки на основе истории Git.
- Поддерживает множество схем тегирования.
- Выкатывает приложение в Kubernetes, используя Helm-совместимый формат чартов с удобными настройками, улучшенным механизмом отслеживания процесса выката, обнаружения ошибок и выводом логов.
- Очищает Docker registry от неиспользуемых образов.
werf — не CI/CD-система, а инструмент для построения пайплайнов, который может использоваться в любой CI/CD-системе. Мы считаем инструменты такого рода новым поколением высокоуровневых инструментов CI/CD.
Содержание
- Управление полным жизненным циклом приложения: сборка и публикация образов, деплой приложений в Kubernetes и очистка неиспользуемых образов по политикам.
- Описание всех правил сборки и деплоя приложения, состоящего из любого количества компонентов, хранятся в одном Git-репозитории вместе с исходным кодом (SSOT).
- Сборка образов из Dockerfile.
- Инкрементальная сборка на основе истории Git, использование Ansible и другие возможности, реализованные в рамках альтернативного сборщика с собственным синтаксисом.
- Использование совместимых с Helm 2 чартов, а также комплексный деплой с журналированием, трэкингом, ранним выявлением ошибок и использованием аннотаций ресурсов для тонкой настройки процесса деплоя.
- werf — это CLI-утилита, написанная на Go, которая может быть встроена в любую существующую систему CI/CD.
3-х стороннее слияние (3-way-merge)#1616.- Локальная разработка приложений с werf #1940.
Тегирование, основанное на контенте#1184.Поддержка большинства имлементаций Docker registry#2199.Параллельная сборка образов#2200.- Лучшие практики и рецепты для наиболее популярных CI-систем #1617.
Распределенная сборка с общим Docker registry#1614.- Поддержка Helm 3 #1606.
- Kaniko-подобная сборка без привязки к локальному Docker-демону #1618.
- Удобная сборка произвольного числа образов в одном проекте.
- Сборка образов как из Dockerfile, так и из инструкций сборщика Stapel.
- Параллельные сборки на одном хосте (с использованием файловых блокировок).
- Распределенная сборка.
- Параллельная сборка описанных в werf.yaml образов.
- Расширенная сборка со сборщиком Stapel:
- Инкрементальная пересборка на основе истории изменений Git.
- Сборка образов с Shell-инструкциями и Ansible-заданиями.
- Совместное использование кэша между сборками с использованием монтирования.
- Уменьшение размера конечного образа за счёт изолирования исходного кода, инструментов сборки и кэша от результата.
- Сборка одного образа на основе другого, описанного в том же файле конфигурации.
- Инструменты отладки сборочного процесса.
- Подробный вывод.
- Хранение образов в одном или нескольких Docker-репозиториях согласно следующим шаблонам именования:
IMAGES_REPO:[IMAGE_NAME-]TAG
в режимеmonorepo
.IMAGES_REPO[/IMAGE_NAME]:TAG
в режимеmultirepo
.
- Различные стратегии тегирования образов:
- Тегирование образов по тегу, ветке или коммиту в Git.
- Тегирование, основанное на контенте.
- Деплой в Kubernetes и отслеживание корректности выката приложения.
- Отслеживание статуса всех ресурсов.
- Контроль готовности ресурсов.
- Управление контролем процесса деплоя с помощью аннотаций.
- Полный визуальный контроль как процесса деплоя, так и конечного результата.
- Логирование и сообщение об ошибках.
- Вывод периодического отчета о состоянии ресурсов в процессе деплоя.
- Упрощенная отладка проблем без необходимости использовать kubectl.
- Завершение с ошибкой задания pipeline CI при обнаружении проблемы.
- Раннее обнаружение ошибок деплоя ресурсов без необходимости ожидания таймаута.
- Полная совместимость с Helm 2.
- Возможность ограничения прав при развертывании с использованием механизма RBAC (Tiller встроен внутрь werf и его запуск выполняется от имени пользователя, выполняющего деплой).
- Параллельные сборки на одном хосте (с использованием файловых блокировок).
- Распределенный параллельный деплой (скоро) #1620.
- Возможность непрерывной доставки образа с постоянным тегом (как пример, при использовании стратегии тегирования по веткам).
- Очистка локального хранилища и Docker registry по настраиваемым политикам.
- Очистка игнорирует используемые в Kubernetes-кластере образы. werf сканирует следующие типы объектов кластера: Pod, Deployment, ReplicaSet, StatefulSet, DaemonSet, Job, CronJob, ReplicationController.
Руководство по установке Docker CE.
Для работы с Docker-демоном пользователю необходимы соответствующие привилегии. Создайте группу docker и добавьте в неё пользователя:
sudo groupadd docker
sudo usermod -aG docker $USER
- Минимально допустимая версия — 1.9.0.
- В случае использования Git Submodule, минимально допустимая версия — 2.14.0.
Существует множество способов установки werf и большинство освещается в Руководстве по установке. Далее будет рассмотрена установка с помощью multiwerf, рекомендованным способом как при локальной разработке, так и в CI.
# добавление ~/bin в PATH
export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
# установка multiwerf в директорию ~/bin
mkdir -p ~/bin
cd ~/bin
curl -L https://raw.githubusercontent.com/werf/multiwerf/master/get.sh | bash
. $(multiwerf use 1.1 stable --as-file)
Чтобы упростить отладку в CI-окружении, например, в случае, когда бинарный файл multiwerf не установлен или неисполняемый, рекомендуется использовать команду type
:
type multiwerf && . $(multiwerf use 1.1 stable --as-file)
echo '. $(multiwerf use 1.1 stable --as-file)' >> ~/.bashrc
$MULTIWERF_BIN_PATH = "C:\ProgramData\multiwerf\bin"
mkdir $MULTIWERF_BIN_PATH
Invoke-WebRequest -Uri https://flant.bintray.com/multiwerf/v1.3.0/multiwerf-windows-amd64-v1.3.0.exe -OutFile $MULTIWERF_BIN_PATH\multiwerf.exe
[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + "$MULTIWERF_BIN_PATH",
[EnvironmentVariableTarget]::Machine)
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Invoke-Expression -Command "multiwerf use 1.1 stable --as-file --shell powershell" | Out-String -OutVariable WERF_USE_SCRIPT_PATH
. $WERF_USE_SCRIPT_PATH.Trim()
Запустите cmd.exe от имени администратора, а затем выполните следующие действия:
set MULTIWERF_BIN_PATH="C:\ProgramData\multiwerf\bin"
mkdir %MULTIWERF_BIN_PATH%
bitsadmin.exe /transfer "multiwerf" https://flant.bintray.com/multiwerf/v1.3.0/multiwerf-windows-amd64-v1.3.0.exe %MULTIWERF_BIN_PATH%\multiwerf.exe
setx /M PATH "%PATH%;%MULTIWERF_BIN_PATH%"
# откройте новую сессию и начните использовать multiwerf
FOR /F "tokens=*" %g IN ('multiwerf use 1.1 stable --as-file --shell cmdexe') do (SET WERF_USE_SCRIPT_PATH=%g)
%WERF_USE_SCRIPT_PATH%
Следующие руководства демонстрируют основные особенности и помогают быстро начать использовать werf:
- Первые шаги — быстрый старт с использованием существующего Dockerfile.
- Первое приложение — сборка первого приложения (PHP Symfony), используя werf сборщик.
- Деплой в Kubernetes — выкат приложения в Kubernetes с интеграцией собранных образов.
- Интеграция с CI/CD-системами: общая, GitLab CI, GitHub Actions.
- Приложение с несколькими образами — сборка приложения с несколькими образами (Java/ReactJS).
- Использование монтирования — уменьшение размера образа и ускорение сборки с помощью монтирования (Go/Revel).
- Использование артефактов — уменьшение размера образа с помощью артефактов (Go/Revel).
Создайте ваше первое приложение с werf или начните знакомство с чтения документации.
Мы всегда на связи с сообществом. Присоединяйтесь к нам в Telegram, Twitter или Slack!
Мы следим за вашими issues на GitHub.
werf — это уже зрелый, надёжный инструмент, которому можно доверять.
- Доступны 5 уровней стабильности: от alpha до stable и rock-solid. Все изменения в werf проходят через каждый уровень, а переходы в самые стабильные каналы требует минимальных периодов предварительного тестирования (в других каналах). Всё это гарантирует определённые уровни стабильности, из которых можно выбирать подходящий для конкретных проектов.
- Большая часть кода werf покрыта автоматическими (e2e и unit) тестами.
- В компании «Флант» werf используется в production с 2016 года для сборки и с 2017-го — для деплоя сотен приложений. Эти приложения очень разнообразны в размерах, архитектуре, применяемом технологическом стеке. Кроме того, мы знаем как минимум десятки других компаний, использующих werf годами.
- Если у вас остаются какие-то сомнения или вопросы по werf — будем рады пообщаться в онлайн-сообществах (Telegram на русском или Slack на английском)! Там же можно найти и других пользователей утилиты.
Все изменения в werf проходят полный цикл по каналам стабильности:
- Канал обновлений
alpha
может содержать новые возможности и быть нестабильным. Релизы выполняются с высокой периодичностью. - Канал обновлений
beta
предназначен для более детального тестирования новых возможностей. - Канал обновлений
ea
безопасно использовать в некритичных окружениях и при локальной разработке. - Канал обновлений
stable
считается безопасным и рекомендуемым для всех окружений. Мы гарантируем, что версия канала обновленийea
перейдет в канал обновленийstable
не ранее чем через неделю после внутреннего тестирования. - Канал обновлений
rock-solid
рекомендуется использовать в критичных окружениях с высоким SLA. Мы гарантируем, что версия из канала обновленийstable
перейдет в канал обновленийrock-solid
не ранее чем через 2 недели плотного тестирования.
Соответствие каналов и релизов описывается в файле multiwerf.json, а использование актуальной версии werf в рамках канала должно быть организовано с помощью утилиты multiwerf.
Каналы стабильности и частые релизы позволяют получать непрерывную обратную связь по новым изменениям, выполнять быстрый откат проблемных изменений, а также обеспечивать высокую степень стабильности и при этом приемлемую скорость разработки.
Note: Настоящее обещание относится к werf, начиная с версии 1.0, и не относится к предыдущим версиям или версиям dapp
werf использует семантическое версионирование. Это значит, что мажорные версии (1.0, 2.0) могут быть обратно не совместимыми между собой. В случае werf это означает, что обновление на следующую мажорную версию может потребовать полного передеплоя приложений, либо других ручных операций.
Минорные версии (1.1, 1.2, etc) могут добавлять новые "значительные" изменения, но без существенных проблем обратной совместимости в пределах мажорной версии. В случае werf это означает, что обновление на следующую минорную версию в большинстве случаев будет беспроблемным, но может потребоваться запуск предоставленных скриптов миграции.
Патч-версии (1.1.0, 1.1.1, 1.1.2) могут добавлять новые возможности, но без каких-либо проблем обратной совместимости в пределах минорной версии (1.1.x). В случае werf это означает, что обновление на следующий патч (следующую патч-версию) не должно вызывать проблем и требовать каких-либо ручных действий.
- Мы не гарантируем обратную совместимость между версиями:
- канала обновлений
alpha
, - канала обновлений
beta
, - канала обновлений
ea
.
- канала обновлений
- Мы гарантируем обратную совместимость между версиями:
- канала обновлений
stable
в пределах минорной версии (1.1.x), - канала обновлений
rock-solid
в пределах минорной версии (1.1.x).
- канала обновлений
Apache License 2.0, см. LICENSE.