оптимизировать время компиляции в непрерывной интеграции

Может быть, это просто мечта сумасшедшего, но ...

В моей компании у нас есть большой проект C # .NET с ~ 25 растворов (очень старых) и ~ 3,5 млн. loc. Проблемы, с которыми я сталкиваюсь: слишком медленное время сборки, сейчас это занимает 7 минут с SSD (машины разработки), 15 минут + в виртуальной машине с обычными жесткими дисками (это была бы система сборки TeamCity, которую я бы хотел развернуть). Я знаю, что система сборки должна быть самой быстрой, но я ничего не могу изменить в ближайшее время.

Я хочу сократить цикл обратной связи commit-build-unittest для разработчиков (желательно прямо сейчас на машине Teamcity), просто скомпилировав проекты, которые были затронуты последней фиксацией, взяв все остальные сборки, например, из локальный сервер nuget (сам сервер teamcity с версией 7.0).

Теперь это значительно сократит цикл обратной связи (с 15 минут до менее минуты, учитывая настоящие модульные тесты) для небольших коммитов.

Я знаю, что проблема такой частичной компиляции заключается в возможности пропуска ошибок компиляции (несовпадающие интерфейсы могут остаться незамеченными), но это можно смягчить, запустив второй (Teamcity?) Экземпляр сервера сборки, который запускает всю энчиладу, в параллельно. Но для меня очень очень важно получить первую обратную связь немедленно.

Теперь мой вопрос: есть ли какая-нибудь система сборки / система непрерывной интеграции, которая может справиться с этой задачей? Или мне придется написать свою собственную фоновую службу с поддержкой фиксации? Это было бы немного неприятно, поскольку мы используем сценарии FinalBuilder, и этот формат, похоже, не читается никаким API (но не углубился в это достаточно глубоко).

P.S .: Кроме того, я хотел бы запускать модульные тесты только для проектов, которые были изменены последней фиксацией, или, по крайней мере, определять их приоритетность. Но это запоздалая мысль.

6
задан Cœur 20 May 2019 в 10:05
поделиться