Ab wann ist ein Continuous Integration Server interessant?

9

Ich habe ein bisschen über CI-Server wie Jenkins gelesen und frage mich: An welchem ​​Punkt ist es nützlich?

Denn für ein kleines Projekt, bei dem Sie nur 5 Klassen und 10 Komponententests haben würden, besteht sicherlich keine wirkliche Notwendigkeit.

Hier haben wir ungefähr 1500 Komponententests und sie bestehen (auf alten Core 2 Duo-Workstations) in ungefähr 90 Sekunden (weil sie wirklich "Einheiten" testen und daher sehr schnell sind). Wir haben die Regel, dass wir keinen Code festschreiben können, wenn ein Test fehlschlägt.

Daher startet jeder Entwickler alle seine Tests, um eine Regression zu verhindern.

Da alle Entwickler immer den gesamten Test starten, werden Fehler aufgrund widersprüchlicher Änderungen festgestellt, sobald ein Entwickler die Änderung eines anderen (falls vorhanden) abruft.

Mir ist immer noch nicht ganz klar: Soll ich einen CI-Server wie Jenkins einrichten? Was würde es bringen?

Ist es nur nützlich für den Geschwindigkeitsgewinn? (in unserem Fall kein Problem)

Ist es nützlich, weil alte Builds neu erstellt werden können? (aber wir können dies mit Mercurial tun, indem wir alte Drehzahlen überprüfen)

Grundsätzlich verstehe ich, dass es nützlich sein kann, aber ich verstehe nicht genau warum.

Jede Erklärung unter Berücksichtigung der oben angesprochenen Punkte wäre sehr willkommen.

Cedric Martin
quelle

Antworten:

9

Ist es nur nützlich für den Geschwindigkeitsgewinn? (in unserem Fall kein Problem)

Jede Zeit, die Sie damit verbringen, Ihren Prozess zu durchlaufen, ist Zeit, die Sie hätten verbringen können, um in den Fluss der Entwicklung einzusteigen.

Sie sparen auch Zeit bei Meilensteinen, da Sie im Idealfall vollständig verpackte und versandfertige Bits erstellen, die direkt auf CD gebrannt, ins Internet hochgeladen usw. werden können.

Ist es nützlich, weil alte Builds neu erstellt werden können? (aber wir können dies mit Mercurial tun, indem wir alte Drehzahlen überprüfen)

Nein, Sie erstellen keine Builds neu. Sie verwenden den erstellten Build und behalten ihn bei, bis Ihre Aufbewahrungseinstellungen ihn wegwerfen.

Sie erstellen es auf dem Build-Server, im Gegensatz zu einer Dev-Box.

Hier haben wir ungefähr 1500 Komponententests und sie bestehen (auf alten Core 2 Duo-Workstations) in ungefähr 90 Sekunden (weil sie wirklich "Einheiten" testen und daher sehr schnell sind). Wir haben die Regel, dass wir keinen Code festschreiben können, wenn ein Test fehlschlägt.

Möchten Sie nicht in der Lage sein, automatisierte Integrations- oder End-to-End-Tests für Ihren Code durchzuführen und Probleme zu erkennen, die bei Komponententests nicht erkannt werden?

Sie möchten diese nicht auf Entwicklungsboxen ausführen, da es mühsam wäre, diese Umgebung einzurichten und zu warten. Integrationstests sind in der Regel auch sehr langsam auszuführen.

an welchem ​​Punkt ist es nützlich?

Es ist eine Investition wie jede andere.

Verwenden Sie es einmal und Sie könnten hinterher kommen oder nur die Gewinnschwelle erreichen. Verwenden Sie es für mehrere Projekte, und Sie werden wahrscheinlich die Nase vorn haben.

Dies hängt auch von der Art der von Ihnen vorgenommenen Anwendungen ab.

Wenn Sie Webanwendungen erstellen, die auf einem Java Application Server oder IIS bereitgestellt werden müssen, ist CI ein Kinderspiel. Gleiches gilt, wenn Sie eine Datenbank als Teil Ihres Projekts haben. Die manuelle Ausführung der Bereitstellung ist schmerzhaft, und Ihr QS-Team (falls vorhanden) benötigt sie irgendwann so oft wie täglich.

Vielleicht möchten Sie auch sehen, wie Ihre Bedürfnisse und Probleme mit Joel Spolskys 12 Schritten zu besserem Code übereinstimmen . Besonders 2, 3 und 10 (obwohl sie alle interessant und wichtig sind).

Merlyn Morgan-Graham
quelle
2
+1 ... OK, jetzt sprichst du mit mir! Das Argument "keine Zeit zu verlieren, wenn man baut" gefällt mir sehr gut. Unser Build wird mehrmals täglich durchgeführt und dauert nur einen Klick, aber ... es ist langsamer als das Ausführen aller Tests (daher verlieren Entwickler Zeit). Ich mag auch die Idee komplizierterer Tests: Ich sehe, wie wir von einem CI-Server profitieren können. Zu 2,3 ​​und 10: Ja, Ja und Ja (ein einziger Klick auf eine Ant-Aufgabe) ... Aber Mann, diese 12 Regeln sollten aktualisiert werden: Verwenden Sie die Quellcodeverwaltung? Ich hätte zum Beispiel lieber nicht als CVS; ) (nur ein Scherz;)
Cedric Martin
7

Ab wann ist es sinnvoll?

  • Ihr Build + Test-Zyklus dauert einige Minuten. Mit einem 5-minütigen Testlauf möchten Sie nicht mehr alle Tests selbst ausführen, insbesondere bei kleinen Änderungen.
  • Sie beginnen mit dem Erstellen mehrerer Varianten. Wenn Sie mehrere Kunden mit unterschiedlichen Anpassungen haben, sollten Sie die Tests für jede Variante ausführen, damit der Arbeitsaufwand recht schnell zunimmt. Dann würden Sie die Testsuite für eine Variante auf dem Entwicklercomputer ausführen und sie CI überlassen, um sie auf dem Rest auszuführen.
  • Sie schreiben automatisierte Integrationstests, für die eine nicht triviale Einrichtung der Testumgebung erforderlich ist. Dann möchten Sie gegen eine kanonische Testumgebung testen, da die Umgebung der Entwickler aufgrund der Entwicklungsänderungen möglicherweise auf verschiedene Weise geändert wird. Das CI ist am besten für die kanonische Umgebung geeignet.
  • Tester können einfach den neuesten Build von CI abrufen. Daher müssen sie weder die Entwicklungstools haben, lernen und verwenden, noch muss ihnen ein Entwickler ihren Build manuell senden.
  • Wenn Sie sich auf die Veröffentlichung vorbereiten:
    • Das Testen wird immer wichtiger, daher ist es noch nützlicher, einen Platz mit vorbereiteten Builds für den Test zu haben.
    • Sie sind sicher, dass alle Builds mit derselben Build-Umgebung erstellt werden, sodass Sie Probleme vermeiden, die durch geringfügige Unterschiede zwischen Entwicklerinstallationen entstehen können.
    • Sie sind sicher, dass Sie genau das erstellen, was im Versionskontrollsystem überprüft wird. Wenn jemand während der Entwicklung vergisst, etwas einzuchecken, werden Sie schnell feststellen, dass dies für den nächsten Entwickler fehlschlägt. Aber wenn ein solcher Build in die Qualitätssicherung oder in die Produktion abrutscht und sie einen Fehler melden, wird es sehr schwer, ihn zu verfolgen.

Sie brauchen CI wahrscheinlich noch nicht, aber ich denke, es wird nützlich sein, wenn Sie in die Testphase kommen. Jenkins ist in wenigen Stunden eingerichtet und vereinfacht Ihre Tests und hilft, dumme Fehler zu vermeiden (die besonders dann auftreten, wenn Sie sich schnell um die Produktion kümmern).

Jan Hudec
quelle
+1, danke. Aber das Build-Argument, das ich nie wirklich verstanden habe: Ist die App nicht robuster, wenn alle Entwickler jede Version auschecken und genau den gleichen Build auf ihrem Computer erstellen können? Verschieben wir nicht einfach das Problem "Builds, die an ein Entwicklerkonto gebunden sind" auf " Builds , die an den CI-Server gebunden sind" ? Ich meine: Der CI-Server selbst ist möglicherweise falsch konfiguriert und der Build hängt daher vom subtilen Unterschied in der Installation des CI-Servers ab!? Das heißt, ich weiß, dass es nützlich sein kann: Ich denke, ich muss es nur "installieren und sehen"
Cedric Martin
@CedricMartin: Der CI-Server ist nur einer, sodass Sie keinen Fehler haben, der durch den Unterschied zwischen den Umgebungen, in denen Sie dies getan haben, und dem vorherigen Build verursacht wurde. Da Sie keine anderen Arbeiten am CI-Server ausführen, ist es weniger wahrscheinlich, dass Sie ihn beschädigen .
Jan Hudec
@CedricMartin: Wenn der CI-Server falsch konfiguriert ist, werden Sie feststellen, dass sich die Builds anders verhalten als die auf Entwicklerboxen, da Entwickler die ganze Zeit für sich selbst kompilieren. Einfacher als wenn eine bestimmte Entwicklerbox falsch konfiguriert ist, da mehr Leute es bemerken können.
Jan Hudec
6

Für mich wird ein CI interessant, wenn Ihr Team mehr als 1 Mitglied hat.

Sie müssen aufhören, CI als "einen anderen PC zu betrachten, auf dem die Tests für mich ausgeführt werden". CI über einen definierten und automatisierten Buildprozess und ein Release-Management.

CI ist die einzige autorisierende Entität, die Ihre Softwareversion erstellt. Wenn es nicht auf dem CI aufbaut, ist es einfach nicht passiert.

Mit einem CI haben Sie Einschränkungen, um alles zu automatisieren, was Ihnen alle manuellen Optimierungen, Hacks und Verknüpfungen anzeigt, die Sie eingerichtet haben, und arbeiten einfach nicht mit einem CI und sollten in erster Linie vermieden werden.

Probleme, die es vermeidet:

  • Wer ist für die Erstellung der Version verantwortlich?
  • Ist diese Person rund um die Uhr verfügbar?
  • Aber es baut auf meinem Maschinensyndrom auf
  • Entfernt alle Unklarheiten über die von uns veröffentlichte Version

Vorteile (einfach zu viele, um alle zu erwähnen):

  • Automatisierte Versionsnummerierung
  • Integration der Problemverfolgung
  • Automatisierte Metrikgenerierung
  • Statische Code-Analyse
  • Automatisierte Bereitstellung
  • Mehrstufige Setups
OliverS
quelle
5

Es gibt ein grundlegendes Problem bei der kontinuierlichen Integration (Continuous Integration, CI), das sich perfekt in Ihrer Frage widerspiegelt: CI-Praktiken sind schwer zu implementieren und zu verteidigen, da die Einrichtung von CI-Serversoftware nicht trivial ist und es auch nicht trivial ist, Ihre Projekte über ein CI zum Laufen zu bringen Server. Damit wird es schwierig zu erkennen, wo der Gewinn bei der Akzeptanz von CI überhaupt liegt.

Bei CI geht es vor allem um Einsicht und Qualität. Ein gutes CI bringt Sie Ihrem Projekt näher, gibt Ihnen ein angemessenes Feedback zu Qualitätsmetriken, Dokumentation, Einhaltung von Codierungsstandards usw. Es sollte Ihnen die Tools zur Verfügung stellen, mit denen Sie all dies einfach visualisieren und auf einen Blick erkennen und leicht erkennen können Verknüpfen Sie eine Reihe von Änderungen mit einem bestimmten Snapshot aller dieser Projektmetriken.

Es geht nicht nur darum, Unit-Tests durchzuführen. Ganz und gar nicht! Was mich zur Qualität bringt. CI nimmt Fehler an, vermeidet sie nicht und wirft sie nicht weg. Sie erhalten ganz einfach ein Tool, mit dem Sie frühzeitig Fehler machen können, anstatt später. Sie schreiben also zuvor getesteten Code nicht wirklich auf einen CI-Server. Obwohl Sie sich bemühen sollten, sauberen und nicht fehlerhaften Code festzuschreiben, verwenden Sie den CI-Server tatsächlich, um automatisch einen Integrations-Builder über Ihren Code auszuführen und zu beurteilen, ob alles richtig herausgekommen ist. Wenn ja, ordentlich! Wenn nicht, kein Problem - gute CI-Praktiken besagen, dass Ihre nächste Priorität nur darin bestehen sollte, das zu beheben, was kaputt gegangen ist. Worauf Sie bei einem guten CI-Server leicht hinweisen sollten.

Mit zunehmender Größe eines Teams wird die Integration des Codes aller natürlich schwieriger. Es sollte die Aufgabe eines zentralen CI-Servers sein, alle integrierten Teile zu testen und die Teammitglieder zu entlasten. Sie müssen also alle frühzeitig (und so sauber wie möglich) verpflichten und dann den Build-Status überwachen (normalerweise sind Benachrichtigungen vorgesehen). Und wieder, wenn etwas aufgrund des Commits eines Entwicklers kaputt geht, ist es sofort seine Verantwortung, dies zu beheben und diese automatisierten Builds sofort wieder in den OK-Status zu versetzen.

Sie sehen, meiner Meinung nach profitiert jedes einzelne Projekt von einer kontinuierlichen Integration. Die Sache ist, dass die Leute bis jetzt und aufgrund der unglaublichen Komplexität jedes einzelnen CI-Servers, den ich kenne, CI-Praktiken bei kleineren / einfacheren Projekten wirklich abgewehrt haben. Denn, komm schon, die Leute haben bessere Dinge zu tun, als Tage damit zu verbringen, eine hässliche, übermäßig komplexe, unterversorgte, aufgeblähte Software zu konfigurieren.

Ich hatte genau das gleiche Problem, und deshalb habe ich Cintient seit ungefähr einem Jahr in meiner Freizeit entwickelt. Meine Prämisse war es, die Installation, Konfiguration und Verwendung zu vereinfachen und die Qualitätsmetriken zu liefern, die bei allen anderen so gut wie fehlschlagen oder zu wenig liefern. Nach dieser langen Antwort kommt mein schamloser Plug, um auf den GitHub-Link für das Projekt hinzuweisen (der kostenlos und Open Source ist, natch). Es hat anscheinend auch einige schöne Screenshots. :-) https://github.com/matamouros/cintient

Hoffe ich habe dir geholfen.

(HINWEIS: Nach Bryan Oakleys Kommentar bearbeitet, weil ich mir mehr Zeit hätte nehmen sollen, um eine bessere Antwort zu finden. Ich denke auch, dass er Recht hatte.)

Matamouros
quelle
Ich habe abgelehnt, weil dies die Frage nicht beantwortet, sondern nur eine Werbung ist. Sie sprechen den Wann- Teil der Frage nie anders an, als implizit "jetzt mit meinem Werkzeug" zu implizieren.
Bryan Oakley
Ich habe einige Zeit gebraucht, um die Antwort zu bearbeiten, wie von @ bryan-oakley vorgeschlagen.
Matamouros
@matamouros: gute Arbeit bei der Bearbeitung.
Bryan Oakley