Коллеги, у меня тут возникла одна очень интересная задачка. Есть

один бандл, который содержит в себе 2 типа образов - бэкенд и фронтенд.
Выкатываются последовательно, сперва бэк и потом фронт.
Есть хук, который построен на базе бэкендового образа, чтобы делать миграцию базы данных перед всеми деплоями.
Можно ли как-то сделать так, чтобы хук с миграцией выполнялся только тогда, когда изменился образ бэкенда?
Просто при частых изменениях на фронте, часто приходится ждать его выполнения, хотя по факту он ничего не делает из-за отсутствия изменений.

25 ответов

53 просмотра

Добрый день, у вас задача часто выкатывать фронт?

Sergey Sizov
Добрый день, у вас задача часто выкатывать фронт?

Ага. По несколько раз в день. В песочницу.

სერგეი ქრისტოვი
Ага. По несколько раз в день. В песочницу.

Будто бы проще сделать выкат раздельным на уровне CI.

Sergey Sizov
Будто бы проще сделать выкат раздельным на уровне ...

Так а как выкат зависит? Хуку всё равно. Бандлом выкатывается.

Sergey Sizov
А хук у вас какого плана?

обычный helm hook в виде джобы.

Sergey Sizov
А, я понял. Подумал про webhook.

неа... просто джоба. я думал сделать её не как хук, а как первоочерёдный деплой. но что-то мне кажется это какой-то лютый костыль, который не факт что сработает.

@ilya_lesikov глянь пожалуйста, как время будет.

Могу предложить такой велосипед: обернуть Job в if-условие, в условии должна проверяться версия образа бэкенда в текущем деплойменте, которую теоретически можно взять с помощью lookup-функции , с версией нового релиза

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

Можно попробовать такой вариант: # .helm/templates/migrate.yaml kind: Job metadata: # "v1" in the name must be changed everytime Job spec is changed name: migrate-{{ include (print $.Template.BasePath "/backend.yaml") . | sha256sum | trunc 10 }}-v1 annotations: helm.sh/hook: ... helm.sh/hook-delete-policy: "" # .helm/templates/backend.yaml kind: Deployment metadata: name: backend # .helm/templates/frontend.yaml kind: Deployment metadata: name: frontend Так каждый раз при изменении backend.yaml будет меняться имя у Job, вызывая её перекат. Если же манифест джобы (включая её имя) не изменился, её выкат будет пропущен — так умеет werf 2.0. Единственное неудобство это то, что при изменении spec самой джобы, надо будет v1 в её имени поменять на что-то ещё, иначе получите ошибку "не можем обновить Job, т. к. она иммутабельна". Мы планировали добавить что-то вроде "werf.io/deploy-policy: recreateOnImmutableError", но пока не добрались.

Ilya Lesikov L.
Можно попробовать такой вариант: # .helm/templates...

В общем, я попробовал, но у меня почему-то всё равно покатилась миграция. Я даже больше скажу, раньше было название просто migrate без суффикса и всё равно катилось каждый раз. Или должно было завестись на связь с другим шаблоном? Но не завелось, просто выкатилось снова. Версия 2.4 была. Но у меня: annotations: "helm.sh/hook": "pre-install, pre-upgrade" "helm.sh/hook-delete-policy": "before-hook-creation"

სერგეი ქრისტოვი
В общем, я попробовал, но у меня почему-то всё рав...

Дак надо выставить "helm.sh/hook-delete-policy": "". before-hook-creation буквально значит "пересоздавай этот ресурс каждый раз при выкате". Мы в теории могли бы пропускать пересоздания, если ничего в релизе не изменилось и ничего не надо обновлять в кластере, но это может сломать обратную совместимость — что если пользователь чарта ожидает, что его хук будет обязательно запускаться при werf converge? Поэтому эта аннотация всегда форсирует новый релиз и пересоздание ресурса.

Ilya Lesikov L.
Дак надо выставить "helm.sh/hook-delete-policy": "...

спасибо за замечание, и правда, в этом случае не удаляет перед созданием. Но тут есть нюанс - он начинает их плодить как кроликов на каждый релиз. Можно как-то ему сделать харакири, если выкатил новый релиз?

Ilya Lesikov L.
"helm.sh/hook-delete-policy": "hook-succeeded,hook...

А как историю последнего запуска сохранить? Миграция упадёт и как узнать почему?

citius
Пойти в логи посмотреть?

Если джоба исчезнет, то и логов не будет.

Ilya Lesikov L.
"helm.sh/hook-delete-policy": "hook-succeeded"

Тогда плодиться будут на каждую миграцию)) Вот в этом и задача.

სერგეი ქრისტოვი
Если джоба исчезнет, то и логов не будет.

логи должны собираться во внешнее хранилище: Loki, эластик, вотэвер. И там они всегда будут.

სერგეი ქრისტოვი
Тогда плодиться будут на каждую миграцию)) Вот в э...

Ресурс будет выкатываться при новом релизе при любых раскладах. Но если так аннотацию указать, то после удачной миграции джоба удалится, а при неудачной - останется, т. е. можно в кластере зайти посмотреть что с ней не так.

Ilya Lesikov L.
Ресурс будет выкатываться при новом релизе при люб...

А, я вспомнил, вы хотите не каждый раз катить. Если сделать точно, как я здесь указал, то катиться каждый раз не будет. В логе пода (который создает джоба) в кластере можно посмотреть последнюю миграцию.

Похожие вопросы

Обсуждают сегодня

Всем привет. Понимаю, что, наверное, сто раз поднимали эту тему, но по ключевым словам не смог найти. Как передать в values.yaml зависимого хелм-чарта теги образов, собираемых...
Vitalik Petrov
4
Всем привет. Werf v2.10.5 При удалении релиза вместе с неймспейсом (werf dismiss --namespace namespace_name) Сыпятся ошибки ┌ Waiting for resources elimination: namespaces/rel...
Vitalik Petrov
1
@aigrychev, @ilya_lesikov добрый день! а поддерживает ли werf helm xxxx или werf bundle xxxx работу с сабчартами через http-прокси? (сработает ли использование HTTP_PROXY/HTTP...
Сергей Голод
4
Добрый день! Удалил все файлы с переменными из проекта, получил Error: release deploy: process resources: error validating adoptable resources: adoption validation failed: re...
Evgheni Mad
2
Привет! Вопрос про werf helm Приложение деплоится через werf helm upgrade --atomic Иногда(все условия для воспроизведения до конца непонятны, но есть версия, что это происходи...
𝓐𝓵͢͢͢𝓮𝔁 C
2
Всем привет. Сегодня добавили в приложение дополнительный образ nginx, в который докидывается системная статика прям в образ. При деплое бандлами деплоилось 200+ джоб(клиентов...
Владимир Муковоз
6
Добрый день, после перехода с версии 1.2 на 2.10 werf cleanup начал удалять использующиеся теги, и до и после обновления использовались дефолтные политики keepPolicies Подскаж...
Дмитрий
29
Блин а мне как поумнеть ?
Toxin
191
Друзья, добрый день. Прошу подсказать с базовым вопросом по использованию CI переменных gitlab в werf.yaml. Хочу в beforeInstall использовать env переменную с токеном. Мне нуж...
Anton Zol
10
Вопросик не совсем werf. Но вдруг мы подскажите воркэраунд или ещё что-нибудь. Могу ли я как-нибудь в моменте деплоя внутри heml рендера получить хэшсумму файла шаблона (./tem...
Alex Подрябинкин
11
Карта сайта