Как настроить и запустить manual job в GitLab CI/CD?

Ответ

Manual job (задание с ручным запуском) — это стандартная практика для контролируемого деплоя на прод или выполнения опасных операций. Я настраиваю их через директиву when: manual.

Базовая конфигурация:

# .gitlab-ci.yml
stages:
  - test
  - deploy

deploy_to_production:
  stage: deploy
  script:
    - echo "Starting deployment to production..."
    - ./scripts/deploy-prod.sh
  when: manual  # Ключевая директива
  rules:
    - if: $CI_COMMIT_BRANCH == "main"  # Разрешаем запуск только из main

Расширенные сценарии:

  1. Job с зависимостями: Manual job может ждать завершения предыдущих автоматических стадий.

    deploy_to_production:
      stage: deploy
      script: ./deploy.sh
      when: manual
      needs: ["run-integration-tests"] # Запустится только после успеха тестов
  2. Защищенные окружения с ручным подтверждением:

    deploy:
      stage: deploy
      script: ./deploy.sh
      environment:
        name: production
        url: https://myapp.com
      when: manual
      only:
        - main

    В интерфейсе GitLab для такого job появится кнопка с иконкой "play". Перед запуском можно добавить дополнительные переменные.

  3. Блокировка пайплайна (Pipeline-level manual job): Иногда нужно, чтобы весь пайплайн останавливался и ждал ручного действия.

    manual_approval:
      stage: approve
      script:
        - echo "Менеджер, проверь и нажми Deploy!"
      when: manual
      allow_failure: false # Пайплайн не пройдет, если job не запущен

Из практики: Я часто использую manual job для deploy_to_staging (после merge в develop) и deploy_to_prod (после merge в main). Это создает четкий и контролируемый процесс выпуска изменений.