semver-теги и релизный процесс
Что нужно знать перед уроком
- M9.02 — pkglint глубоко — нужен чистый пакет, прошедший проверку линтера, перед выпуском релиза
- M8.03 — Content-based тегирование и алиасы — нужно понимание связи семверных версий с content-based тегами Werf
Что нужно знать перед уроком
M9 урок 2 — чистая проверка pkglint. M8 урок 3 — связь семверных версий и content-based тегов. Этот урок описывает полный релизный процесс от git-тега до опубликованной версии Application-пакета.
Теория
От git-тега к d8 package build --version
Стандартный релизный процесс Application-пакета начинается с создания git-тега, соответствующего семверу:
| |
CI-пайплайн (M9 урок 6), реагируя на пуш тега, извлекает версию из имени тега и передаёт её в d8 package build --version:
| |
Это прямая связь с полем version в package.yaml, разобранным в M5 уроке 2 — значение инжектится CI из тега, а не прописывается вручную разработчиком в файле (что исключило бы рассинхронизацию между тегом в git и версией в манифесте).
Семантика семвера применительно к Application-пакетам
- MAJOR (
v2.0.0) — несовместимые измененияconfig-values.yaml(пользователь должен явно проверить и обновить свои настройки при переходе), изменения, требующие ручного вмешательства (например, изменение имени PVC, требующее миграции данных). - MINOR (
v1.3.0) — новая функциональность, обратно совместимая с существующими настройками (новые опциональные поляconfig-values.yaml). - PATCH (
v1.2.1) — исправления багов, не меняющие контракт настроек.
Ручной production-релиз как осознанный gate
В отличие от dev/staging окружений, где публикация может быть полностью автоматической при пуше в ветку, production-релиз Application-пакета обычно требует ручного подтверждения в CI (when: manual в GitLab CI, разбираемый подробно в M9 уроке 6) — осознанное решение человека о том, что именно эта версия готова для пользователей каталога, а не автоматическое следствие пуша тега.
Откат версии (rollback)
Если опубликованная версия оказалась проблемной, откат осуществляется изменением поля spec.packageVersion объекта Application на предыдущую, стабильную версию (детально разобрано в M5 уроке 10 — процесс отражается в условии UpdateInstalled). Важное отличие от «удаления» проблемной версии из registry: сама опубликованная версия обычно не удаляется из каталога (это сломало бы возможность отследить историю и, если понадобится, повторно откатиться на неё later) — откат означает переключение конкретных инстансов Application на другую, уже существующую версию, а не физическое уничтожение проблемного релиза.
Частые ошибки и подводные камни
- Прописывать версию вручную в
package.yamlвместо инжекции из CI. Это создаёт риск рассинхронизации между git-тегом и фактической версией в манифесте — стандартная практика требует, чтобы версия всегда бралась из тега автоматически. - Автоматизировать production-релиз без ручного gate. Даже при полностью зелёном CI (пройденные тесты, чистый
pkglint), production-публикация Application-пакета, доступного конечным пользователям каталога, требует человеческого подтверждения как последней линии защиты от случайных ошибок автоматизации. - Физически удалять проблемную опубликованную версию из registry вместо отката через
Application.spec. Удаление версии, на которую всё ещё могут ссылаться существующие инстансы Application, ломает возможность отслеживания истории и потенциального повторного использования этой версии.
Практика в кластере
| |
Смоделируйте откат версии, изменив spec.packageVersion объекта Application на предыдущую опубликованную версию, и проследите за появлением условия UpdateInstalled в статусе.
Практика разработки
Создайте git-тег v0.1.0 для пакета Umami, соберите его через d8 package build --version с версией, извлечённой из тега, и убедитесь, что итоговая опубликованная версия отражена в package.yaml/registry корректно.
Шпаргалка команд урока
| |
Полная таблица команд d8 package —
📋 d8
.
Вопросы для самопроверки
Ручное прописывание версии создаёт риск расхождения между тегом и манифестом.
Это стандартная практика для публикации, доступной конечным пользователям каталога.
Источник: Рекомендуемая литература
Удаление сломало бы возможность отслеживания истории и повторного использования версии.
Источник: Рекомендуемая литература
Несовместимые изменения контракта настроек — классический пример MAJOR-версии.
Источник: Рекомендуемая литература
Рекомендуемая литература
Официальная документация
Статьи и блоги
- Готовим Gitea со вкусом werf CI/CD в кластере Deckhouse. Часть 3 — Flant на Habr.
- GitLab + K8s + Werf — Habr.
- Разворачиваем приложение в кластере Kubernetes под управлением Deckhouse c помощью werf — Flant на Habr.
Книги
- Gene Kim, Jez Humble, Patrick Debois, John Willis. The DevOps Handbook. 2nd ed., 2021. ISBN 978-1942788003.
Связанные материалы
- Предыдущий урок: M9.04 — dmtlint: практика анализа существующего Module.
- Следующий урок: M9.06 — Полный .gitlab-ci.yml.
✓ Урок пройден — все вопросы самопроверки отвечены верно