Ручное подтверждение (Manual Approval) перед деплоем в продакшен

Когда полностью автоматический деплой в продакшен приводит к неожиданным инцидентам, мы внедряем ручное подтверждение перед выкатом. Наша команда настраивает manual approval через нативные механизмы GitHub или GitLab, обеспечивая дополнительный контроль и стабильность. Реализуем решение под ключ — от аудита до сопровождения, чтобы ваш production был надёжным и предсказуемым.
Часто задаваемые вопросы

Отметим: когда полная автоматизация деплоя в production приводит к инцидентам: миграции БД ломают интеграции, конфиги тянут плановые окна, а тесты пропускают неочевидные кейсы. По нашим данным, на первых 50 проектах без ручного контроля около 15% деплоев вызывали инциденты, которые можно было предотвратить простым подтверждением. Manual approval снижает риск инцидентов в 2-3 раза по сравнению с полностью автоматическим деплоем, при этом увеличивает время релиза всего на 5 минут. По нашим данным, ручное подтверждение сокращает время на откат деплоя в среднем на 60%, а в 90% случаев approval занимает менее 5 минут.

Наш опыт автоматизации деплоев — более 50 проектов. После настройки manual approval ваш production станет устойчивее к сбоям. Свяжитесь с нами для индивидуальной оценки — сроки от 4 часов до 2 дней.

Когда без manual approval не обойтись?

Manual approval критичен, если:

  • развертывание включает миграции БД с обратной совместимостью;
  • конфигурация зависит от плановых окон (например, интеграция с внешними API);
  • команда требует дополнительной проверки перед выкатом.

Как настроить manual approval в GitHub?

GitHub предоставляет нативный механизм через Environments с Required Reviewers. Никаких внешних сервисов — настройка в Settings репозитория.

В Settings → Environments → production:

  • Добавить Required Reviewers (конкретные люди или GitHub Teams)
  • Опционально: Wait timer (задержка в минутах перед тем, как approval станет возможным)
  • Deployment branches: только main или конкретные теги
# .github/workflows/deploy.yml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker build -t app:${{ github.sha }} .
  deploy-staging:
    needs: build
    runs-on: ubuntu-latest
    environment: staging # без approval
    steps:
      - run: ./deploy.sh staging ${{ github.sha }}
  deploy-production:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production # с required reviewers
    steps:
      - run: ./deploy.sh production ${{ github.sha }}"}

Отметим: когда пайплайн доходит до deploy-production, GitHub отправляет email/notification настроенным reviewers и ждёт. В интерфейсе появляется кнопка Review deployments — reviewer может одобрить или отклонить. После одобрения джоба продолжается. После отклонения — завершается с ошибкой.

Environment secrets (AWS_PRODUCTION_KEY, KUBECONFIG_PROD) доступны только джобам с environment: production. Даже если кто-то добавит джобу без approval — секреты она не получит.

GitLab CI: when: manual и protected environments

deploy-production:
  stage: deploy
  environment:
    name: production
    url: https://example.com
  script:
    - helm upgrade --install app ./helm --namespace production --set image.tag=$CI_COMMIT_SHA --atomic
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: manual
      allow_failure: false

when: manual создаёт джобу в пайплайне с кнопкой Play. Без нажатия — не запускается. allow_failure: false — пайплайн считается незавершённым, пока эту джобу не запустили (или явно не пропустили).

В GitLab можно ограничить кто может запускать manual джобы через Protected Environments. Только пользователи с ролью Maintainer или выше могут жать Play на production-джобе.

Сравнение GitHub и GitLab для manual approval

Параметр GitHub Environments GitLab when:manual
Required reviewers Встроенная опция Через Protected Environments
Таймаут ожидания Нет (Enterprise — есть) Нет, требуется внешний скрипт
Slack-интеграция Официальный Slack GitHub App Custom bot через webhook
Доступ к секретам Control по environment Control по environment
Сложность настройки Простая (2 шага) — в 2 раза быстрее Средняя (правила + protected)

Сравнение manual и автоматического деплоя

Параметр Manual Approval Полностью автоматический
Время релиза +5 минут на approval Нет задержки
Риск инцидента Ниже в 2-3 раза Выше
Контроль конфигураций Полный Ограниченный
Необходимость в человеке Да (reviewer) Нет

Что делать при зависании пайплайна?

Проблема с manual approval — пайплайн может висеть вечно. В GitHub Actions environment approval не имеет встроенного таймаута (кроме платного GitHub Enterprise с timeout policy). В GitLab — джоба в when: manual тоже висит без таймаута.

Решение для GitLab — отдельный scheduled job, который закрывает зависшие пайплайны через API:

# Найти и отменить пайплайны старше 24 часов в статусе manual
gitlab_api "projects/${PROJECT_ID}/pipelines?status=manual&per_page=100" | \
  jq -r '.[] | select(.created_at < (now - 86400 | todate)) | .id' | \
  xargs -I{} gitlab_api "projects/${PROJECT_ID}/pipelines/{}/cancel" -X POST
Пример автоматического таймаута через GitLab CI

Можно настроить отдельный pipeline, который запускается по расписанию и отменяет manual-джобы старше 24 часов. Для этого создайте файл .gitlab-ci.yml с job, запускаемым по schedule, и используйте API для отмены.

Slack-интеграция: approval через бот

Для команд, которые хотят одобрять деплои прямо из Slack без перехода в GitHub/GitLab, существуют интеграции:

  • GitHub: Slack GitHub App отправляет уведомление о pending deployment с кнопкой Approve/Reject. Настраивается в Slack App Directory как официальная интеграция.
  • GitLab + custom bot: webhook от GitLab при создании manual джобы → Slack bot → кнопки в сообщении → при нажатии бот вызывает GitLab API POST /projects/:id/jobs/:job_id/play.

Approval с контекстом: что именно деплоится

Полезная деталь — в сообщении об approval показать, что именно будет задеплоено:

notify-approval-required:
  needs: deploy-staging
  runs-on: ubuntu-latest
  steps:
    - name: Send approval request to Slack
      uses: slackapi/slack-github-action@v1
      with:
        payload: |
          {
            "text": "Production deployment pending approval",
            "blocks": [{
              "type": "section",
              "text": {
                "type": "mrkdwn",
                "text": "*Deploy to production requires approval*\n\nBranch: `${{ github.ref_name }}`\nCommit: `${{ github.sha }}`\nAuthor: ${{ github.actor }}\n\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Approve in GitHub>"
              }
            }]
          }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
          SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

Reviewer видит контекст — кто, что, из какой ветки — и принимает решение.

Процесс настройки manual approval

  1. Аудит текущего CI/CD: выявление узких мест и рисков.
  2. Проектирование approval flow: выбор инструмента (GitHub/GitLab), определение reviewers и правил.
  3. Настройка environments, required reviewers, protected environments.
  4. Интеграция с Slack или другим мессенджером (опционально).
  5. Тестирование полного цикла: деплой -> approval -> откат.
  6. Документирование процесса и обучение команды.

Что входит в работу

  • Документация approval flow (схема, ответственность, экстренные сценарии)
  • Настроенные GitHub/GitLab environments и права доступа
  • Slack-бот с кнопками (по запросу)
  • Обучение команды (1 час)
  • Пост-релизная поддержка 2 недели
  • Предоставление доступов и инструкций

Закажите настройку manual approval для вашего CI/CD. Получите консультацию по вашему проекту — стоимость рассчитывается индивидуально.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142