Задача деплоя завершается с кодом 0, но прод продолжает отдавать прошлую сборку. Где сломался пайплайн?
Стадия build собирает и пушит образ; стадия deploy наводит Deployment на него. Обе задачи зелёные и выходят с кодом 0, но прод по-прежнему крутит старую версию, а повторный запуск деплоя ничего не даёт. Найдите корневую причину в конфиге и исправьте.
build:
stage: build
script:
- docker build -t registry.example.com/app:latest .
- docker push registry.example.com/app:latest
deploy-prod:
stage: deploy
script:
- kubectl set image deployment/app app=registry.example.com/app:latest
Объясните, почему новая сборка не выходит в прод, и дайте фикс.
Изменяемый тег latest не меняет спецификацию Deployment, поэтому kubectl set image не видит разницы и не запускает выкат — ничего не тянется. Фикс — неизменяемые теги: пушьте app:$CI_COMMIT_SHA и наводите Deployment на него. Собирайте раз, продвигайте тот же артефакт.
- ✗Использовать изменяемый тег
latest, из-за чего спецификация не меняется - ✗Ждать выкат, когда
kubectl set imageне видит разницы - ✗Пересобирать отдельный образ под каждое окружение вместо продвижения одного
- →Почему build-once-promote-many безопаснее пересборки под каждое окружение?
- →Как
imagePullPolicyвзаимодействует с переиспользуемым изменяемым тегом?
Решение
Причина
Тег latest — изменяемый. Обе стадии всегда используют одну и ту же строку registry.example.com/app:latest. Когда kubectl set image подставляет ровно то же значение, что уже стоит в спецификации Deployment, контроллер не видит различий — новый ReplicaSet не создаётся, выката нет, образ не перетягивается. Job при этом выходит с кодом 0, потому что команда формально успешна.
Фикс — неизменяемый тег и build-once-promote-many
build:
stage: build
script:
- docker build -t registry.example.com/app:$CI_COMMIT_SHA .
- docker push registry.example.com/app:$CI_COMMIT_SHA
deploy-prod:
stage: deploy
script:
- kubectl set image deployment/app app=registry.example.com/app:$CI_COMMIT_SHA
- kubectl rollout status deployment/app # верификация выката
Уникальный тег по SHA коммита делает строку спецификации новой на каждый релиз — контроллер видит различие, создаёт новый ReplicaSet и тянет новый образ. Тот же образ с тегом SHA затем продвигают в staging и prod: собрали один раз, катят один и тот же артефакт. Не пересобирайте образ отдельно под каждое окружение — иначе прод получает не тот бинарник, что вы тестировали.