Боту нужны две вещи: токен со 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://адрес-бота/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 (только лейбл/описание)
игнорируется — лишних прогонов нет
комментарий в MR (note)
при включённом reply mode бот отвечает в треде; иначе игнорируется
дедупликацияЗадача в очереди ключуется как проект:mr:headSha (ответ на реплику — по id комментария) — повторные доставки вебхука от GitLab не порождают дублей.
Что увидит команда
строчные discussion-комментарии по позициям диффа;
сводный комментарий с группировкой по severity;
при включённом reply mode — ответы бота на реплики в тредах его замечаний (сводка подсказывает команде, что боту можно ответить);
commit status (success/failed) — только если включён severity gate (по умолчанию выключен); тогда блокирует merge при «pipeline must succeed».