22 января 2016 года в werf был сделан первый коммит, а уже сегодня проекту исполняется 10 лет. В честь юбилея вспомним ключевые даты, события и достижения, похвастаемся отзывами пользователей и клиентов, а ещё поделимся полезными ссылками.

Но начнём с цифр, которых удалось достичь за эти десять лет:

werf: сайт + GitHub

  • 18 000+ активных проектов, использующих werf (5000+ проектов наших клиентов, 13 000+ пользователей в сообществе)

  • 4600+ звёзд на GitHub

  • 1300+ релизов

  • 6000+ закрытых pull requests

  • 15 000+ коммитов

  • 60+ контрибьюторов

Экосистема продуктов werf

  • Nelm — 1000+ ⭐, 45 релизов, 800+ коммитов

  • trdl (сайт) — 290+ ⭐, 45 релизов, 900+ коммитов

  • kubedog — 700+ ⭐, 38 релизов, 650+ коммитов

  • lockgate — 250+ ⭐, 2 релиза, 95+ коммитов

График роста количества звёзд по каждому проекту
График роста количества звёзд по каждому проекту

А теперь, если готовы углубиться, впереди подробный рассказ о ключевых событиях и достижениях, которые сформировали werf за десять лет. Главные точки — на таймлайне, а подробности и другие важные даты — в тексте:

v0 (22.01.2016 – 14.12.2018)

22.01.2016 — первый коммит

Проект стартовал под названием dapp и развивался как инструмент для эффективной сборки контейнерных образов в CI/CD-процессах. Изначальный фокус был на инкрементальности, при которой результаты предыдущих сборок переиспользуются.

Первая реализация была написана на Ruby, а конфигурация сборки всех образов описывалась в файле Dappfile, использующем императивный DSL на Ruby — по духу близкий к Vagrantfile:

dimg 'symfony-demo-app' do
  docker.from 'ubuntu:16.04'

  git do
    add '/' do
      to '/demo'
      stage_dependencies.before_setup 'composer.json', 'composer.lock'
    end
  end

  shell do
    before_install do
      run 'apt-get update',
          'apt-get install -y curl php7.0',
          # Пользователь phpapp.
          'groupadd -g 242 phpapp',
          'useradd -m  -d /home/phpapp -g 242 -u 242 phpapp'
    end
    install do
      run 'apt-get install -y php7.0-sqlite3 php7.0-xml php7.0-zip',
          # Установка composer.
          'curl -LsS https://getcomposer.org/download/1.4.1/composer.phar -o /usr/local/bin/composer',
          'chmod a+x /usr/local/bin/composer'
    end
    before_setup do
      # Исходным текстам нужно сменить права и запустить composer install.
      run 'chown phpapp:phpapp -R /demo && cd /demo',
          "su -c 'composer install' phpapp"
    end
    setup do
      # Используем текущую дату как версию приложения.
      run 'echo `date` > /demo/version.txt',
          'chown phpapp:phpapp /demo/version.txt'
    end
  end

  # Порт совпадает с портом, указанным в start.sh.
  docker.expose 8000
end

Ключевой особенностью стала stage-based модель сборки: каждая инструкция приводила к созданию отдельного Docker-образа (stage). Эта модель легла в основу оркестрации сборок и эффективного кеширования. Уже в первой версии поддерживалась сборка произвольного количества образов с общей конфигурацией и параллельным выполнением.

Руководство по сборке Docker-образов с помощью утилиты dapp

26.06.2016 — продвинутые инструменты отладки сборки

Довольно рано в проекте появились инструменты отладки сборки. Они позволяли интерактивно подключаться к контейнеру на любой стадии сборки — до выполнения инструкций, после них или в момент ошибки. Такой подход значительно упростил разработку и отладку сложных сценариев сборки и стал одной из отличительных черт dapp на тот момент.

Подробнее об инструментах отладки конфигураций dapp (werf)

29.07.2016 — поддержка Chef для описания сборочных инструкций

По мере роста сложности сборок стало очевидно, что описывать модульную логику на чистом shell неудобно. В ответ на это в dapp была добавлена поддержка Chef, который на тот момент широко использовался у нас в компании. Это позволило применять Chef-рецепты внутри процесса сборки образов, не оставляя в финальном образе следов Chef или cookbook’ов. Так появился мощный механизм модульности и переиспользования логики сборки.

dimg do
  docker.from 'ubuntu:16.04'

  git.add('/').to('/app')
  docker.workdir '/app'

  docker.cmd ['/bin/bash', '-lec', 'bundle exec ruby app.rb']
  docker.expose 4567

  chef do
    cookbook 'apt'
    cookbook 'rvm'

    recipe 'ruby'
    recipe 'bundle_gems'
    recipe 'app_config'
  end
end

08.11.2016 — «Собираем Docker-образы быстро и удобно» на конференции HighLoad++ 2016

Это был первый публичный анонс проекта. Доклад тогда посвятили требованиям к Docker-образам в CI/CD: частым сборкам на каждый коммит, управлению размером образов, эффективному использованию места в container registry и важности использования одного и того же образа на всех этапах доставки — от тестовых окружений до production. На этом фоне был представлен подход dapp: на конференции рассказали, почему для решения этих задач был создан собственный сборщик и какие архитектурные принципы легли в его основу.

Видео с выступления

Текстовая версия доклада

30.03.2017 — развёртывание в Kubernetes через системный Helm

В 2017 году в dapp появилось развёртывание в Kubernetes. Процесс был реализован через вызов системного Helm и предполагал наличие чарта по зарезервированному пути .helm. При этом dapp не ограничивался простым вызовом Helm: сборка и развёртывание начали связываться на уровне шаблонов за счёт специальных Helm-функций для работы с образами, а также был реализован базовый механизм отслеживания состояния ресурсов во время выката.

Как с помощью dapp (werf) и Helm развернуть Docker-образ приложения в локальном кластере Kubernetes

06.06.2017 — «Наш опыт с Kubernetes в небольших проектах» на конференции RootConf 2017

Доклад был посвящён практическому опыту использования Kubernetes в небольших проектах: как выстроить CI/CD-процесс, организовать сборку Docker-образов, работу с окружениями и развёртывание в кластер. На реальном примере показывалось, как Kubernetes и сопутствующие инструменты, включая dapp, встраиваются в повседневный процесс разработки и выката.

Видео с выступления

Текстовая версия доклада

07.11.2017 — «Лучшие практики CI/CD с Kubernetes и GitLab» на конференции HighLoad++ 2017

На примере реальных CI/CD-пайплайнов в Kubernetes и GitLab в докладе разбирались типовые проблемы доставки приложений. В этом контексте показывалось, какую роль играет dapp и как он помогает решать задачи инкрементальной сборки образов, тегирования и управления процессом развёртывания в Kubernetes.

Видео с выступления

Текстовая версия доклада

04.12.2017 — умная очистка container registry от неактуальных образов

С ростом числа сборок и тегов встал вопрос очистки container registry. В конце 2017 года в dapp появилась функция очистки container registry. Был реализован механизм очистки по различным политикам (по веткам, коммитам и тегам) с учётом фактического использования образов в Kubernetes (в последующих версиях умная очистка продолжала активно развиваться).

Хранение всех необходимых образов контейнеров
Хранение всех необходимых образов контейнеров

О том, какие вызовы стоят при очистке container registry, и подробнее про наш подход можно почитать здесь.

23.03.2018 — поддержка YAML-конфигурации и Ansible для описания сборочных инструкций (на смену Chef)

На этом этапе dapp эволюционировал в сторону более удобного и привычного для YAML-инженеров подхода: появилась поддержка YAML-формата. Переход от императивного Ruby-DSL к декларативному синтаксису сделал конфигурации более читаемыми, предсказуемыми и удобными для сопровождения, особенно в сложных проектах.

Параллельно произошёл отказ от Chef в пользу Ansible для описания сборочных инструкций. Chef оказался слишком тяжёлым и не оправдал первоначальных ожиданий, тогда как Ansible позволил сохранить модульность и декларативность, но с меньшим порогом входа и более прозрачным исполнением.

dimg: ~
from: alpine:latest
git:
- add: /
  to: /app
  owner: app
  group: app
  excludePaths:
  - public/assets
  - vendor
  - .helm
  stageDependencies:
    install:
    - package.json
    - Bowerfile
    - Gemfile.lock
    - "app/assets/*"
- url: https://github.com/kr/beanstalkd.git
  add: /
  to: /build
ansible:
  beforeInstall:
  - name: "Create non-root main application user"
    user:
      name: app
      comment: "Non-root main application user"
      uid: 7000
      shell: /bin/bash
      home: /app
  - name: "Disable docs and man files installation in dpkg"
    copy:
      content: |
        path-exclude=/usr/share/man/*
        path-exclude=/usr/share/doc/*
      dest: /etc/dpkg/dpkg.cfg.d/01_nodoc
  install:
  - name: "Precompile assets"
    shell: |
      set -e
      export RAILS_ENV=production
      source /etc/profile.d/rvm.sh
      cd /app
      bundle exec rake assets:precompile
    args:
      executable: /bin/bash

О переходе dapp на YAML и добавлении поддержки Ansible — смотрите статью «Дождались: поддержка YAML и Ansible (без коров) в dapp».

03.04.2018 — Linux-дистрибутив from scratch для сборки Docker-образов — наш опыт с dappdeps

Мы поделились деталями внутренней архитектуры сборки, уже сформированной к тому моменту. В публикации рассказывалось, как dapp отделяет сборочную среду от конечного Docker-образа и за счёт этого позволяет использовать Ansible, Chef и другие инструменты сборки независимо от базового образа, включая scratch.

Идея и реализация dappdeps — в этой публикации.

23.11.2018 — поддержка секретных значений и файлов для конфигурации развёртывания

В dapp появилась поддержка секретных значений и секретных файлов для конфигурации развёртывания. Это решало проблему безопасного хранения и использования чувствительных данных — токенов, ключей доступа, TLS-сертификатов и приватных ключей — без их размещения в открытом виде в Git (Helm-чартах). Секреты расшифровывались только на этапе деплоя и использовались в шаблонах и манифестах Kubernetes.

23.01.2018 – 14.12.2018 — бесшовная миграция с Ruby на Go

По мере роста проекта и расширения сценариев использования, а также на фоне запросов от пользователей стало ясно, что текущая реализация на Ruby начинает ограничивать дальнейшее р��звитие — была начата миграция на Go.

Переход выполнялся поэтапно и бесшовно для пользователей, что позволило не останавливать развитие продукта и сохранить его стабильность. В результате удалось снять накопившиеся ограничения и упростить интеграцию с экосистемой Kubernetes.

Подробнее о поэтапной миграции dapp с Ruby на Go — в статье о том, как мы переписали dapp на Golang, не останавливая разработку.

23.10.2018 — вынесение отслеживания при развёртывании в отдельный проект — kubedog

Логика отслеживания развёртывания (статусы, события и логи, а также управление ожиданием готовности ресурсов) была вынесена из dapp в отдельный продукт — kubedog.

Выделение kubedog в самостоятельную библиотеку позволило изолировать эту функциональность, переиспользовать её в других инструментах и развивать механизмы наблюдения независимо от основного продукта. В дальнейшем kubedog стал использоваться как внутри экосистемы werf, так и сообществом в других проектах.

Читайте подробности о библиотеке kubedog для слежения за ресурсами Kubernetes.

v1 (14.12.2018 – 06.03.2020)

14.01.2019 — новое название — werf

В этот момент проект получил новое имя — werf. Процесс выбора нового названия сделали максимально открытым: в обсуждении и голосовании участвовала вся компания, а также внешнее сообщество. Всего было предложено около 100 вариантов — от морской и пиратской тематики до более абстрактных и технических названий.

По итогам голосования сформировались три фаворита:

  • grog — 32 %;

  • flimb — 29,7 %;

  • werf — 27 %.

Несмотря на то, что werf не занял первое место по числу голосов, именно это название было выбрано командой. Оно лучше всего отражало суть проекта и ассоциировалось с местом сборки и создания — верфью, что органично легло в дальнейшее развитие бренда.

Представляем werf 1.0 stable: при чём тут GitOps, статус и планы

22.01.2019 — менеджер обновлений werf (multiwerf)

multiwerf реализовал наш подход к работе с версиями в рамках каналов обновлений. Он отвечал не только за автообновление werf, но и за изоляцию версии в рамках shell-сессии.

Команда $(multiwerf use 1.1 stable --as-file) автоматически обновляет werf в фоне в рамках заданного канала обновлений и «пинит» версию для текущей shell-сессии, позволяя без конфликтов использовать разные версии werf на одном хосте.

23.01.2019 — werf стал доступен на всех основных ОС

С этого момента werf начал тестироваться и распространяться для всех основных операционных систем (Linux, macOS, Windows).

18.04.2019 — начинаем использовать и развивать собственный форк Helm

Одним из архитектурных решений версии v1 стало встраивание Helm непосредственно в бинарник werf. Этот шаг позволил быстрее развивать функциональность и оперативно доносить ценность до пользователей, не дожидаясь изменений в upstream.

Helm client и Tiller выполнялись внутри одного процесса werf во время деплоя — без необходимости установки каких-либо компонентов в Kubernetes-кластер. Это решение обеспечивало полную совместимость с Helm 2, но при этом снимало большинство его эксплуатационных ограничений и повышало безопасность.

Подобная архитектура стала стандартной для Helm лишь позже — с выходом Helm 3 в ноябре 2019 года, когда Tiller был полностью удалён из проекта.

Вместо использования Helm как «чёрного ящика» с флагом --wait и внешней обвязки началась полноценная сквозная интеграция отслеживания ресурсов при выкате на базе kubedog — статусы, события, логи, мгновенное завершение проблемных выкатов.

27.05.2019 — «werf — наш инструмент для CI/CD в Kubernetes» на конференции DevOpsConf 2019

Доклад был посвящён практическому применению GitOps-подхода в CI/CD с Kubernetes и werf. На реальных сценариях разбиралось, как использовать Git в качестве единственного источника истины, организовать декларативное управление состоянием кластера и встроить werf в GitOps-workflow для более предсказуемого и управляемого развёртывания.

Видео с выступления

Текстовая версия доклада

15.08.2019 — реализация 3-way merge в рамках нашего форка Helm 2

Реализация 3-way merge в нашем форке Helm 2 позволила более корректно применять изменения к уже существующим ресурсам, учитывая их текущее состояние в кластере. Также для повышения надёжности werf ввёл блокировки параллельного деплоя одного и того же релиза. Это защищало от гонок и неконсистентных состояний, которые могли возникать при одновременных выкатах.

Эта функциональность появилась в werf до выхода Helm 3 и значительно повысила предсказуемость и безопасность обновлений наших пользователей.

Подробности про внедрение поддержки 3-way-merge-патчей в werf

23.08.2019 — первая 1000 звёзд на GitHub

Проект преодолел отметку в 1000 звёзд на GitHub, что стало заметным сигналом роста интереса и признания со стороны Open Source-сообщества.

21.09.2019 — добавлена поддержка Dockerfile

Добавлена поддержка Dockerfile, что стало важным шагом навстречу пользователям и упростило миграцию. werf научился работать как с собственным синтаксисом Stapel, так и с классическими Dockerfile.

Собирать Docker-образы в werf теперь можно и по обычному Dockerfile

13.12.2019 — вынесение распределённых блокировок в отдельный проект

Из werf была вынесена Go-библиотека, предназначенная для реализации распределённых блокировок — lockgate. Она поддерживает как локальные файловые блокировки, так и распределённые механизмы на базе Kubernetes или HTTP-сервера блокировок, что позволяет использовать её в самых разных инфраструктурных сценариях.

Библиотека нашла отклик в сообществе, получила внешние контрибуции и стала использоваться в сторонних проектах (более 250 ⭐ на GitHub), подтвердив свою универсальность за пределами werf.

v1.1 (06.03.2020 – 05.11.2020)

#03.03.2020 — content-based-тегирование

Появилась поддержка content-based-тегов. Это заложило основу для последующего отказа от контекстных стратегий тегирования (ветки, коммиты, CI) и перехода к единому подходу в работе с образами — на уровне конфигурации, очистки и хранения — и к более эффективному использованию container registry.

Релиз werf 1.1: улучшения в сборщике сегодня и планы на будущее

Content-based tagging в сборщике werf: зачем и как это работает?

24.04.2020 — распределённое хранилище слоёв на базе container registry

С этого момента werf взял на себя ответственность за синхронизацию работы параллельных сборщиков, использующих один и тот же container registry. Механизм был построен по аналогии с тем, как Docker работает с локальным хранилищем: при сохранении, подборе и обеспечении иммутабельности слоёв.

Разница заключалась в масштабе: если Docker синхронизирует процессы, работающие с локальным хранилищем на одном хосте, то werf реализовал тот ж�� принцип распределённо, обеспечивая корректную работу нескольких сборщиков, параллельно взаимодействующих с одним container registry.

Организация распределённого CI/CD с помощью werf

20.05.2020 — «Introduction to werf: Another view on GitOps» на онлайн-конференции GitOps Days 2020

В докладе werf рассматривался как практический инструмент доставки в Kubernetes с собственным взглядом на GitOps: связка сборки и развёртывания, контроль состояния ресурсов, воспроизводимость выката и ориентация на реальные эксплуатационные сценарии — ещё до того, как термин GitOps окончательно устоялся.

Видео с выступлением

v1.2 (05.11.2020 – 24.04.2024)

15.12.2020 — добавлена поддержка бандлов

Появляется поддержка бандлов — способа дистрибуции Helm-чарта и связанных с ним контейнерных образов как единого артефакта. Бандл упаковывает всё необходимое для развёртывания приложения и может распространяться и использоваться независимо от исходного Git-репозитория.

Опубликованный бандл можно развёртывать с помощью werf или любых инструментов, поддерживающих Helm-чарты из OCI-репозиториев (Helm, Argo CD, Flux и др.). Его можно копировать между container registry, экспортировать в tar-архив, передавать офлайн и использовать в air-gapped-окружениях. При упаковке werf автоматически добавляет в чарт информацию об образах и их тегах, переданные значения, а также глобальные аннотации и лейблы, обеспечивая воспроизводимое и автономное развёртывание — всё как обычно для пользователей werf, но уже без привязки к Git-репозиторию проекта.

werf v1.2 — стабильный релиз Open Source-утилиты для доставки приложений в Kubernetes

#05.04.2021 — безопасный менеджер обновлений на смену multiwerf (trdl)

На смену multiwerf пришёл trdl (true delivery) — менеджер обновлений, ориентированный на безопасную доставку бинарников от Git-репозитория до хоста пользователя. trdl был спроектирован как защищённый канал обновлений, который устраняет целый класс рисков, связанных с подменой, компрометацией или неконтролируемым распространением артефактов.

Безопасность trdl основана на связке Git, TUF-репозитория и HashiCorp Vault. Такая архитектура позволяет предотвращать атаки на цепочку поставки, проверять целостность и подлинность обновлений и минимизировать потенциальный ущерб даже в случае компрометации отдельных компонентов.

trdl не ограничивается werf и может применяться для безопасного выпуска и распространения произвольного ПО. CLI поддерживает широкий набор сценариев, но ключевой подход обновления и использования, знакомый по multiwerf, был полностью унаследован:

. "$(trdl use werf 1.2 stable)"

Команда обновляет, верифицирует и активирует нужную версию werf в рамках текущей shell-сессии, позволяя безопасно использовать разные версии на одном хосте без конфликтов.

Подробнее о системе безопасной доставки ПО — в статье про trdl.

22.12.2021 — представляем онлайн-самоучитель по Kubernetes и деплою с werf для разработчиков

Запустили онлайн-самоучитель, ориентированный на разработчиков и DevOps-инженеров, которые хотят освоить Kubernetes и практическую доставку приложений с помощью werf. Материалы совмещают теорию и пошаговые практические руководства — от базовых концепций до более продвинутых сценариев CI/CD.

Самоучитель учитывает специфику популярных языков и фреймворков, включает примеры приложений и инфраструктуры (IaC) и позволяет выбрать технологический стек, наиболее близкий пользователю, для изучения Kubernetes и работы с werf на реальных примерах.

О запуске онлайн-самоучителя по Kubernetes и деплою с werf для разработчиков писали здесь.

07.02.2022 — безопасная сборка без привилегированного демона

В werf появилась экспериментальная поддержка Buildah, позволившая выполнять безопасную сборку образов в rootless-режиме без использования Docker-демона, а также сохранить привычный сценарий сборки через Docker там, где это необходимо.

Одновременно в релизном процессе werf появились готовые к использованию образы для запуска сборок как с Docker, так и непосредственно внутри Kubernetes-кластера. Это упростило интеграцию werf в различные CI/CD-окружения и расширило варианты его использования.

Запуск werf в GitLab CI/CD без Docker-сервера

05.08.2022 — появилась телеметрия

В werf была добавлена телеметрия, позволяющая анализировать использование инструмента. Она охватывает версии и каналы обновлений, активность проектов, окружения выполнения, использование CLI-команд и характеристики сборок.

Телеметрия стала основой для лучшего понимания того, как werf используется на практике: оценки стабильности версий и выявления узких мест в процессах доставки.

13.12.2022 — werf стал проектом CNCF

Проект werf был принят в CNCF (Cloud Native Computing Foundation), что означает его признание и поддержку в экосистеме облачно-нативных технологий. Это подтверждает зрелость проекта, его открытость и готовность к широкому использованию в сообществе, а также способствует ещё более активному участию сообщества в развитии werf и интеграции с другими CNCF-инструментами.

Читайте о том, что означает для werf вступление в CNCF и какие у команды были планы на старте этого этапа.

19.03.2023 — «Better CI/CD experience in Kubernetes with werf. Practical cases» на конференции KCD Czech & Slovak 2023

На конференции KCD Czech & Slovak 2023 был представлен доклад «Better CI/CD experience in Kubernetes with werf. Practical cases». В нём werf был показан как Open Source-инструмент (к тому моменту уже проект CNCF), объединяющий Git, контейнеры и Kubernetes для построения эффективной и консистентной доставки.

Доклад посвятили практическим кейсам использования werf в CI/CD: типичным проблемам современной доставки в Kubernetes, наблюдениям из реального опыта внедрения в разных организациях и тому, как существующие Open Source-инструменты и лучшие практики помогают Ops-командам решать эти задачи на практике.

Видео с выступления

19.04.2023 — участие проекта в KubeCon Europe 2023

Проект werf впервые представлен на главной конференции мирового Cloud Native-сообщества — KubeCon + CloudNativeCon Europe 2023. По любым вопросам об использовании werf можно было проконсультироваться на протяжении трёх дней у его киоска в павильоне CNCF Project Pavilion.

18.05.2023 — отказ от форка Helm и начало разработки Nelm

С первым коммитом Nelm начался новый этап развития механизма развёртывания в werf. К э��ому моменту стало очевидно, что дальнейшее развитие собственного форка Helm ограничено архитектурой самого Helm, поэтому было принято решение отказаться от форка и переписать подсистему развёртывания заново, сохранив при этом обратную совместимость.

28.07.2023 — первая онлайн-встреча с сообществом

Состоялась первая публичная онлайн-встреча с сообществом в формате живого обсуждения и Q&A. На встрече команда рассказала о текущем состоянии проекта, планах развития и ответила на вопросы.

Запись онлайн-встречи

05.03.2024 — «От доработки Helm к разработке Nelm: эволюция развёртывания в werf» на конференции DevOpsConf 2024

На конференции DevOpsConf 2024 был представлен доклад «От доработки Helm к разработке Nelm: эволюция развёртывания в werf». В нём был разобран практический путь, который привёл команду werf от расширения и форка Helm к созданию Nelm — обратно совместимой альтернативы Helm, разработанной с учётом реальных требований к инструменту развёртывания.

В докладе были показаны ключевые улучшения Nelm по сравнению с Helm: отображение плана изменений перед деплоем, более корректное и управляемое обновление ресурсов, продвинутое отслеживание готовности (включая CRD), наглядный вывод статусов, логов и событий, а также устранение классов проблем, приводящих к некорректным обновлениям. Отдельно затронули долгосрочные планы развития и ближайшие направления эволюции механизма развёртывания в werf.

Видео с выступления

20.03.2024 — участие проекта в KubeCon Europe 2024

Киоск с werf снова был представлен в CNCF Project Pavilion на европейской конференции KubeCon + CloudNativeCon 2024, что проходила в Париже. В этот раз с сообществом встречался Максим Набоких, который не без причин считает себя амбассадором werf.

v2 (24.04.2024 — …)

Вышла werf 2.0: новый движок развёртывания Nelm и 300+ релизов за четыре года

25.02.2025 — You Choose show by two CNCF Ambassadors

werf принял участие в выпуске You Choose! (Ch. 05, Ep. 05), посвящённом теме Specialized Templating, вместе с довольно разнородным набором инструментов (Porter, Radius, Score, PipeCD). Формат был необычный, а продукты — неочевидно сопоставимые, но за отведённые 5 минут удалось рассказать про werf и поучаствовать в дискуссии о подходах к доставке приложений на такой интересной площадке.

Запись выпуска

13.03.2025 — «werf and its ecosystem: efficient software delivery in Kubernetes and beyond» на FOSSASIA Summit 2025

На конференции FOSSASIA Summit 2025 (Bangkok, Thailand) коллега из Palark представил доклад «werf and its ecosystem: efficient software delivery in Kubernetes and beyond». В нём werf был показан как CNCF Sandbox-проект, реализующий эффективный и консистентный CI/CD в Kubernetes на базе Open Source-технологий.

Доклад охватывал эволюцию werf за почти девять лет: от CLI-инструмента для сборки и деплоя контейнеров до полноценной экосистемы, включающей обучающие материалы по Kubernetes, инструменты для безопасной дистрибуции ПО (trdl), библиотеку для отслеживания Kubernetes-ресурсов (kubedog) и собственную альтернативу Helm — Nelm.

Видео с выступления

20.03.2025 — релиз Nelm 1.0

Состоялся релиз Nelm 1.0 — стабильной версии обратно совместимой с Helm-чартами альтернативы Helm 3. Nelm поставляется как самостоятельный CLI-инструмент, а также как библиотека для встраивания в другие решения.

Рассмотрели преимущества Nelm по сравнению с Helm 3

27.11.2025 — сравнение Nelm и Helm 4

Рассказали, как Nelm продолжает развиваться даже после релиза Helm 4, оставаясь альтернативой с более широкими возможностями и своей аудиторией.

Nelm vs Helm 4: что изменилось с новым релизом Helm и почему Nelm всё ещё лучше

22.01.2026 — 10 лет werf

Проекту werf исполнилось 10 лет. За это время он прошёл путь от эксперимента со инкрементальной сборкой Docker-образов до зрелой Open Source-экосистемы для доставки приложений в Kubernetes, включающей собственные решения сборки, развёртывания и дистрибуции, а также ряд других самостоятельных проектов.

Наши планы

И на этом наша работа не заканчивается, ведь у нас грандиозные планы:

  • Новая архитектура сборки на базе глубокой интеграции с BuildKit.

  • Безопасность цепочки поставки: подпись и верификация, SBOM, работа с уязвимостями.

  • Nelm-оператор для интеграции с Argo CD, Flux и самостоятельного использования (Issues #494).

  • Патчинг ресурсов Helm-чарта (Issues #115).

  • Альтернатива (не замена!) Helm-шаблонам — эксперимент с TypeScript уже вот-вот можно будет попробовать (PR # 502, Issues #54).

  • …и многое другое.

Слова благодарности от компаний и сообщества

За 10 лет werf вошёл в повседневную практику сотен команд. Среди пользователей есть такие компании, как «Альфа-Лизинг», Lenta-online, «Цифровая Лаборатория», Adapty, «Оператор Газпром ИД», MCN Telecom, AYA Group и другие.

А ниже — приятные слова от компаний и участников сообщества, которые делятся своим опытом, пользой и даже идеями для будущего развития проекта.

Евгений Агеев, СТО из ООО «Премиум Бонус»

Мы используем werf с 2019 года и применяем его во всех проектах для сборки и деплоя приложений. Нам нравится простота конфигурации, удобное хран��ние секретов, подход «всё в одном» и то, что для деплоя не требуются сложные CI/CD-пайплайны — достаточно нескольких понятных команд.

К юбилею проекта хотим поблагодарить компанию «Флант» и команду werf за зрелый и надёжный инструмент, который действительно упрощает работу с продакшеном!

Тимур Попов, CTO из xRocket

С werf я знаком около 5 лет, и за это время он стал моим фаворитом. В xRocket мы используем его примерно 1,5 года, с перехода на Deckhouse. Для бизнеса, и особенно для стартапа, это отличный выбор: один инструмент закрывает сборку и деплой в Kubernetes и избавляет от зоопарка скриптов и утилит.

К юбилею желаю проекту развиваться, сохраняя простоту и стабильность.

Aliaksandr Padrabinkin, Lead DevOps из Godel Technologies Europe

werf используем около 2–3 лет. werf v2 — основной инструмент CI/CD на нашей платформе, работающей на Azure с 6 окружениями. Мы используем его для управления более чем 30 репозиториями в рамках multi-tenant-архитектуры с множеством Kubernetes namespace'ов, а также для сборки Docker-образов (werf build) — все сервисы платформы (.NET 8/10, Node.js 20/22). Благодаря шаблонам один и тот же процесс работает для разных технологий. А ещё с его помощью деплоим в Kubernetes (werf converge) — все 6 окружений нашей платформы.

Ключевые факторы выбора werf:

  • GitOps и Giterminism — строгий подход, когда вся конфигурация деплоя живёт в Git. Для нашей multi-tenant-платформы с множеством namespace'ов важно, чтобы любое изменение было отслеживаемым и воспроизводимым для соответствия требованиям SOX-аудита.

  • Интеграция с Helm — Nelm позволяет использовать Helm-чарты без лишних обёрток, с нативным release management. Мы поддерживаем несколько технологий (.NET 8/10 и Node.js 20/22) через единую систему шаблонов, что значительно упрощает поддержку разнородного стека.

  • Идемпотентный converge — приводит кластер к состоянию Git, что критично для multi-tenant-платформы с десятками namespace'ов. Без этого управление состоянием десятков окружений было бы кошмаром.

  • Умное кеширование и инкрементальные сборки — Stapel builder экономит время на CI, особенно при частых коммитах. Это особенно важно при работе с более чем 30 репозиториями — без эффективного кеширования сборки занимали бы часы.

  • Встроенный cleanup — автоматическое управление retention в Container Registry с гибкими политиками. Интеграция с Azure Container Registry (ACR) и Azure DevOps Pipelines делает это полностью автоматизированным процессом.

  • Централизованная конфигурация — использование AppConfig submodule позволяет нам поддерживать единую конфигурационную базу для всех сервисов, при этом обеспечивая гибкость на уровне отдельных репозиториев.

Что ещё нравится в werf:

  • Content-based tagging — образы тегируются по content hash, что исключает проблемы с «грязными» тегами и обеспечивает точную идентификацию образов. Это критично для отслеживания, какая версия кода реально развёрнута в production.

  • Автоматическая генерация образов — через Go-шаблоны генерируются все необходимые образы. Так разработчикам не нужно писать и поддерживать Dockerfile'ы — всё автоматизировано.

  • Stapel builder — multi-stage builds с агрессивным кешированием значительно ускоряют сборки. Это экономит огромное количество времени на CI, особенно когда мы собираем множество сервисов параллельно.

  • Единый инструмент — build, deploy, cleanup в одной утилите без зоопарка скриптов. Не нужно поддерживать отдельные скрипты для сборки, деплоя и очистки — всё работает из коробки.

  • Прозрачность — понятные логи. Когда что-то идёт не так, легко понять, на каком этапе и почему.

  • Активная поддержка — быстрые реакции команды в чатах, учёт пожеланий пользователей. Это важно, когда работаешь с инструментом в production на таком масштабе.

Спасибо команде разработки за супербыстрые реакции и помощь в чатах поддержки! Отдельное спасибо за то, что слышите пользователей и учитываете наши пожелания.

Пожелание на будущее: хотелось бы видеть более гибкие возможности отслеживания состояния ресурсов через аннотации — это упростило бы интеграцию с мониторингом и кастомными контроллерами.

Илья Дяковецкий, технический директор в «Иксора»

Мы в компании «Иксора» используем werf более трёх лет, и для нас его ценность заключается не столько в самой утилите, сколько в инженерной идеологии команды «Фланта», которая за ней стоит. Werf стал логичным продолжением и популяризацией фундаментальных принципов работы с Kubernetes: декларативности, конвергентности, идемпотентности, детерминированности и других процессов деплоя.

Благодаря этому подходу CI/CD перестаёт быть набором хрупких скриптов и превращается в воспроизводимую, предсказуемую систему, понятную как инженерам, так и бизнесу. В нашей практике werf позволил унифицировать процессы деплоя, значительно снизить операционную сложность и высвободить время DevOps-специалистов для более ценных задач.

Хочется поблагодарить команду «Фланта» за последовательное продвижение правильных инженерных идей в Kubernetes-сообществе и пожелать проекту дальнейшего развития, роста сообщества и сохранения этого фокуса на качестве, прозрачности и инженерной культуре.

Максим Базуев, мобильный разработчик

Я использовал werf, когда выкатывал свои проекты. Почему выбрал именно его? Потому что он легко интегрируется, быстро настраивается и сразу работает так, как мне нужно. Для меня это сразу несколько инструментов в одном.

Он собирает образы, деплоит их и показывает, что происходит с подами — запустились ли они или возникла ошибка: с секретами, с чем-то ещё. В этом плане он мне очень нравится — состояние видно прямо в реальном времени. С Helm’ом же запустил — и всё: непонятно, работает оно или нет.

Марк Барзали, Software Engineer

Пользуюсь werf примерно с 2022 года. Решение использовать именно его пришло из-за all-in-one-подхода: минимальная настройка CI, отличная система кеширования и работы с тегами. Больше всего в werf нравятся поддержка GitOps-подхода и декларативность конфигурации — это идеально закрывает мои задачи по деплою.

Алексей Махонин, DevOps

Утилитой пользуюсь для своих личных проектов, а также там, где есть возможность её применения на работе. После выхода второй версии — просто огонь, полный контроль и понимание, что происходит при деплое (спасибо werf plan). Плюс server-side apply решает большое количество проблем, связанных с ручными изменениями в кластере и three-way merge.

Вместо заключения

От всей души благодарим всех, кто был с нами эти 10 лет: пользователей, контрибьюторов, коллег из сообщества и наших клиентов. Без ваших вопросов, баг-репортов, пул-реквестов, кейсов, отзывов и просто веры в проект werf не стал бы тем, чем он есть сегодня. Спасибо, что выбираете нас — и продолжайте двигаться вперёд вместе с нами!

Если вы ещё не с нами, то вступайте в сообщество werf в Telegram:

Также свои предложения и вопросы можете приносить в GitHub и Slack проекта. А в блоге можно почитать все публикации про werf.