У нас, кстати, не только GitLab, но ещё и древний SVN. И там, и там есть код паппета, который надо таскать на мастера и валидировать все коммиты.
Итак, есть приложение. Оно сидит на каждом мастере и мониторит состояние локального кода.
Как только происходит пуш в гитлаб, через API этот код передаётся одному из инстансов этого приложения на валидацию. Если всё ОК, оно говорит, что ОК, можешь принимать пуш. Если нет — отбивает, отдавая в stderr сообщение с ошибками, которое потом передаётся клиенту (ты сразу после команды git push видишь в консоли, что 1. синтаксис кривой тут 2. тут другой косяк 3. т.п.).
Если всё ОК, приложуха командует остальным мастерам обновить код. Команда ставится в очередь на выполнение.