Четыре года мы развивали и улучшали werf 1.2, но теперь наконец‑то выпустили стабильную werf 2.0. Причина простая — последовательно накопилось множество улучшений (300+ релизов!), а кроме того, мы доработали новый движок развёртывания Nelm, и в werf 2.0 это единственный движок. Старый движок удалён. Nelm обратно совместим с Helm 3, поэтому никаких особых изменений в чартах не потребуется — они будут развёртываться так же, как и раньше.
В некоторых случаях у Nelm отличается поведение: например, у него более строгая валидация чартов, поэтому, хотя Nelm и доступен в werf 1.2, по умолчанию мы его включили только в werf 2.0.
Если вам непонятно, что это за werf такая, скорее открывайте спойлер :)
werf — это Open Source‑утилита для организации CI/CD, начиная со сборки образов контейнеров и заканчивая их развёртыванием в Kubernetes. Для сборки и развёртывания с werf достаточно иметь Git‑репозиторий, в котором будут Helm‑чарт, простенький файл werf.yaml и Dockerfile.
Имея такой Git‑репозиторий на руках, запускайте команду werf converge, она соберёт образы, опубликует их в container registry и развернёт Helm‑чарт в ваш Kubernetes‑кластер. Для организации непрерывной доставки с werf вы можете использовать любимую CI‑систему — например, есть готовые интеграции для GitLab CI/CD и GitHub Actions.
Чтобы это стало возможным, werf использует известные технологии, такие как Docker и Helm (или теперь уже Nelm) для реализации важных функций. Но werf намного больше, чем просто обёртка. Например, для сборки у нас есть собственный сборщик на основе Buildah от Red Hat. Если сравнивать с обычным Docker, то в werf доступны такие дополнительные фичи, как распределённое кэширование «из коробки», автоматическое тегирование на основе содержимого образов, умная очистка container registry на основе специальных Git‑политик и ещё ряд других полезностей.
Приятное дополнение: werf — это проект CNCF Sandbox, пару лет назад мы передали права на неё в CNCF, чтобы гарантировать пользователям, что утилита всегда будет Open Source и бесплатной. За последний месяц мы насчитали 10 000 активных проектов, использующих werf (обычно один werf‑проект — это один Git‑репозиторий). У нас почти 4000 звезд на GitHub и 8 лет весьма активной разработки.
Когда‑то в 2018 году мы сделали «для себя» внутренний инструмент dapp. Потом он превратился в werf, а werf в свою очередь уже попала в CNCF Sandbox, выросла и окрепла.
Что такое Nelm и какое будущее его ждет
Nelm — это фактически наша частичная реимплементация Helm 4, которого мы, к сожалению, так и не дождались. Сначала мы пытались заносить изменения в апстрим Helm, но его разработка сильно замедлилась, PR»ы и коммиты годами висели без ответов, а баги и отсутствующая функциональность мешали развивать werf так, как нам хотелось.
Сам по себе Helm — это два основных компонента: подсистема работы с чартами и подсистема развёртывания ресурсов. Подсистему развёртывания мы, по сути, и переписали с нуля — но с сохранением обратной совместимости. Подсистему работы с чартами мы тоже доработали и продолжаем дорабатывать. При этом возможность деплоить с werf Helm‑чарты без изменений в них остаётся нашей стратегической задачей и с переходом на Nelm в качестве движка развертывания.
Прямо сейчас Nelm можно попробовать только в составе werf. В будущем же он станет отдельной утилитой с удобным API и возможностью интеграции в другие решения для CI/CD. Но звёздочки на GitHub ему можно ставить уже сегодня.
Вот что Nelm привносит в werf:
3-Way Merge заменён на Server‑Side Apply, который является гораздо более надёжным механизмом обновления ресурсов в кластере.
Команда werf plan покажет изменения, которые произойдут в кластере во время следующего развёртывания.
Эффективно распараллелены операции над ресурсами (включая отслеживание) при развёртывании.
Доработано развёртывание CRDs.
Значительно улучшено и переработано отслеживание ресурсов.
Исправлены многочисленные баги и проблемы Helm, связанные с развёртыванием, вроде этого.
В процессе доработки находятся ещё несколько фичей, например возможность задавать прямые зависимости между ресурсами вместо использования хуков, весов и init‑контейнеров и использование обычными ресурсами всех специальных возможностей хуков, вроде helm.sh/hook: pre-install
или helm.sh/hook: before-hook-creation, hook-succeeded
. Как только отшлифуем, анонсируем их отдельно.
Подробнее про Nelm можно будет почитать в нашей статье для Хабра, посвящённой нашему новому движку развёртывания. Она уже готовится и скоро будет опубликована. Следите за анонсами в Telegram‑канале werf.
А еще 23 мая Илья Лесиков, один из основных мейнтейнеров werf проведет в CNCF вебинар про Nelm. Зарегистрироваться можно на сайте CNCF.
Что такое werf 2.0 и как ее попробовать
werf 2.0 практически полностью совместима с werf 1.2, а список обратно несовместимых изменений (он совсем крошечный) можно посмотреть в нашей доке. Мы рекомендуем переходить на версию 2.0 как можно скорее — причём эта миграция пройдёт куда проще, чем с 1.1 на 1.2. При этом werf 1.2 переходит в режим обслуживания.
Ещё одно большое изменение касается нумерации версий — с werf 2.0 мы будем следовать семантическому версионированию и планируем выпускать мажорную версию примерно раз в год. Это позволит упростить и ускорить разработку, не рискуя обратной совместимостью в минорных или патч‑версиях. Взамен обещаем более тщательно следить за обратной совместимостью в минорных и патч‑обновлениях.
Попробовать werf 2.0:
source $(trdl use werf 2 stable)
Напоминаем, что у нас есть несколько каналов обновлений:
Alpha. Быстро доставляет новые возможности, однако может быть нестабильным.
Beta. Для более широкого тестирования новых возможностей с целью обнаружения проблем.
Early‑Access. Достаточно безопасен для использования в некритичных окружениях и для локальной разработки, позволяет раньше получать новые возможности.
Stable. Безопасен и рекомендуется для широкого использования в любых окружениях как вариант по умолчанию.
Rock‑Solid. Наиболее стабильный канал, рекомендован для критичных окружений со строгими требованиями SLA.
Долгий путь от werf 1.2 к werf 2.0
А теперь вернёмся к тем самым «300+ релизам», упомянутым выше, — в werf за последние годы действительно накопилось немало новых фичей и изменений. Перечислим самые важные (здесь будут только фичи самой werf, то, что принёс Nelm, мы в список не включали):
Сборка Dockerfile»ов в werf с использованием Buildah под Linux, Windows и macOS.
Послойное кэширование в registry для Dockerfile.
Поддержка сборки образов под произвольные платформы и сразу под множество платформ из коробки.
Режим разработки (
--dev)
, который позволяет не думать о гитерминизме и промежуточных коммитах при отладке и разработке.Новая директива для образов dependencies в
werf.yaml
(начиная с версии 1.2.60).Команда
werf bundle render
, которая рендерит манифесты бандла для их дальнейшего деплоя другим ПО или отладки.Команда
werf kube-run
— как werf run, но вместо локального контейнера запускает под в K8s‑кластере.Отслеживание статуса и сбор событий для всех типов ресурсов, а не только Deployment/STS/DS/Job.
Возможность перед выкатом ресурса релиза дождаться готовности внешнего (вне релиза) Kubernetes‑ресурса.
Переход на новый менеджер обновлений trdl (тоже наша разработка и тоже Open Source).
Официальные ресурсы werf
Велкам: ставьте звёзды, приносите issue и коммиты!
Читайте также в нашем блоге
werf v1.2 — стабильный релиз Open Source‑утилиты для доставки приложений в Kubernetes
В сообществе пользователей утилиты для сборки и деплоя werf — уже 1000 участников
8 лет werf — утилите для построения CI/CD с любой CI‑системой: главные события и полезные материалы
Полезные ссылки для работы с werf
Первые шаги с werf: собираем и деплоим простое приложение в Kubernetes
Автоматизируем сборку и деплой приложения в GitLab CI/CD: подробное руководство с примерами
Гайды по Kubernetes с werf на разных фреймворках и языках программирования (Go, Node.js, Spring, Rails, Laravel, Django)
Разворачиваем приложение в кластере Kubernetes под управлением Deckhouse c помощью werf
Задаём порядок деплоя ресурсов в Kubernetes с помощью werf/Helm
Запуск одноразовых задач и отладка образов прямо в Kubernetes‑кластере с помощью werf