Ich brauche Hilfe bei der Philosophie und beim Design eines kontinuierlichen Integrations-Setups.
Unser aktuelles CI-Setup verwendet Buildbot. Als ich anfing, es zu entwerfen, erbte ich (nun ja, nicht streng, da ich ein Jahr zuvor an seinem Entwurf beteiligt war) einen maßgeschneiderten CI-Builder, der darauf zugeschnitten war, den gesamten Build über Nacht auf einmal auszuführen. Nach einer Weile entschieden wir, dass dies nicht ausreichend war, und begannen, verschiedene CI-Frameworks zu untersuchen und schließlich Buildbot zu wählen. Eines meiner Ziele beim Übergang zum Buildbot (abgesehen davon, dass ich alle Extras genießen konnte) war es, einige der Unzulänglichkeiten unseres maßgeschneiderten nächtlichen Builders zu überwinden.
Humor mich für einen Moment, und lassen Sie mich erklären, was ich geerbt habe. Die Codebasis für mein Unternehmen sind fast 150 einzigartige C ++ - Windows-Anwendungen, von denen jede von einer oder mehreren Dutzend interner Bibliotheken abhängig ist (und viele auch von Bibliotheken von Drittanbietern). Einige dieser Bibliotheken sind voneinander abhängig und haben abhängige Anwendungen, die (obwohl sie nichts miteinander zu tun haben) mit demselben Build dieser Bibliothek erstellt werden müssen. Die Hälfte dieser Anwendungen und Bibliotheken gilt als "Legacy" und nicht portierbar und muss mit mehreren unterschiedlichen Konfigurationen des IBM Compilers (für den ich eindeutige Unterklassen geschrieben habe Compile
) erstellt werden. Die andere Hälfte wird mit Visual Studio erstellt.ShellCommand
s, da VSS nicht unterstützt wird).
Unser ursprünglicher nächtlicher Baumeister hat einfach die Quelle für alles entfernt und Sachen in einer bestimmten Reihenfolge gebaut. Es gab keine Möglichkeit, nur eine einzige Anwendung zu erstellen, eine Revision auszuwählen oder Dinge zu gruppieren. Es würde virtuelle Maschinen starten, um eine Reihe von Anwendungen zu erstellen. Es war nicht sehr robust, es war nicht verteilbar. Es war nicht besonders erweiterbar. Ich wollte in der Lage sein, all diese Einschränkungen in Buildbot zu überwinden.
Die Art und Weise, wie ich dies ursprünglich getan habe, bestand darin, Einträge für jede der Anwendungen zu erstellen, die wir erstellen wollten (alle 150), dann ausgelöste Scheduler zu erstellen, die verschiedene Anwendungen als Gruppen erstellen konnten, und diese Gruppen dann unter einem allgemeinen nächtlichen Build-Scheduler zusammenzufassen. Diese könnten auf dedizierten Slaves ausgeführt werden (keine Schikanen für virtuelle Maschinen mehr), und wenn ich wollte, könnte ich einfach neue Slaves hinzufügen. Wenn wir jetzt einen vollständigen Build außerhalb des Zeitplans ausführen möchten, ist dies nur ein Klick, aber wir können auch nur eine Anwendung erstellen, wenn wir dies wünschen.
Es gibt jedoch vier Schwächen dieses Ansatzes. Eines ist das komplexe Abhängigkeitsnetz unseres Quellbaums. Um die Konfigurationswartung zu vereinfachen, werden alle Builder aus einem großen Wörterbuch generiert. Die Abhängigkeiten werden auf nicht besonders robuste Weise abgerufen und erstellt (nämlich bestimmte Dinge in meinem Build-Target-Wörterbuch abtasten). Das zweite ist, dass jeder Build zwischen 15 und 21 Build-Schritte hat, was in der Weboberfläche schwer zu durchsuchen und zu betrachten ist. Da etwa 150 Spalten vorhanden sind, dauert das Laden ewig (zwischen 30 Sekunden und mehreren Minuten). Drittens haben wir keine automatische Erkennung von Build-Zielen mehr (obwohl ich, so sehr mich einer meiner Kollegen darüber belästigt, nicht sehe, was uns das überhaupt gebracht hat). Schließlich,
Jetzt, da wir uns der neuen Entwicklung zuwenden, beginnen wir, g ++ und Subversion zu verwenden (das alte Repository nicht zu portieren, wohlgemerkt - nur für die neuen Dinge). Außerdem beginnen wir mit mehr Unit-Tests ("mehr" könnte das falsche Bild ergeben ... es ist eher wie bei jedem anderen ) und Integrationstests (mit Python). Es fällt mir schwer herauszufinden, wie ich diese in meine vorhandene Konfiguration integrieren kann.
Also, wo habe ich mich hier philosophisch geirrt? Wie kann ich am besten vorgehen (mit Buildbot - es ist das einzige Puzzleteil, an dem ich arbeiten kann), damit meine Konfiguration tatsächlich gewartet werden kann? Wie gehe ich auf einige Schwächen meines Designs ein? Was funktioniert wirklich in Bezug auf CI-Strategien für große (möglicherweise über-) komplexe Codebasen?
BEARBEITEN:
Ich dachte, ich hätte mein Problem erklärt, aber offensichtlich war ich nicht klar genug. Ich suche keine Vorschläge zum Ändern von CI-Plattformen. Es wird nicht passieren und Antworten, die darauf hindeuten, dass dies nicht akzeptiert wird. Ich möchte wissen, wie andere Leute komplizierte Codebasen mit CI verwalten. Ich habe ein Dutzend verschiedene Produkte im Quadrat , und ich habe Abhängigkeiten, die im Wind verstreut sind, und sie sind alle unterschiedlich. Damit möchte ich wissen, wie ich damit umgehen soll.