Potrzebuję pomocy w zakresie filozofii i projektu konfiguracji ciągłej integracji.
Nasza obecna konfiguracja CI używa buildbota. Kiedy zacząłem go projektować, odziedziczyłem (cóż, niekoniecznie, ponieważ rok wcześniej byłem zaangażowany w jego projektowanie), niestandardowego konstruktora CI, który został dostosowany do uruchamiania całej wersji naraz. Po pewnym czasie zdecydowaliśmy, że to jest niewystarczające, i zaczęliśmy badać różne frameworki CI, ostatecznie wybierając buildbot. Jednym z moich celów w przejściu na buildbota (oprócz cieszenia się wszystkimi dodatkami typu whiz-bang) było przezwyciężenie niektórych niedociągnięć naszego na zamówienie nocnego konstruktora.
Żartujcie mi przez chwilę i pozwólcie mi wyjaśnić, co odziedziczyłem. Bazą kodu dla mojej firmy jest prawie 150 unikalnych aplikacji systemu Windows w języku c ++, z których każda jest zależna od jednej lub kilkunastu bibliotek wewnętrznych (a także wielu od bibliotek stron trzecich). Niektóre z tych bibliotek są współzależne i mają różne aplikacje, które (choć nie mają ze sobą nic wspólnego) muszą być zbudowane z tej samej kompilacji tej biblioteki. Połowa z tych aplikacji i bibliotek jest uważana za „starszą” i nieprzenośną i musi być zbudowana z kilku różnych konfiguracji kompilatora IBM (dla których napisałem unikalne podklasy Compile
), a druga połowa jest zbudowana ze studiem wizualnym.ShellCommand
s, ponieważ nie ma obsługi VSS).
Nasz oryginalny nocny konstruktor po prostu usunął źródło wszystkiego i zbudował rzeczy w określonej kolejności. Nie było sposobu na zbudowanie tylko jednej aplikacji, wybranie wersji lub grupowanie rzeczy. Uruchomiłoby maszyny wirtualne, aby zbudować wiele aplikacji. Nie był bardzo solidny, nie można go było dystrybuować. To nie było strasznie rozszerzalne. Chciałem być w stanie pokonać wszystkie te ograniczenia w buildbocie.
Sposób, w jaki to zrobiłem pierwotnie, polegał na tworzeniu wpisów dla każdej aplikacji, którą chcieliśmy zbudować (wszystkie 150 z nich), następnie tworzeniu wyzwalanych harmonogramów, które mogłyby budować różne aplikacje jako grupy, a następnie subskrybować te grupy w ramach ogólnego harmonogramu budowania na noc. Mogą one działać na dedykowanych urządzeniach podrzędnych (koniec z maszyną wirtualną), a gdybym chciał, mógłbym po prostu dodać nowych urządzeń podrzędnych. Teraz, jeśli chcemy wykonać pełną kompilację poza harmonogramem, jest to jedno kliknięcie, ale możemy również zbudować tylko jedną aplikację, jeśli chcemy.
Istnieją jednak cztery słabości tego podejścia. Jednym z nich jest złożona sieć zależności naszego drzewa źródłowego. W celu uproszczenia konserwacji konfiguracji wszystkie generatory są generowane z dużego słownika. Zależności są pobierane i budowane w niezbyt solidny sposób (mianowicie poprzez wyłączenie pewnych rzeczy z mojego słownika docelowego). Po drugie, każda kompilacja ma od 15 do 21 kroków kompilacji, które są trudne do przeglądania i przeglądania w interfejsie internetowym, a ponieważ istnieje około 150 kolumn, ładowanie trwa wiecznie (pomyśl od 30 sekund do wielu minut). Po trzecie, nie mamy już automatycznego wykrywania celów kompilacji (chociaż chociaż jeden z moich współpracowników dręczy mnie na ten temat, nie widzę, co nas do tego doprowadziło). Wreszcie,
Teraz, przechodząc do nowego rozwoju, zaczynamy używać g ++ i subversion (nie przenosząc starego repozytorium, pamiętaj - tylko dla nowych rzeczy). Zaczynamy też przeprowadzać więcej testów jednostkowych („więcej” może dać zły obraz ... bardziej jak każdy inny ) oraz testów integracyjnych (przy użyciu Pythona). Trudno mi znaleźć sposób, aby dopasować je do mojej istniejącej konfiguracji.
Więc gdzie popełniłem błąd filozoficznie tutaj? Jak najlepiej przejść dalej (dzięki buildbot - to jedyny element układanki, na którym mam licencję), aby moja konfiguracja była możliwa do utrzymania? Jak rozwiązać niektóre słabości mojego projektu? Co tak naprawdę działa w zakresie strategii CI dla dużych (prawdopodobnie nadmiernie) złożonych baz kodowych?
EDYTOWAĆ:
Myślałem, że wyjaśniłem swój problem, ale oczywiście nie byłem wystarczająco jasny. Ja nie szuka sugestii zmianę platformy CI. To się nie stanie, a odpowiedzi sugerujące, że nie zostaną zaakceptowane. Co ja chcę wiedzieć, jak inni ludzie zarządzać skomplikowanymi codebases wykorzystaniem CI. Mam tuzin różnych produktów i mam zależności rozrzucone na wiatr i wszystkie są różne. To jest to, co chcę wiedzieć, jak sobie z tym poradzić.