werf
Облако и инфраструктураRUСклеивает в один воспроизводимый конвейер то, что обычно живёт в bash-обвязке: git, сборку образов, реестр, выкат в Kubernetes и вашу CI-систему. Одна команда собирает недостающие слои, публикует образы и раскатывает только изменившееся, дожидаясь фактической готовности. Заодно решает задачу, которую пайплайны обычно не решают вовсе, — чистку реестра образов.
Флант
автор
Go
язык
Apache-2.0
лицензия
★ 4719
GitHub звёзд
Установка
Скрипт делает больше, чем кажется: ставит клиент обновлений, подключает репозиторий подписей и дописывает автоактивацию в ваши файлы настроек оболочки. Флаг для CI всё это выключает — не трогает ни настройки оболочки, ни пути, ни группы. Ставить линию 3 не получится: релизы на GitHub есть, а в каналах доставки группы 3 нет ни одного канала.
Почему не пересобирается лишнее
Тег образа здесь — не номер сборки и не хеш коммита, а отпечаток содержимого: инструкций сборки и файлов контекста. Один и тот же контент в разных коммитах даёт один и тот же тег, а значит ни пересборки, ни повторного выката не происходит вовсе.
Кэш промежуточных слоёв лежит не на машине сборщика, а в самом реестре, поэтому он общий для всех исполнителей CI и не разъезжается между ветками. Параллельные сборки разводит встроенная синхронизация — слой публикует только одна из них.
Отдельное правило: конфигурация читается только из git. Это закрывает классическое «а тут я на раннере руками поправил» — повлиять на сборку чем-то вне репозитория нельзя.
Чистка реестра
Пайплайны копят теги годами, и вопрос «какие из сорока тысяч можно удалить» обычно остаётся без ответа. Здесь на него отвечают три правила: образ, который используется хоть одним объектом в подключённых кластерах, не удаляется никогда; свежесобранные живут заданное время; остальное чистится по истории git — сколько-то версий на последние теги и на самые активные ветки.
Важная оговорка из документации: удаляются теги, а место освобождает уже сборщик мусора самого реестра. И если доступа к кластерам нет, первое правило не работает — чистка перестаёт понимать, что используется.
Что нужно, чтобы начать
Для выката нужны кластер и репозиторий в реестре, а вот сборочная часть работает и без кластера — поэтому внедряют обычно поэтапно, начиная со сборки.
Демон Docker не обязателен: второй сборочный движок работает без демона и умеет непривилегированный режим. Он доступен на Linux и на Windows с подсистемой Linux; для macOS документация советует виртуальную машину.
Проект принят в CNCF Sandbox в декабре 2022 года, лицензия открытая, платных редакций нет. Любопытная деталь: ровно этот же код внутри консоли Deckhouse уже требует коммерческой лицензии платформы.
Частые вопросы
Нужен ли Kubernetes, чтобы начать пользоваться?
Для выката — да, кластер и репозиторий в реестре указаны в требованиях. Но сборка, экспорт и запуск работают без кластера, поэтому инструмент можно внедрять поэтапно, начав со сборки.
Обязателен ли Docker?
Нет. Сборочных движка два: системный демон Docker и встроенный, работающий без демона и с поддержкой непривилегированного режима. Второй доступен на Linux и на Windows с подсистемой Linux; для macOS документация рекомендует виртуальную машину.
Он заменяет Helm?
Он включает совместимый с Helm выкат и работает с обычными чартами и обычными релизами Helm, но покрывает и то, чего в Helm нет: сборку образов, теги по содержимому, общий кэш и чистку реестра. Сам движок выката — это Nelm.
Как он понимает, что пересобирать не нужно?
Тег образа — отпечаток содержимого: инструкций сборки и файлов контекста. Если содержимое не менялось, тег совпадает, и сборка с выкатом просто пропускаются. Кэш слоёв при этом лежит в реестре, то есть общий для всех исполнителей CI.
Какую версию ставить — вторую или третью?
Вторую. Релизы третьей линии на GitHub есть, но в каналах доставки группы 3 не существует ни одного канала, поэтому команда с третьей версией просто не отработает. Текущая стабильная — 2.75.3.