Gerrit
Gerrit — это распределённая система рецензирования кода (code review), основанная на Git. Она предоставляет веб-интерфейс для управления процессом внесения изменений в исходный код, позволяя разработчикам отправлять патчи (наборы изменений), которые перед включением в основную ветку проекта проходят проверку и обсуждение другими участниками команды. Gerrit тесно интегрирован с Git и выступает в роли центрального сервера, контролирующего поток изменений в репозиторий.
История
Система была разработана инженерами компании Google для внутренних нужд. Первоначально она называлась Rietveld, но в 2009 году была переписана с нуля на языке Java с использованием технологии Google Web Toolkit (GWT) и получила название Gerrit. Основной целью создания было обеспечение строгого контроля качества кода в крупных проектах, таких как Android и Chrome. В 2010 году Gerrit стал открытым проектом под лицензией Apache 2.0, что позволило использовать его в других компаниях и сообществах.
С момента открытия исходного кода проект активно развивается сообществом разработчиков. Ключевые версии включали внедрение поддержки плагинов, улучшение производительности для больших репозиториев и интеграцию с различными системами непрерывной интеграции. Наиболее заметным пользователем Gerrit остаётся проект Android (AOSP — Android Open Source Project), где система используется для управления всеми изменениями в платформе.
Архитектура и принцип работы
Gerrit работает по модели «push-to-review». В отличие от централизованных систем контроля версий, где разработчик напрямую отправляет изменения в общий репозиторий, Gerrit выступает промежуточным звеном. Процесс работы выглядит следующим образом:
- Отправка изменений: Разработчик создаёт локальную ветку, вносит изменения и фиксирует их (commit). Затем он отправляет (push) эту ветку в специальную ссылку (refs/for/<branch>) на сервере Gerrit, а не напрямую в целевую ветку.
- Создание рецензии: Сервер Gerrit принимает изменения, создаёт для них уникальную запись — «изменение» (change). Изменение получает номер и веб-страницу, где отображается diff (разница) между новым и старым кодом.
- Рецензирование: Другие разработчики (рецензенты) просматривают diff, оставляют комментарии к конкретным строкам кода, задают вопросы и предлагают исправления. Рецензент может выставить одну из оценок:
- -2: Вето (изменение не может быть принято).
- -1: Не одобряю, но не блокирую.
- 0: Нет мнения.
- +1: Одобряю, но не принимаю решение.
- +2: Одобряю и рекомендую к принятию.
- Доработка: Если рецензент запросил изменения, разработчик вносит правки в свою локальную ветку, делает новый commit и снова отправляет его в ту же ссылку refs/for/. Gerrit автоматически обновляет существующее изменение, показывая новую версию патча (patch set).
- Принятие: После того как изменение получило оценку +2 от как минимум одного рецензента (настройки могут различаться) и прошло все автоматические проверки (например, сборка и тесты), уполномоченный разработчик (обычно мейнтейнер проекта) нажимает кнопку «Submit» (Отправить). Gerrit выполняет слияние (merge) изменений в целевую ветку репозитория.
Ключевые возможности
Рецензирование кода
Основная функция Gerrit — обеспечение прозрачного и структурированного процесса рецензирования. Каждое изменение отображается в виде набора изменений (diff) с подсветкой добавленных, удалённых и изменённых строк. Комментарии привязываются к конкретным строкам кода, что делает обсуждение предметным.
Управление правами доступа
Gerrit предоставляет гибкую систему прав доступа (ACL — Access Control List). Администратор проекта может настроить, кто может отправлять изменения, кто может рецензировать, а кто — принимать изменения. Права можно назначать на уровне проектов, веток или даже отдельных файлов. Это позволяет реализовать различные модели управления, например, требовать обязательное рецензирование для изменений в критических модулях.
Интеграция с системами непрерывной интеграции (CI)
Gerrit активно взаимодействует с CI-системами, такими как Jenkins, GitLab CI, Travis CI и другими. При отправке нового патча Gerrit может автоматически запускать сборку и тесты на CI-сервере. Результаты выполнения (успех/неудача) отображаются непосредственно в интерфейсе изменения. CI-система может выставлять свою оценку (например, Verified +1 или Verified -1), которая может быть обязательным условием для принятия изменения.
Поддержка нескольких репозиториев
Gerrit поддерживает работу с несколькими репозиториями в рамках одного сервера. Это удобно для крупных проектов, состоящих из множества связанных модулей. Изменения в разных репозиториях могут быть связаны между собой через специальные зависимости.
Плагины
Архитектура Gerrit основана на плагинах, что позволяет расширять его функциональность. Существуют плагины для интеграции с различными системами отслеживания ошибок (Jira, Bugzilla), для автоматического назначения рецензентов, для анализа кода (например, статический анализ) и для других задач.
Применение
Gerrit наиболее популярен в крупных проектах с открытым исходным кодом и в корпоративной среде, где требуется строгий контроль качества кода. Основные области применения:
- Разработка операционных систем: Проект Android (AOSP) является одним из самых известных пользователей Gerrit. Вся разработка платформы проходит через эту систему.
- Крупные программные продукты: Компании, разрабатывающие сложные программные комплексы (например, в сфере телекоммуникаций, финансов, авиастроения), используют Gerrit для обеспечения соответствия кода стандартам и требованиям безопасности.
- Встраиваемые системы: Разработка прошивок и драйверов, где ошибки могут привести к дорогостоящим последствиям, часто требует обязательного рецензирования.
- Научные и исследовательские проекты: В проектах, где важна воспроизводимость и прозрачность изменений, Gerrit обеспечивает полную историю рецензий.
Сравнение с другими системами
Gerrit часто сравнивают с другими инструментами рецензирования кода, такими как GitHub Pull Requests, GitLab Merge Requests и Bitbucket Pull Requests. Основные отличия:
- Модель рецензирования: Gerrit изначально спроектирован для строгого, многоэтапного рецензирования с обязательными оценками. GitHub и GitLab предлагают более гибкий, но менее формализованный процесс.
- Интеграция с Git: Gerrit работает на уровне Git-сервера, перехватывая push-запросы. GitHub и GitLab работают на уровне веб-интерфейса, создавая запросы на слияние (pull/merge request) на основе существующих веток.
- Производительность: Для очень больших проектов с тысячами разработчиков и миллионами строк кода Gerrit часто показывает более высокую производительность и масштабируемость, чем GitHub или GitLab, благодаря своей архитектуре.
- Сложность настройки: Gerrit считается более сложным в настройке и администрировании по сравнению с GitHub и GitLab, которые предлагают более простой интерфейс и готовые облачные решения.
Критика
Несмотря на свои преимущества, Gerrit подвергается критике за:
- Сложность интерфейса: Веб-интерфейс Gerrit, особенно в старых версиях, считается менее интуитивно понятным по сравнению с современными платформами.
- Крутая кривая обучения: Новым разработчикам может быть сложно освоить процесс отправки изменений через refs/for/ и понимание системы оценок.
- Ограниченные возможности для обсуждения: Встроенные инструменты для обсуждения (комментарии, форматирование) менее развиты, чем в GitHub или GitLab.
Интересные факты
- Название «Gerrit» происходит от имени голландского архитектора Геррита Ритвельда (Gerrit Rietveld), в честь которого также назван протокол Rietveld (первоначальное название системы).
- Исходный код самого Gerrit также управляется через Gerrit, то есть разработчики Gerrit используют свою же систему для рецензирования изменений в ней самой.
- В 2019 году компания Google объявила о переводе разработки Android на внутреннюю систему, однако Gerrit по-прежнему используется для внешних участников AOSP.
Источники
- Официальная документация проекта Gerrit Code Review (gerrit-documentation.storage.googleapis.com)
- Репозиторий исходного кода Gerrit на GitHub (gerrit-review.googlesource.com)
- Статья «Gerrit Code Review» в английской Википедии
- Материалы конференций и блогов, посвящённые разработке ПО и инструментам рецензирования кода
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →