У меня есть два конвейера как часть моего развертывания.
- Развертывание : Этот конвейер запекает манифест Kubernetes и развертывает / тестирует контейнер, включая анализ канареек.Он запускается при публикации новой версии контейнера.
- Очистить : этот конвейер очищает все оставшиеся канареечные ошибки развертывания и сбрасывает все сетевые / неконтейнерные компоненты по умолчанию.Он запускается при успехе ИЛИ сбое конвейера развертывания.В конце концов, верните вещи в нормальное состояние, если они иначе остались в несовместимом состоянии.
У меня установлены оба конвейера, чтобы не допускать одновременных запусков - вы не можете начать очистку, покавыполняется другая очистка, вы не можете начать развертывание с уже запущенным другим развертыванием.
Однако Я не хочу, чтобы развертывание запускалось, если выполняется очистка. Очисткаможет некорректно перезагружать вещи из-под Deploy и приводить к сбою или, что еще хуже, некорректно завершаться.
Как обеспечить, чтобы Deploy запускалась только в том случае, если очистка не выполняется и если никакое другое развертывание не запущено?
ОБНОВЛЕНИЕ : Однако я понимаю, что все это может быть частью одного конвейера, чтобы выяснить, почему это отдельные конвейеры,Я добавлю контекст.
Конвейер развертывания имеет около 20 шагов, некоторые из которых выполняются параллельно.Это было бы упрощенно:
Bake and Deploy
Manifest as Canary
|
+------+------+
| | |
Tests Tests Tests
| | |
+------+------+
|
Enable Some Prod Traffic
|
+------+------+
| | |
Tests Tests Tests
| | |
+------+------+
|
Enable More Prod Traffic
|
Automated Canary Analysis
|
Enable More Prod Traffic
|
Automated Canary Analysis
|
Finish Rolling New Version
Into Production
Очистка состоит из пяти шагов, но сводится к:
Ensure No Network Traffic Remains
Pointed at Canary Instances (Reset
Networking)
|
Delete Any Remaining Canary Instances
В конвейере развертывания, если какой-либо изпервоначальные наборы параллельных тестов не пройдены, мне нужно запустить очистку - перезагрузить сеть и уничтожить канарейку.Если какой-либо из запусков Automated Canary Analysis завершится неудачно, мне нужно запустить очистку.В конце успешного развертывания ... Мне нужно запустить очистку, чтобы убедиться, что там нет никаких канарейок.
Рабочий процесс, насколько я могу судить, на самом деле не процедурный.Я не могу "GOTO" очистить.Я также действительно, действительно не хочу копировать / вставлять набор из пяти шагов в каждое место, где это может быть успешным или неудачным.Я также хочу убедиться, что если что-то не получится - возможно, шаг, который разрешает трафик prod или что-то еще - что очистка будет запущена.У меня не всегда есть простой способ просто «подключиться», который я могу найти.
Я также не нашел никакого вида «в случае ошибки, выполнить этот набор шагов» или «в случае успеха,выполнить этот набор шагов ", кроме отдельного конвейера, который может запускаться на основе этих критериев .
Мое идеальное решение было бы в псевдокоде:
try {
// do the deploy steps
}
finally {
// whether success or fail
// run the clean up steps
}
ОднакоУчитывая ограничение, которое я вижу в связи с невозможностью попробовать / наконец в конвейере, я запускаю конвейер очистки всякий раз, когда развертывание завершается (успех или неудача).Тем не менее, я не вижу ничего, что могло бы «заблокировать» запуск Deploy во время работы Clean Up, поэтому, если есть набор резервных копий изменений, которые все ожидают развертывания, утилита очистки может вычистить вещи из-под меня..