Обновление из шаблона переносит изменения новой версии шаблона в репозиторий микросервиса, созданного из этого шаблона. Портал отрисовывает новую версию пакета со значениями параметров микросервиса, применяет изменения по стратегии обновления в отдельной ветке и открывает запрос на слияние. Изменения попадают в основную ветку после того, как владелец микросервиса примет запрос на слияние.
Перед началом работы
Для обновления из шаблона выполните следующие условия:
- подключён и синхронизирован реестр шаблонов;
- в правилах маппинга главной для шаблона привязан процесс действия «Обновить микросервис из шаблона»: «Микросервисы» → «Действия по шаблонам». Набор данных «Реестр шаблонов микросервисов» создаёт процесс «Обновить микросервис из шаблона», который можно привязать к любому шаблону;
- микросервис создан из шаблона: в репозитории есть lock-файл
.ddp/template.lock.yaml, а у сущности микросервиса заполнены параметры привязки к шаблону.
Привязка микросервиса к шаблону
При создании микросервиса из шаблона портал записывает сведения о шаблоне в репозиторий и в каталог.
В репозиторий записывается lock-файл .ddp/template.lock.yaml:
templateId: go-service
templateVersion: 1.2.0
schemaVersion: 1
values:
port: 8080
database: postgresLock-файл содержит значения параметров, переданные при создании, без значений по умолчанию из схемы. По lock-файлу портал определяет текущую версию шаблона в репозитории и значения параметров для отрисовки новой версии. Не удаляйте и не изменяйте lock-файл вручную: без него репозиторий обновить нельзя.
В сущность микросервиса записываются параметры привязки. В таблице указаны параметры каноничной модели каталога и роли маппинга, через которые портал их находит:
| Параметр | Название | Роль маппинга | Значение |
|---|---|---|---|
template_id | «Идентификатор шаблона» | microservice_binding_template_id | Идентификатор шаблона |
template_version | «Версия шаблона» | microservice_binding_template_version | Текущая версия шаблона в репозитории |
template_source | «Источник шаблона» | microservice_binding_template_source | Название реестра, из которого получен шаблон |
template_update_policy | «Политика обновления шаблона» | microservice_binding_template_update_policy | «Вручную» (manual) или «Ревью автоматически» (review-auto) |
template_upgrade_strategy | «Стратегия обновления шаблона» | microservice_binding_template_upgrade_strategy | Стратегия обновления для этого микросервиса |
template_upgrade_overwrite | «Перезаписываемые пути обновления» | microservice_binding_template_upgrade_overwrite | Список перезаписываемых путей для этого микросервиса |
template_upgrade_add_if_missing | «Добавляемые пути обновления» | microservice_binding_template_upgrade_add_if_missing | Список добавляемых путей для этого микросервиса |
default_branch | — | microservice_default_branch | Ветка, в которую создаётся запрос на слияние с обновлением |
vcs_provider | — | microservice_vcs_provider | Провайдер системы контроля версий |
vcs_external_service_uuid | «Внешний сервис VCS» | microservice_vcs_external_service_uuid | Внешний сервис GitLab, в котором находится репозиторий |
Микросервис привязан к паре «шаблон и реестр»: обновления предлагаются только из версий шаблона того же реестра.
Политика обновления
Политика обновления определяет, запускается ли обновление автоматически после выхода новой версии шаблона:
- «Вручную» (
manual) — обновление запускается только кнопкой «Обновить» в карточке микросервиса. Эта политика назначается при создании микросервиса; - «Ревью автоматически» (
review-auto) — портал сам запускает обновление после синхронизации, на которой появилась новая последняя версия, и открывает запрос на слияние.
Чтобы изменить политику, откройте сущность микросервиса в каталоге и измените параметр «Политика обновления шаблона».
Настройки обновления микросервиса
Стратегия и списки путей обновления задаются в манифесте пакета шаблона. Для отдельного микросервиса их можно переопределить параметрами сущности «Стратегия обновления шаблона», «Перезаписываемые пути обновления» и «Добавляемые пути обновления».
Портал выбирает настройки обновления в следующем порядке:
- Параметры процесса обновления, если они заполнены при запуске.
- Параметры сущности микросервиса, если они заполнены.
- Поля
update.strategy,update.overwriteиupdate.addIfMissingманифеста новой версии шаблона. - Стратегия
selective, если стратегия нигде не задана.
Кнопка «Обновить» и автоматическое обновление передают выбранные настройки в контексте запуска процесса. Если процесс «Обновить микросервис из шаблона» из набора данных запускается без контекста, например из каталога, при пустом параметре «Стратегия обновления» используется selective.
Обнаружение новой версии
Новая версия шаблона обнаруживается при синхронизации реестра шаблонов. Если в результате синхронизации изменилась последняя версия шаблона, портал запускает автоматическое обновление подходящих микросервисов.
В карточке микросервиса на главной уведомление «Доступна версия {version}» отображается, если выполнены условия:
- у сущности микросервиса задан шаблон;
- у шаблона того же реестра есть последняя версия со статусом «доступна»;
- последняя версия выше версии шаблона микросервиса;
- у пользователя есть разрешение
read:template-packs.
Уведомления о предварительных версиях, например 2.0.0-rc.1, видят только пользователи с разрешением read:template-registries. Переход на более раннюю версию не предлагается.
Ручное обновление
Ручное обновление запускает пользователь из карточки микросервиса на главной. Ручное обновление доступно при любой политике обновления.
Чтобы обновить микросервис:
- Откройте раздел главной «Микросервисы» и выберите микросервис в таблице.
- На вкладке «Справка» в блоке «Доступна версия {version}» нажмите «Обновить».
- В окне «Запустить процесс» проверьте параметры и нажмите «Запустить».
- Дождитесь завершения процесса и откройте запрос на слияние в GitLab. Ссылка на запрос на слияние сохраняется в хранилище процесса.
Кнопка «Обновить» недоступна в следующих случаях:
| Подсказка | Причина |
|---|---|
| «Недостаточно прав для запуска процессов на этой сущности.» | У пользователя нет права на запуск действий для сущности микросервиса |
| «Процесс обновления шаблона уже выполняется для этого сервиса.» | Для микросервиса уже выполняется процесс обновления |
| «Для шаблона {template} не задан процесс обновления. Задайте его в правилах маппинга главной, в действиях по шаблонам.» | К шаблону не привязан процесс действия «Обновить микросервис из шаблона» |
| «У сервиса не определён шаблон, поэтому обновление из шаблона недоступно.» | У сущности микросервиса не задан шаблон |
Автоматическое обновление
Автоматическое обновление запускает процесс обновления без участия пользователя после синхронизации, на которой у шаблона появилась новая последняя версия.
Портал запускает автоматическое обновление микросервиса, если выполнены все условия:
- в настройках реестра шаблонов задан «Пользователь автоматизации»;
- у микросервиса политика обновления «Ревью автоматически» (
review-auto); - новая последняя версия — стабильная, не предварительная;
- шаблон и реестр микросервиса совпадают с шаблоном и реестром новой версии;
- версия шаблона микросервиса в формате semver и ниже новой версии;
- репозиторий микросервиса находится в GitLab;
- к шаблону привязан процесс действия «Обновить микросервис из шаблона»;
- процесс обновления привязан к ресурсу микросервиса в поле «Ресурс» процесса;
- для микросервиса не выполняется процесс обновления;
- в репозитории нет открытого запроса на слияние из ветки с префиксом из настройки «Префикс ветки обновления».
После одной синхронизации запускается не больше обновлений, чем задано в настройке «Лимит очереди обновлений». Первыми запускаются обновления с наибольшим разрывом версий: сначала по major-версии, затем по minor и patch.
Микросервисы, которые не попали в лимит или были пропущены из-за открытого запроса на слияние, повторно не ставятся на обновление до выхода следующей версии шаблона. Обновите такие микросервисы кнопкой «Обновить» или увеличьте «Лимит очереди обновлений» до публикации следующей версии.
Автоматическое обновление также запускается после синхронизации кнопкой «Синхронизировать», в том числе при выключенном параметре «Включить синхронизацию». Отзыв, возврат и удаление версии на вкладке «Шаблоны» автоматическое обновление не запускают.
Пользователь автоматизации
Процессы автоматического обновления запускаются от имени пользователя автоматизации, а действия процесса выполняются с его учётными данными.
Подготовьте пользователя автоматизации:
- Создайте пользователя, например сервисного пользователя. Автоматический запуск процесса не проверяет разрешения пользователя на сущности микросервисов.
- Заполните в профиле пользователя учётные данные GitLab — персональный токен и имя пользователя — для внешнего сервиса GitLab, в котором находятся репозитории микросервисов.
- Выберите пользователя в поле «Пользователь автоматизации» на вкладке «Настройки» реестра шаблонов.
Учётные данные пользователя автоматизации используются также для проверки открытых запросов на слияние и для сверки версии шаблона.
Запросы на слияние при автоматическом обновлении создаются от имени пользователя автоматизации. Выдайте его учётной записи GitLab только права, необходимые для создания веток и запросов на слияние в репозиториях микросервисов.
Выполнение обновления
Процесс «Обновить микросервис из шаблона» из набора данных «Реестр шаблонов микросервисов» состоит из двух задач: «Обновление репозитория из шаблона» и «Создание код-ревью».
Задача «Обновление репозитория из шаблона» выполняет следующие шаги:
- Определяет целевую версию: версию из параметра «Версия шаблона» или последнюю доступную версию шаблона из реестра микросервиса.
- Клонирует основную ветку репозитория и читает lock-файл. Если версия в lock-файле отличается от версии в каталоге, портал исправляет версию в каталоге по lock-файлу.
- Если версия в lock-файле не ниже целевой, завершает задачу без изменений; запрос на слияние не создаётся.
- Отрисовывает новую версию пакета. Значения параметров: значения по умолчанию из схемы новой версии, поверх них — значения из lock-файла, поверх них — значения, переданные в процесс.
- Создаёт ветку
<префикс ветки обновления><версия>, напримерddp/template-upgrade-1.3.0, от основной ветки. - Применяет изменения по стратегии обновления.
- Записывает в lock-файл новую версию и значения параметров.
- Создаёт коммит
chore(template): upgrade <id> <старая версия> -> <новая версия>и отправляет ветку в GitLab.
Задача «Создание код-ревью» открывает запрос на слияние из ветки обновления:
- в ветку из параметра
default_branchмикросервиса, если он не задан — вmain; - с заголовком
Upgrade <template_id> to <version>.
Если запрос на слияние из этой же ветки уже открыт, задача использует его. Если открыт запрос на слияние из другой ветки с тем же префиксом, задача завершается ошибкой review_already_open.
Портал не принимает запрос на слияние автоматически, не назначает ревьюеров и не отправляет уведомлений. Результат процесса отображается в панели «Мои активности» и в истории запусков процесса.
Стратегии обновления
Стратегия обновления определяет, какие файлы репозитория меняет обновление. Стратегии и требования к спискам путей:
| Стратегия | overwrite | addIfMissing | Поведение |
|---|---|---|---|
selective | Обязателен | Не используется | Перезаписывает файлы, пути которых совпадают с overwrite |
additive | Не используется | Обязателен | Добавляет файлы из addIfMissing, если их нет в репозитории |
selective_additive | Обязателен | Обязателен | Сначала перезаписывает файлы из overwrite, затем добавляет файлы из addIfMissing |
full | Не обязателен | Не обязателен | Записывает весь отрисованный пакет поверх репозитория и перезаписывает каждый совпавший файл |
merge | Обязателен | Не обязателен | Выполняет трёхстороннее слияние файлов из overwrite, затем добавляет файлы из addIfMissing |
Правила для всех стратегий:
- файлы вне области стратегии не изменяются;
- файлы не удаляются: файлы, удалённые или переименованные в новой версии шаблона, остаются в репозитории;
- в репозиторий не копируются
template.yaml,values.yamlи.templateignore.
Списки путей — glob-шаблоны относительно корня репозитория, поддерживается синтаксис **, например deploy/**.
Если обязательный для стратегии список пуст, обновление завершается ошибкой invalid_upgrade_config.
Слияние
Стратегия merge сохраняет изменения, которые разработчики внесли в файлы из overwrite. Для каждого файла портал сравнивает три версии:
- базовую — файл, отрисованный из версии шаблона, указанной в lock-файле;
- текущую — файл в репозитории микросервиса;
- новую — файл, отрисованный из новой версии шаблона.
Если файла нет в репозитории, записывается новая версия файла. Переводы строк CRLF и перевод строки в конце файла сохраняются.
Любой конфликт слияния, в том числе различие бинарных файлов, прерывает обновление целиком: в репозиторий ничего не записывается, а процесс завершается ошибкой merge_conflict: merge conflict in files: <файлы>.
Чтобы обновить микросервис с конфликтами, задайте для него другую стратегию, например selective, и перенесите изменения вручную в запрос на слияние.
Сверка версии после слияния
После принятия запроса на слияние портал обновляет версию шаблона микросервиса в каталоге. Сверка выполняется по расписанию из настройки «Интервал сверки версии шаблона».
Сверка выполняется, если в настройках реестра включён параметр «Включить синхронизацию» и задан «Пользователь автоматизации».
Портал проверяет микросервисы, у которых версия шаблона в каталоге ниже последней доступной версии, читает lock-файл из ветки default_branch (или main) через API GitLab и повышает параметр «Версия шаблона», если версия в lock-файле выше.
Версия в каталоге только повышается. После сверки уведомление «Доступна версия {version}» в карточке микросервиса исчезает.
Если пользователь автоматизации не задан, версия в каталоге после принятия запроса на слияние не меняется до следующего запуска обновления: процесс обновления исправляет версию по lock-файлу.
Устранение ошибок
Ошибки обновления отображаются в журнале задачи процесса. Сообщение начинается с кода ошибки.
| Код ошибки | Причина | Что сделать |
|---|---|---|
lock_not_found | В репозитории нет файла .ddp/template.lock.yaml | Восстановите lock-файл. Репозитории, созданные без lock-файла, из шаблона не обновляются |
lock_mismatch | Lock-файл создан для другого шаблона | Проверьте параметр «Идентификатор шаблона» микросервиса и lock-файл |
lock_invalid, unsupported_lock_schema | Lock-файл повреждён или имеет неподдерживаемую версию схемы | Восстановите lock-файл из истории репозитория |
merge_conflict | Конфликт слияния при стратегии merge | Смените стратегию микросервиса или выполните обновление вручную |
invalid_upgrade_config | Для стратегии не задан обязательный список путей | Задайте списки путей в манифесте пакета или в параметрах микросервиса |
review_already_open | Открыт запрос на слияние из другой ветки обновления | Примите или закройте открытый запрос на слияние и повторите обновление |
push_failed | Не удалось отправить ветку в GitLab, например ветка с таким именем уже существует | Удалите ветку обновления в GitLab и повторите обновление |
pack_not_found | В реестре микросервиса нет подходящей версии шаблона | Проверьте реестр шаблона микросервиса и статус версии |
pack_deprecated, pack_unavailable, pack_invalid | Целевая версия отозвана, недоступна или некорректна | Выберите другую версию или верните версию на вкладке «Шаблоны» |
values_invalid | Значения параметров не соответствуют схеме новой версии | Передайте недостающие значения в процесс обновления или исправьте схему в новой версии шаблона |
render_failed | Ошибка шаблонизации файлов пакета | Исправьте шаблоны и опубликуйте новую версию |
clone_failed | Не удалось клонировать репозиторий | Проверьте учётные данные GitLab пользователя, запустившего процесс |
unsupported_vcs_provider | Провайдер системы контроля версий микросервиса не GitLab | — |
Чтобы повторить обновление, запустите процесс снова кнопкой «Обновить».