Ответ
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
Расширенные сценарии:
-
Job с зависимостями: Manual job может ждать завершения предыдущих автоматических стадий.
deploy_to_production: stage: deploy script: ./deploy.sh when: manual needs: ["run-integration-tests"] # Запустится только после успеха тестов -
Защищенные окружения с ручным подтверждением:
deploy: stage: deploy script: ./deploy.sh environment: name: production url: https://myapp.com when: manual only: - mainВ интерфейсе GitLab для такого job появится кнопка с иконкой "play". Перед запуском можно добавить дополнительные переменные.
-
Блокировка пайплайна (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" # Чтобы срабатывало только из мейна, а не с левой ветки
А теперь, чувак, смотри, какие ещё фокусы можно вытворять:
-
Job, который ждёт других. Он не запустится, пока предыдущие автоматические этапы не пройдут успешно. Удобно, чтобы не накосячить.
deploy_to_production: stage: deploy script: ./deploy.sh when: manual needs: ["run-integration-tests"] # Сначала тесты, потом уже ручками деплоим -
Защищённые окружения с ручным подтверждением. Это вообще песня. Настраиваешь environment, и в интерфейсе GitLab появляется этакая жирная кнопка "play". Нажимаешь — и понеслась. Можно даже переменные дополнительные подсунуть перед запуском.
deploy: stage: deploy script: ./deploy.sh environment: name: production url: https://myapp.com when: manual only: - main -
Полная блокировка пайплайна. Вот это мощь! Весь процесс встаёт колом и ждёт, пока ты не дашь добро. Без этого ручного действия — дальше ни шагу.
manual_approval: stage: approve script: - echo "Менеджер, проверь и нажми Deploy!" when: manual allow_failure: false # Пайплайн сдохнет, если эту job не запустить
Из личного опыта, бля: Я эти manual job'ы как родных использую. Для deploy_to_staging — после мержа в develop, и для deploy_to_prod — после мержа в main. Получается чёткий, контролируемый процесс. Не то что эти распиздяи, которые всё автоматом гоняют, а потом охуевают от последствий. Тут хоть есть момент, где можно остановиться, подумать головой и сказать: "Э, сабака сука, а точно всё готово?"