Всем привет! Я расскажу о том как можно написать простой поиск коммитов в Azure DevOps. Те кто не любит много букв, могут сразу перейти к коду. Зачем же понадобился свой "велосипед" в дополнение к стандартному поиску?
В данный момент мы используем микросервисную архитектуру. Каждый сервис живет в своем отдельном репозитарии. Как следствие общее число репозитариев у нас довольно большое (порядка 400), а для решения одной задачи по спринту зачастую приходится вносить изменения в несколько разных репозитариев.
Стандартный поиск великолепно ищет требуемое в исходниках. Но к сожалению он не умеет искать по коммитам. В итоге довольно тяжело и муторно искать коммиты, если они были разбросаны по нескольким репозитариям. Данная проблема озвучена 4 года назад и, возможно, когда-нибудь будет решена. Но так как ждать не очень интересно разработаем свой
Подход к решению задачи
Вычитываем всю нужную информацию по коммитам.
Сохраняем информацию в Elastic.
Делаем поиск в Elastic.
Получение информации по коммитам
Для получения коммитов я использовал стандартного клиента. Реализация в этом модуле.
К сожалению, нельзя вычитать коммиты без привязки к репозиторию. То есть чтобы просто получить список коммитов нужно сделать по запросу на каждый репозиторий.
Коммиты интересны конечно же в основной бранч. Компания у нас продвинутая, и так как слово master внезапно стало оскорбительным, в части репозиториев основной бранч именуется как main. К двойному сожалению в критерии для поиска коммитов можно задать только один бранч.
Сохранение информации в Elastic
Для работы с Elastic я использовал стандартного клиента Nest. Реализация в этом модуле.
Для сохранения потребуется создать индекс. В индексе помимо свойств коммита используется аггрегирующее свойство AllData. Таким образом можно будет искать сразу по всем свойствам через And.
Для ускорения процесса документы в Elastic добавляются не по одному, а батчами. Не забываем проверять результат добавления на успешность.
Автоматизация процесса
Сделана с помощью Azure Functions. Функция UpdateIndexFunction каждые полчаса инкрементально обновляет информацию по коммитам в Elastic. Функция SearchFunction реализует клиентские запросы на поиск.
Входные параметры задаются здесь.
Данный файл можно использовать с клиента для поиска и отображения результатов (нужно будет подправить url на задеплоенный)
Интеграция c Jira
В предыдущей статье я рассказывал о том, как можно получить информацию из Jira. Соответственно данный поиск можно расширить за счет информации из Jira, а именно к каждому коммиту привязать номер\summary задачи, номер\summary родительской задачи, название команды, название спринта и т.д. В итоге можно будет с легкостью находить коммиты по самым разным запросам - например - 'найти все коммиты для данной истории', 'найти все коммиты команды за предыдущий спринт' и т.д.
P.S.
В итоге получаем возможность искать требуемые коммиты по нужным запросам. Информация о коммитах автоматически обновляется. Поиск работает крайне шустро.
Данная фича будет наиболее востребована, когда коммиты для одной задачи попадают в разные репозитории. Так же пригодится новичкам в команде, чтобы находить коммиты для похожих задачек.
Всем спасибо за внимание!