Как определить, что джоба в GitLab CI/CD запущена вручную по кнопке?

«Как определить, что джоба в GitLab CI/CD запущена вручную по кнопке?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В GitLab CI/CD для этого используется предопределенная переменная CI_PIPELINE_SOURCE. Если её значение равно web, chat или external_pull_request_event, это указывает на ручной запуск через интерфейс. Наиболее надежный способ — проверка на web.

Пример в .gitlab-ci.yml:

manual_job:
  script:
    # Проверяем, что пайплайн запущен через веб-интерфейс (кнопка "Run pipeline")
    - |
      if [ "$CI_PIPELINE_SOURCE" == "web" ]; then
        echo "Запуск выполнен вручную через веб-интерфейс."
        # Логика для ручного запуска, например, развертывание в production
        ./deploy-to-prod.sh
      else
        echo "Автоматический запуск. Пропускаем деплой в prod."
      fi
  rules:
    # Джоба будет доступна для ручного запуска, но также может запуститься автоматически
    - when: manual
      allow_failure: false

Другие распространенные значения CI_PIPELINE_SOURCE:

  • push: Запуск по пушу в ветку.
  • merge_request_event: Запуск при создании/обновлении MR.
  • schedule: Запуск по расписанию.
  • api: Запуск через API.
  • trigger: Запуск через pipeline trigger token.
  • pipeline: Запуск из другого пайплайна (parent/child).

Для более тонкого контроля можно также использовать переменную CI_JOB_MANUAL (будет true для джоб с when: manual), но она не различает способ запуска самой джобы.