симптом
деплой падает на шаге healthcheck, потом ветка rollback "успешно" восстанавливает то же самое состояние, а ручной rerun иногда проходит сам по себе. пример: run 26569086265 упал на коммите d721744, который трогал только README. rerun сразу за ним прошёл, при этом на сервере никто ничего не делал.
что происходит
в cd.yml:106 healthcheck выглядит так:
docker compose pull
docker compose up -d
sleep 30
docker logs kool-bot --tail 100 2>&1 | grep -qE "(connected to Gateway|Logged in as|on_ready|готов к работе|...)"
скрипт молча рассчитывает, что compose up -d пересоздал контейнер и ready-маркер лежит в свежих логах. это не всегда так. если новый образ, по мнению compose, не отличается от того, что уже привязан к запущенному контейнеру, compose печатает Container kool-bot Running и ничего не трогает. контейнер продолжает жить с прежнего старта, ready-строка от того старта давно уехала за пределы --tail 100, грэп её не находит, healthcheck падает. дальше ветка rollback делает --force-recreate, это уже честно перезапускает контейнер, второй грэп на свежих логах находит ready, печатается rollback succeeded, но воркфлоу всё равно выходит с exit 1.
в логах rerun-а (run 71170783625) видна та же последовательность Pulled, Running без Recreated, но healthcheck прошёл. почему: предыдущий прогон в ветке rollback сделал --force-recreate в 10:26:48, rerun смотрел логи в 10:31:14, контейнер прожил около 4.5 минут и ready-строка ещё попадала в tail 100. если бы rerun запустили через час, контейнер успел бы наговорить больше 100 строк после стартового ready и всё повторилось бы один в один.
то есть rerun помог заодно с тем перезапуском, который сделал rollback в первом прогоне, а не потому что что-то починилось. при следующем коммите, который не меняет образ существенно, всё повторится.
симптом
деплой падает на шаге healthcheck, потом ветка rollback "успешно" восстанавливает то же самое состояние, а ручной rerun иногда проходит сам по себе. пример: run 26569086265 упал на коммите d721744, который трогал только README. rerun сразу за ним прошёл, при этом на сервере никто ничего не делал.
что происходит
в cd.yml:106 healthcheck выглядит так:
скрипт молча рассчитывает, что
compose up -dпересоздал контейнер и ready-маркер лежит в свежих логах. это не всегда так. если новый образ, по мнению compose, не отличается от того, что уже привязан к запущенному контейнеру, compose печатаетContainer kool-bot Runningи ничего не трогает. контейнер продолжает жить с прежнего старта, ready-строка от того старта давно уехала за пределы--tail 100, грэп её не находит, healthcheck падает. дальше ветка rollback делает--force-recreate, это уже честно перезапускает контейнер, второй грэп на свежих логах находит ready, печатаетсяrollback succeeded, но воркфлоу всё равно выходит с exit 1.в логах rerun-а (run 71170783625) видна та же последовательность
Pulled,RunningбезRecreated, но healthcheck прошёл. почему: предыдущий прогон в ветке rollback сделал--force-recreateв 10:26:48, rerun смотрел логи в 10:31:14, контейнер прожил около 4.5 минут и ready-строка ещё попадала в tail 100. если бы rerun запустили через час, контейнер успел бы наговорить больше 100 строк после стартового ready и всё повторилось бы один в один.то есть rerun помог заодно с тем перезапуском, который сделал rollback в первом прогоне, а не потому что что-то починилось. при следующем коммите, который не меняет образ существенно, всё повторится.