Отметим: когда полная автоматизация деплоя в 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
- Аудит текущего CI/CD: выявление узких мест и рисков.
- Проектирование approval flow: выбор инструмента (GitHub/GitLab), определение reviewers и правил.
- Настройка environments, required reviewers, protected environments.
- Интеграция с Slack или другим мессенджером (опционально).
- Тестирование полного цикла: деплой -> approval -> откат.
- Документирование процесса и обучение команды.
Что входит в работу
- Документация approval flow (схема, ответственность, экстренные сценарии)
- Настроенные GitHub/GitLab environments и права доступа
- Slack-бот с кнопками (по запросу)
- Обучение команды (1 час)
- Пост-релизная поддержка 2 недели
- Предоставление доступов и инструкций
Закажите настройку manual approval для вашего CI/CD. Получите консультацию по вашему проекту — стоимость рассчитывается индивидуально.







