Skip to content

ложный фейл healthcheck в cd.yml когда compose не пересоздаёт контейнер #15

@iAmScienceMan

Description

@iAmScienceMan

симптом

деплой падает на шаге 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 в первом прогоне, а не потому что что-то починилось. при следующем коммите, который не меняет образ существенно, всё повторится.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions