Как из внешней системы запустить джоб в GitLab — где получить токен для этого и как его передать в запросе?

Здравствуйте. В процессе решения задачи: <a href="https://qna.habr.com/q/1410867" rel="nofollow">GitLab Как сделать автоматическую проверку кода при push или merge request с уведомлением разработчика о результате и получением от него обр. связи?</a> я сделал pipeline из трёх шагов:
  • 29 мая 2026 г. 11:01
Ответы на вопрос 1
Коротко — есть два основных способа «внешне» запустить pipeline / джоб в GitLab:

1) Project trigger (встроенный Trigger Token) — удобен, если у вас есть только одна задача «запустить pipeline из внешней системы».  
2) API с токеном пользователя (Personal Access Token / Project Access Token / OAuth) — даёт больше гибкости и прав.

Где получить токен
- Project trigger: в проекте -> Settings -> CI / CD -> Pipeline triggers -> Add trigger. Сгенерируется token и имя.  
- Personal Access Token (PAT): в профиле -> Preferences -> Access Tokens (или Profile Settings -> Access Tokens). Необходим scope: api (или минимум необходимый для вызова нужного метода).  
- Project Access Token (новая опция в некоторых версиях): Project -> Settings -> Access Tokens — полезно для сервисов без привязки к пользователю.

Как передать в запросе

1) Запуск pipeline через Trigger Token (проще). HTTP POST:
- URL:
  https://gitlab.example.com/api/v4/projects/:id/trigger/pipeline
  (:id — numeric project id или URL-encoded path, напр. namespace%2Fproject)
- Form-данные (application/x-www-form-urlencoded):
  token=TRIGGER_TOKEN
  ref=branch_or_tag
  variables[VAR_NAME]=value  (можно многократно)
Пример curl:
curl -X POST "https://gitlab.com/api/v4/projects/12345/trigger/pipeline" \
  -F token=AbCdEfGh123456 \
  -F ref=master \
  -F "variables[RUN_SPECIAL]=1"

Этот вариант не использует заголовок Authorization — токен передаётся в теле как token.

2) Запуск pipeline через API и Personal Access Token. HTTP POST:
- URL:
  POST https://gitlab.example.com/api/v4/projects/:id/pipeline?ref=master
- Заголовок:
  PRIVATE-TOKEN: <your_personal_access_token>
  либо Authorization: Bearer <token>
- Тело можно передать как JSON или параметры запроса. Для переменных:
  variables[key]=value или в JSON variables: [{ "key":"NAME","value":"val" }, ...]
Пример curl:
curl -X POST "https://gitlab.com/api/v4/projects/12345/pipeline" \
  -H "PRIVATE-TOKEN: xxxxxxyourPAT" \
  -H "Content-Type: application/json" \
  -d '{"ref":"master","variables":[{"key":"RUN_SPECIAL","value":"1"}]}'

Как запустить конкретный джоб
GitLab API запускает pipeline; чтобы исполнился нужный job — используйте переменные и правила в .gitlab-ci.yml. Пример job, который выполняется только если переменная set:
my_job:
  script: .... 
  rules:
    - if: '$RUN_SPECIAL == "1"'
      when: always
    - when: never

Альтернативы/дополнения
- Если нужно «play» manual job (trigger ручной job) — есть API для /projects/:id/jobs/:job_id/play, но для этого нужен токен пользователя с правами (PRIVATE-TOKEN).
- Для многоступенчатых сценариев можно запускать child pipelines, использовать triggers внутри .gitlab-ci.yml и т.д.

Безопасность
- Храните токены в защищённом хранилище и используйте HTTPS.  
- Ограничьте права токена (минимально необходимый scope). Trigger token действует на проекте и даёт возможность запускать pipeline от имени триггера — не даёт всех прав пользователя, но тоже должен храниться безопасно.

Если хотите — пришлите версию GitLab (gitlab.com или self-hosted + версия) и пример .gitlab-ci.yml: подскажу конкретный curl и как настроить job, чтобы срабатывал только при внешнем запуске.
Похожие вопросы