Привет! Меня зовут Максим, я руковожу мобильной разработкой в KTS.

Сегодня расскажу о нашем опыте работы с системами код-ревью, и почему через 5 лет работы на Upsource мы переехали на GitLab.

Код-ревью позволяет разработчикам выявлять ошибки и уязвимости кода, поддерживать работу в команде, совершенствовать архитектурные решения проектирования систем. Главная цель процесса в совершенствовании кодовой базы разработчиков. Поэтому при проверке они в первую очередь думают о том, как написанный код повлияет на весь проект в перспективе.

Более подробно код-ревью рассматривать не будем, поскольку материалы уже есть:

Наша команда мобильной разработки использовала Upsource с 2017 года: на тот момент он был одним из самых удобных инструментов для просмотра кода, комментирования и изучения правок. Мы использовали selfhosted-вариант сервиса.

Однако по мере роста команды и изменения процессов мы столкнулись с проблемами, которые подтолкнули нас к поиску нового сервиса.

Содержание:

Ключевые проблемы с использованием Upsource

«Ручное» оповещение о ревью. Мы заметили, что на этапе код-ревью работа команды часто затягивается. По процессу каждый разработчик раз в день в удобное для себя время садится и просматривает назначенные на него ревью. И все равно всем периодически приходилось напоминать друг другу о просмотре, так как оповещения в браузере от Upsource работали с переменным успехом и не у всех. В итоге получался монотонный ручной процесс: сначала сотруднику нужно создать ревью в Upsource, указать ревьюеров и оповестить их в Telegram. Затем там же ревьюер отписывается об апруве или необходимости доработки. Если ревьюер забыл посмотреть, его нужно пнуть. Если доработок много, цепочка повторяется несколько раз. 

Снижение скорости ревью. Upsource часто подвисал на ревью с большим количеством коммитов или изменений, хотя машина соответствовала требованиям. Особенно это заметно при просмотре правок: ревьюер проходит по каждому коммиту и смотрит изменения точечно. Открытие каждого следующего коммита с задержкой тратит время и нервы разработчиков.   

Дублирование между GitLab и Upsource. В качестве системы для работы с кодом у нас используется GitLab.

Во всех проектах настроены CI/CD-пайплайны, которые должны быть успешно завершены перед тем, как мы вольем задачу в основную ветку. Для прогона пайплайнов разработчики создают Merge Request в GitLab. Дополнительно ревью нужно создавать и в Upsource — увеличивается количество ручной работы. 

Казалось бы, что можно связать таск-трекер с системой код-ревью и исправить это. Для работы с задачами мы используем YouTrack, который, в отличие от Upsource, хостится не у нас, а в облаке, из-за чего связать их вместе для автоматического создания ревью в такой конфигурации невозможно. Интересно, что обе эти системы от JetBrains, а ограничения накладываются. Хотя, например, для интеграции Upsource с Jira таких ограничений нет. 

Эту проблему можно решить с помощью ручного связывания Upsource и GitLab с помощью промежуточной написанной нами системы, которая будет работать с вебхуками и API. 

Upsource переехал в JetBrains Space. 31 января 2022 года JetBrains в своем блоге объявил о прекращении продаж новых лицензий Upsource и переезде платформы в систему JetBrains Space. Хотя бесплатная версия продукта остается доступна, и нам она вполне подходит, потому что на Upsource сидела только мобильная команда. И все же есть несколько «но»: перестают выходить новые версии, а переход на Space всей компании невозможен — он требует значительного увеличения бюджетов, и многие процессы уже настроены на использование GitLab. 

Так мы встали перед вопросом: менять ли сервис код-ревью или оставаться на Upsource и решать возникающие проблемы.

Мы решили посмотреть другие варианты: переезд Upsource в Space стал ключевым пунктом. Upsource использовала только небольшая команда мобильной разработки, поэтому потенциальный переезд не будет болезненным. 

Первый взгляд на GitLab

Было решено попробовать GitLab — другие отделы разработки в нашей компании использовали его. Другие сервисы мы не рассматривали по нескольким причинам:

  • Крупные сервисы привязаны к общей инфраструктуре компании-разработчика: Atlassian, JetBrains, GitHub. Ради код-ревью мобильной команды мы были не готовы производить глобальные изменения во всей компании. 

  • Другие команды в KTS, которые уже использовали GitLab, не замечали серьезных недостатков. 

  • Мобильная команда использовала GitLab как git-систему и CI/CD.

Чтобы оценить эффективность работы с код-ревью и удовлетворение всех требований, GitLab нужно было испытать в «боевом» режиме. Переводить всю команду на тестирование было нецелесообразно, поэтому первыми его опробовали наши android-разработчики. Они поделились опытом за две недели использования, рассказали о плюсах и минусах сервиса.

По отзывам у GitLab не оказалось серьезных недочетов. Большинство минусов показались делом привычки. Преимущества, напротив, были сразу видны: они закрывали основные проблемы выше. 

Основное различие систем в том, что Upsource предназначен исключительно для код-ревью, а GitLab объединяет множество функций: git-систему, CI/CD, и другие, менее важные для нас.

Следующим шагом стал переезд всей мобильной команды в GitLab на два месяца «пробного периода». После этого мы снова собрали фидбек и заметили, что многие работники уже привыкли к особенностям GitLab, изначально показавшиеся им неудобными. 

Сравнение Upsource и Gitlab

Сравнение сервисов по нашим основным требованиям приведено в таблице. Преимущество системы в рамках пункта выделено медалью ????.  

Что сравниваем

GitLab 

Upsource

Интеграция с внешними сервисами

???? Поддерживает YouTrack и другие сервисы

Нужно облачное решение для интеграции с YouTrack Cloud, есть интеграция с Jira

Навигация по списку ревью и лист ожидания

Внутри проекта/на странице активности

Внутри проекта/на главной странице

Создание ревью

Только для ветки

В бесплатной версии один ревьюер на MR

???? Гибкая возможность создания ревью по веткам и отдельным коммитам

Множество ревьюеров на код-ревью

Навигация по коммитам в ревью

Можно смотреть либо все коммиты, либо по одному

Можно выбирать подмножество коммитов, смотреть по одному коммиту не очень удобно

Комментирование кода

???? По строчкам, по блокам кода


Более удобный редактор комментариев c Markdown, поддержка Quick actions

По строчкам


Поддержка Markdown


Просмотр кода

«Ручное» проставление отметки о просмотре

Есть сторонний плагин, позволяющий смотреть MR внутри IDE

???? Удобный просмотр ревью: компактный режим, автоматическая отметка просмотра файлов

Интеграция с IDE для просмотра ревью

Просмотр комментариев и обновленного кода

Комментарии не всегда видны внутри кода, сложнее проходить по комментариям и резолвить ветки обсуждений

???? Удобная работа при обновлении ревью: комментарии всегда видны в файле при обновлении кода, измененные файлы подсвечиваются

Работа с коммитами

???? Уведомление о конфликтах, настройка squash, merge из интерфейса MR

Только просмотр


Статистика по ревью

Очень базовая статистика в разделе Overview:
— количество коммитов
— количество измененных файлов и строк кода
— количество обсуждений/нерешенных во всем MR

???? Детальная статистика по ревью:
— количество просмотренного кода
— количество комментариев по файлам
— количество решенных комментариев

Интеграция с CICD

???? Pipeline по этой же ветке внутри MR: можно смотреть информацию по сборке и ее артефакты, отчеты

Не поддерживается



Поддержка

???? Активная поддержка и регулярные обновления

Развивается в рамках Space

Расширение

???? Интеграция с GitLab Bot в рамках KTS 
Можно расширять с помощью webhook

Можно расширять с помощью webhook

Оповещения

Email

Email, в браузере

Не все эти требования для нас равнозначны, поэтому нельзя посчитать преимущества и сказать, что GitLab победил Upsource со счетом 6:4. Но надеюсь, для вас эта таблица будет полезна. 

Выше я сказал, что одна из главных проблем — «ручное» оповещение о ревью, которая не решалась из коробки в обеих системах. Поэтому мы рассмотрели возможность интеграции GitLab с нашим корпоративным ботом: его возможности постепенно будут расти для закрытия всех потребностей.

Интеграция с GitLab Bot

Изначально GitLab Bot — внутренняя разработка KTS, который оповещает в Telegram об изменениях статусов CICD pipeline. Чем это помогает:

  • разработчику не приходится постоянно входить в GitLab, чтобы удостовериться, что его pipeline успешно завершился

  • тестировщики сразу получают ссылки для тестирования функционала по успешной раскладке сервиса или распространения сборки 

Выглядит это так:

В новой версии бота наши бэкенд-разработчики добавили интеграцию с MR GitLab по части работы с код-ревью. Это решает главную проблему ручных оповещений о ревью в Upsource и минимизирует человеческий фактор, когда разработчик может забыть отписаться ревьюеру, а сам ревьюер — просмотреть код. Все взаимодействие по проектам компании ведется в Telegram, поэтому это решение эффективно и удобно для нас.

Создание ревью

Теперь, когда кто-то создаст новый Merge Request и назначит там главного, бот автоматически уведомит человека об этом: в сообщении указываются проект, название ветки, автор и ссылка на MR:

Комментарий по ревью

В GitLab можно создавать комментарии для решения возникающих рабочих вопросов. При завершении просмотра всего кода и отправке комментариев в MR бот сразу отправит об этом уведомление с названием проекта, ссылкой на MR, веткой и автором комментария:

Апрув ревью

Когда статус MR меняется — например, ревьюер его заапрувил — бот также присылает об этом сообщение:

Бот удобен, но некоторых возможностей все же не хватает. Поэтому мы планируем кое-что доработать: 

  1. Множественные ревьюеры. В GitLab уже есть возможность выбора нескольких ревьюеров, но только в платной версии. Функция необходима ограниченному количеству команд, поэтому ради нее нерационально всей компанией переходить на платный тариф. Мы думаем о реализации такого варианта через бота.   

  2. Разделить оповещения сборок от оповещений MR. GitLab Bot шлет оповещения в один чат. В разгар рабочего дня сообщения о комментариях и новых ревью теряются в основной массе уведомлений от сборок. Чтобы не терять нужные оповещения, мы хотим разделить их по типам.

  3. Напоминание о просмотре. Бот отправит сообщение о новом ревью, но специалист может отвлечься на другую важную задачу и забыть. Поэтому мы собираемся научить бота отправлять напоминание о непросмотренном ревью: например, если в течение дня ревьюер не оставил каких-либо комментариев или не апрувнул код. 

Резюме: почему Gitlab?

  1. Переход на GitLab позволил нам отказаться от использования отдельного сервиса для код-ревью: теперь все находится в рамках одного рабочего инструмента.

  2. Сервис продолжает постоянно развиваться. Upsource же недоступен внутри Space, у него нет поддержки и выхода новых версий.

  3. Сама система показывает более стабильную работу с ревью с большим количеством правок и комментариев.

  4. GitLab помогает получать более полную и подробную информацию о процессе разработки прямо внутри MR: статусы сборок, CI/CD pipeline, отчеты по задачам. 

  5. Интеграция GitLab с нашим корпоративным ботом помогла решить проблему с замедлением работы при «ручном» общении: сотрудники автоматически получают оповещения о назначении ревью и появлении в нем новых комментариев. Теперь процесс разработки будет проходить без «застойного» периода. 

GitLab стал эффективным инструментом для код-ревью мобильной команды KTS: он полностью отвечает требованиям и специфике работы. Разумеется, для других компаний или команд разработки выбор может отличаться в зависимости от задач. 


Поделитесь в комментариях, какие требования предъявляете к подобным сервисам? С какими проблемами сталкивались и как решали?

Комментарии (16)


  1. GBR-613
    14.07.2022 22:10
    +7

    Я не понял, зачем вам вообще какой то Upsource, если Gitlab был с самого начала?

    Кстати, в том Gitlab, который я инсталлировал, почему то все уведомления присылаются без всякого бота. И это без того, чтобы я что-то специальное для этого делал.


    1. MAX1993M Автор
      15.07.2022 13:02

      Базовый функционал MR был действительно доступен в gitlab достаточно давно. В компании его пробовали, но он оказался неудобным в своих первых версиях. В тот момент и начали использовать Upsource. Посмотрите описание фичей MR в у gitlab, большинство из них было добавлено в 13 версии, до этого он совсем не дотягивал до Upsource.

      По поводу бота - ответил ниже


  1. Temoxa
    15.07.2022 09:53

    Бот умеет тоже самое что и гитлаб из коробки, только настраивается оповещения на почту. Туда приходит инфа и когда тебя назначили ревью делать, и если твой пайп упал, и если треды по коду делают) пока зачем нужен бот не вкурил


    1. MAX1993M Автор
      15.07.2022 12:57

      Вкратце подсвечу основные моменты, по которым мы используем бота, а не оповещения от гитлаба:

      • в бота можно передавать любые параметры в зависимости от проекта (ссылки для тестировщика на разложенную версию сервиса или приложения). это достигается тем, что бота можно дергать из cicd пайплайна напрямую, а не только через вебхуки

      • можно рассылать оповещения не только автору, но и другим членам команды

      • множественные ревьюеры в бесплатной версии гитлаба

      • напоминалка о непросмотренных ревью

      • интеграция с Telegram (основной канал рабочей коммуникации, почтой не пользуемся)


      1. murashovalexander
        15.07.2022 15:43

        неплохо)

        можно рассылать оповещения не только автору, но и другим членам команды

        через стандартную настройку оповещения любой член команды может настроить себе оповещение в гитлабе.

        А какие планы на будущее? Взаимодействия какие-то? Запуск сборок из чата? Бот работает только с одним проектом или с несколькими может работать?


        1. MAX1993M Автор
          15.07.2022 18:34

          По планам на будущее: пока доработать нюансы процесса для моб команды, которые описаны в статье. Большинство полезных идей приходит в процессе пользования ботом.

          Запуск сборок из чата - кажется лишним функционалом тк. у нас ручные сборки почти никогда не запускаются. Все происходит по пушу.

          Бот работает со всеми проектами внутри гитлаба компании. Разработчику доступны оповещения о проектах в соответствии с правами гитлаба, настройки оповещений от проектов можно настраивать в интерфейсе бота, чтобы разработчик не получал информацию от ненужных в настоящий момент проектов.


  1. RomeroMsk
    15.07.2022 10:44
    +2

    В статье упоминается JetBrains Space, но в голосовании его почему-то нет. Поделюсь опытом.

    Мы прошли примерно тот же путь, когда поняли, что и без того не идеальный Upsource окончательно умирает. Только выбор пал на Space, плюс мы держим код в GitHub. Тоже в "боевом режиме" на нескольких проектах опробовали его, нашли положительные и отрицательные моменты и приняли решение об окончательном переезде. Тоже понадобилось время на привыкание и перестраивание некоторых привычек. Вот уже 4 месяца пользуемся. Несмотря на некоторые недостатки, общее впечатление от проведения код ревью в Space весьма положительное, для нашей команды он точно суммарно удобнее, чем Upsource.

    переход на Space всей компании невозможен — он требует значительного увеличения бюджетов, и многие процессы уже настроены на использование GitLab

    Если от всего "комбайна" Space больше особо ничего не нужно и лимиты функционала устраивают, код ревью можно пользоваться бесплатно. Нам вполне хватает, кроме код ревью ничего пока не заинтересовало, код всё так же в GitHub (где настроены экшены для CI/CD).

    К сожалению, фича-реквесты закрываются весьма не быстро, некоторые висят без реакции по несколько месяцев. Но даже текущий функционал вполне радует.


    1. vandrianova
      15.07.2022 15:52
      +1

      Спасибо за обратную связь о нашем продукте. Так как я являюсь частью команды, нам было бы очень полезно узнать подробнее, какие отрицательные моменты вы отметили в Space. Касаются ли они код ревью? Что останавливает от переезда с GitHub на Space Git хостинг?


      1. RomeroMsk
        15.07.2022 16:21
        +2

        Поскольку пользуемся только код ревью, все отрицательные моменты касаются только этого инструмента. Ниже привожу список всех недостатков и неудобств, по большей части связанных с привычками после Upsource.

        • Неудобства, требующие бОльших затрат времени на проведение ревью:

          • [Issue] Автор ревью не назначается автоматически, когда оно создается из PR в GitHub. PR в GH нам по-прежнему нужны, т.к. на них построен CI/CD. И создавать ревью вручную (не автоматически из PR) каждый раз будет неудобно

          • [Issue] Автоматически не выбираются комиты, сделанные после твоего последнего акцепта/запроса изменений

          • [Issue, duplicated] Нет дескрипшена код ревью, куда хотелось бы вставлять ссылку на таск-трекер (при автоматическом создании ревью из PR описание тоже не синхронизируется, как было в Upsource). Приходится кидать ссылку в Timeline, где ее выискивать глазами не удобно, особенно когда чат уже сильно разросся

          • [Issue] Нет возможности перейти из ревью в PR в GitHub (например, чтобы проверить экшены)

          • [Issue, duplicated] Скролл сквозь все файлы может привести к случайному пролистыванию файла. Плюс эта фича не позволяет удобно прыгать между файлами, т.к. обратно возвращаешься в начало, а не запомненную позицию. Поштучный просмотр файлов, как в Upsource, в виде настраиваемой опции был бы идеальным решением

        • Проблемы интеграции с другими инструментами:

          • При мерже ревью оригинальный PR в GH просто закрывается (причем, от имени юзера-владельца репозитория в Space). В JIRA затем такие PR отображаются как DECLINED. В качестве решения мержим PR в самом GH и не пользуемся кнопкой мержа в Space

          • Мержи напрямую в Space - в целом, не очень удобный подход при работе с GitHub. В частности, в списке коммитов в GH при деплое не будет ссылок на PR для всех комитов, смерженных через Space

          • Чтобы заработала интеграция с PhpStorm, приходится клонировать проект заново из ssh://git@git.jetbrains.space/....git (существующий в PhpStorm проект, залинкованный на GitHub репозиторий - не распознается плагином)

        • Проблемы интерфейса (возможно, частично исправлены):

          • Если обсуждения скрыты, то после нажатия на иконку любого из них невозможно снова скрыть его

          • Усложняется восприятие диффа, если включить Split View и смотреть на код с длинными строками: перенос строк порождает новые (ненумерованные) строки в диффе

          • Стрелки для перехода к следующему найденному совпадению - перестают работать и снова начинают, если переключаться между Unified и Split View

          • Новые файлы попадают в область поиска при включенной опции Left, хотя ожидается, что Left/Right - это до/после

          • Если список изменений довольно большой, при сворачивании одной из папок в дереве файлов перестает корректно синхронизироваться позиция скролла в дереве файлов с панелью просмотра изменений

          • Не запоминаются свернутые папки в дереве файлов, если его скрыть/развернуть

        • Мелочи:

          • Нет возможности увидеть, когда ревьювер смотрел ревью в последний раз и сколько файлов ему еще осталось

          • Нет возможности в один/два клика скопировать путь к файлу в ревью


        1. vandrianova
          15.07.2022 17:06
          +2

          Спасибо большое за очень подробный и полезный фидбэк!


          1. RomeroMsk
            15.07.2022 17:13

            Не за что. Надеюсь, он поможет сделать продукт лучше.

            Автоматическое добавление ссылки на PR GitHub и возможности оставлять произвольное описание к ревью (возможно, автоматически копируемое из описания PR) очень сильно упростят жизнь ревьюверам и мержерам. Думаю, после недавнего появления удобного сайдбара проблем с размещением этих новых элементов возникнуть не должно ;)


      1. RomeroMsk
        15.07.2022 16:23
        +1

        От переезда с GitHub останавливает отлаженная годами работа экшенов (CI/CD) и прочие фичи Enterprise-аккаунта, которыми активно пользуется несколько команд в компании. Убедить руководство потратить ресурсы на переезд - будет очень не просто. И весомых преимуществ никто не видит.


  1. murashovalexander
    15.07.2022 15:29

    Так в чём суть "бота"? Это же всё (и даже больше) есть в простом оповещении на почту. По сути, это не бот, а просто костыль-оповещатель (ради чего? чтобы люди, которых нет в GitLab могли видеть работу, доступ к ссылкам получать вовремя)?


    1. MAX1993M Автор
      15.07.2022 15:33

      Про бота ответил тут.

      Не все требуемые возможности есть в оповещении гитлаба. Плюс мы дорабатываем бота. Кейс со ссылками - это только пример использования. и это полезно: чтобы не спрашивать постоянно разработчиков, где проверять фичу, собралась ли сборка


  1. Paulus
    16.07.2022 00:33

    Тоже перешли на gitlab, по сравнению с прошлыми продуктами не хватает тикетов. Если кто-то в одном проекте находит баг в другом, то в какое место gitlab и что он должен сделать, чтобы баг был исправлен? Как вы отслеживаете баги и их испраления в gitlab?


    1. MAX1993M Автор
      16.07.2022 12:50

      Для задач мы используем youtrack. Кажется, что issues решают вашу задачу