Как настроить и запустить 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). Это создает четкий и контролируемый процесс выпуска изменений.

Ответ 18+ 🔞

А, ну это ж классика, ебать мои старые костыли! 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"  # Чтобы срабатывало только из мейна, а не с левой ветки

А теперь, чувак, смотри, какие ещё фокусы можно вытворять:

  1. Job, который ждёт других. Он не запустится, пока предыдущие автоматические этапы не пройдут успешно. Удобно, чтобы не накосячить.

    deploy_to_production:
      stage: deploy
      script: ./deploy.sh
      when: manual
      needs: ["run-integration-tests"] # Сначала тесты, потом уже ручками деплоим
  2. Защищённые окружения с ручным подтверждением. Это вообще песня. Настраиваешь environment, и в интерфейсе GitLab появляется этакая жирная кнопка "play". Нажимаешь — и понеслась. Можно даже переменные дополнительные подсунуть перед запуском.

    deploy:
      stage: deploy
      script: ./deploy.sh
      environment:
        name: production
        url: https://myapp.com
      when: manual
      only:
        - main
  3. Полная блокировка пайплайна. Вот это мощь! Весь процесс встаёт колом и ждёт, пока ты не дашь добро. Без этого ручного действия — дальше ни шагу.

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

Из личного опыта, бля: Я эти manual job'ы как родных использую. Для deploy_to_staging — после мержа в develop, и для deploy_to_prod — после мержа в main. Получается чёткий, контролируемый процесс. Не то что эти распиздяи, которые всё автоматом гоняют, а потом охуевают от последствий. Тут хоть есть момент, где можно остановиться, подумать головой и сказать: "Э, сабака сука, а точно всё готово?"