подключение

Подключение к GitLab

Боту нужны две вещи: токен со scope api (читать дифф, писать комментарии и статусы) и вебхук в проекте, который дёргает бота на событиях Merge Request и комментариев.

Когда он подключён, в самих тредах возникают два вопроса: как возразить на замечание так, чтобы бот ответил, и что делать, когда треды бота закрывают, а код не меняется.

1. Токен бота

Лучше завести отдельного пользователя-бота и выдать Project Access Token (или Personal Access Token) со scope api. Значение — в GITLAB_TOKEN.

права токенаРоль не ниже Developer — чтобы оставлять discussion-комментарии. Commit status нужен, только если вы включили severity gate (по умолчанию он выключен); при нехватке прав на статус ревью всё равно опубликуется — бот не падает. Вебхук ниже вы создаёте руками, поэтому Developer хватает; если будете заводить его через API — на это нужен Maintainer, Developer получит 403.

2. Вебхук проекта

В проекте: Settings → Webhooks → Add new webhook.

  • URL — адрес бота с путём вебхука:
URL вебхука
https://your-bot-address/api/webhooks/gitlab
  • Secret token — то же значение, что в GITLAB_WEBHOOK_SECRET. Бот сверяет его сравнением постоянного времени.
  • Trigger — отметьте Merge request events и Comments (note events — нужны для reply mode; пока он не включён в конфиге, события комментариев бот просто игнорирует). Если вебхук создан раньше — до-включите Comments в Settings → Webhooks → Edit; diagnose.sh --project проверяет это автоматически.

Нажмите Test → Merge request events. Ожидаемый ответ — 202: бот принял задачу в очередь.

self-hosted сетьЕсли бот стоит во внутренней сети, разрешите GitLab ходить туда: Admin → Settings → Network → Outbound requests → «Allow requests to the local network from webhooks».

Какие события ревьюятся

событиеповедение
open / reopenревью запускается
update (новые коммиты)ревью запускается на новом head
update (Draft → Ready)ревью запускается даже без новых коммитов — это тот прогон, которого ждал пропущенный черновик
update (сменилась целевая ветка)полное ревью — дифф пересобирается от новой базы
update (лейблы, описание, аппрув)игнорируется — лишних прогонов нет
комментарий в MR (note)при включённом reply mode бот отвечает в треде; иначе игнорируется
дедупликацияЗадача в очереди ключуется как проект:mr:headSha (ответ на реплику — по id комментария) — повторные доставки вебхука от GitLab не порождают дублей.

Что увидит команда

  • строчные discussion-комментарии по позициям диффа;
  • сводный комментарий с группировкой по severity;
  • при включённом reply mode — ответы бота на реплики в тредах его замечаний (сводка подсказывает команде, что боту можно ответить);
  • commit status (success/failed) — только если включён severity gate (по умолчанию выключен); тогда блокирует merge при «pipeline must succeed».