Перейти к содержимому
Загрузка статьи…

Трек Доработки CI/CD бэка · Модуль №2

← Обзор трека · Как проходит выкатка

Ручной откат Go API ​

План, ещё не внедрено

Порядок ниже — целевое поведение из backend#42 и infra#69. Это объяснение будущего workflow, а не инструкция к уже существующей кнопке.

Выбор прежнего релиза ​

  1. Оператор открывает ручной Rollback workflow в GitHub Actions на main. Кнопка «↩️ Откатить» в Telegram только открывает страницу workflow и ничего не переключает сама. Старое Telegram-сообщение не определяет цель.

  2. Workflow читает production Deployments с точным digest и выбирает цель:

    Последняя попыткаАвтоматическая цель
    УспешнаПредыдущая успешная версия с другим digest
    Завершилась failure или errorПоследний успешный выпуск
    Незавершена или неизвестнаЦель автоматически не выбирается

    При необходимости оператор может указать полный Git SHA конкретной прежней успешной выкатки.

  3. До доступа к VPS workflow проверяет SHA цели, находит её успешный Deployment с digest нужного backend package и подтверждает доступность образа по digest в GHCR.

Опубликованный образ без успешной проверки production целью не становится. Если для одного SHA записаны разные digest, цель неоднозначна: workflow отказывает, а не выбирает один из образов молча. Неверный SHA, отсутствие подходящей успешной записи и недоступный образ тоже дают отказ до VPS.

Переключение и проверка ​

  1. После предварительной проверки workflow входит в тот же production environment, что и обычная выкатка. Оба запуска используют одну concurrency-группу и ограничение PRODUCTION_ENABLED.
  2. Вызывается тот же playbook Ansible с backend_image_ref по digest.
  3. После запуска подтверждаются образ нового контейнера, его healthy и ответ публичного API через HTTPS.
  4. Только после этих проверок откат получает статус success в GitHub Deployment и успешную карточку в Backend / Releases. Автоматического отката при ошибке нет.

Ожидаемый результат ​

Для выбора цели отдельный SSH-запрос на VPS не нужен. История Deployments показывает последний подтверждённый результат выкатки, а не гарантирует, что API работает сейчас: контейнер мог упасть или быть удалён. Поэтому версия «до» в карточке не выдаётся за фактически работающую.

Успешный откат подтверждает выбранный digest, healthy и публичный API через HTTPS. Карточка отдельно называет последнюю подтверждённую выкатку из GitHub и фактически проверенный результат нового запуска. Если после переключения состояние API нельзя подтвердить, результат показывается как «неизвестно» со ссылкой на логи.

Если что-то пошло не так ​

ЭтапЧто можно утверждать
Цель не прошла предварительную проверкуVPS не трогали; workflow сообщает причину отказа
Подготовка или переключение прервалисьПоказан последний подтверждённый Deployment; фактическая версия после сбоя — «неизвестно»
Новый контейнер запущен, но проверка не прошлаУказаны этап сбоя и ссылка на логи; успех не объявляется
Образ и API проверены, а отправка в Telegram не удаласьDeployment остаётся успешным; ошибка уведомления видна в workflow

Откат образа не откатывает схему и данные PostgreSQL.