Einfache Erklärung der kontinuierlichen Integration

32

Wie würden Sie Continuous Integration definieren und welche spezifischen Komponenten enthält ein CI-Server?

Ich möchte jemandem in der Marketingabteilung erklären, was Continuous Integration ist. Sie verstehen die Quellcodeverwaltung - dh sie verwenden Subversion. Aber ich möchte ihnen richtig erklären, was CI ist. Der Wikipedia-Artikel definiert es nie richtig, der Martin Fowler-Artikel gibt nur Folgendes an, was im Grunde genommen eine Tautologie ist, gefolgt von einer vagen Erklärung von 'Integration':

Kontinuierliche Integration ist eine Softwareentwicklungspraxis, bei der Mitglieder eines Teams ihre Arbeit häufig integrieren. In der Regel integriert sich jede Person mindestens täglich, was zu mehreren Integrationen pro Tag führt. Jede Integration wird durch einen automatisierten Build (einschließlich Test) überprüft, um Integrationsfehler so schnell wie möglich zu erkennen.

Update : Ich habe ihnen dieses Bild geschickt, ich konnte kein einfacheres finden.

Bildbeschreibung hier eingeben

Update 2 : Feedback vom Marketing-Team (für die Zeit, als es 3 Fragen gab):

Ich mag eigentlich alle 3 Antworten - aus verschiedenen Gründen. Ich möchte mich einloggen, um ihnen allen zu danken!

Offensichtlich kann er nicht - also danke in seinem Namen :)

Update 3 : Beim Betrachten des Wikipedia-Artikels wurde mir klar, dass er die Prinzipien enthält, die, wenn man nur die Überschriften betrachtet, eine recht gute Liste sind:

  1. Pflegen Sie ein Code-Repository
  2. Automatisieren Sie den Build
  3. Machen Sie den Build-Selbsttest
  4. Jeder verpflichtet sich jeden Tag zur Basislinie
  5. Jedes Commit (zur Basislinie) sollte erstellt werden
  6. Halte den Build schnell
  7. Test in einem Klon der Produktionsumgebung
  8. Machen Sie es sich einfach, die neuesten Ergebnisse zu erhalten
  9. Jeder kann die Ergebnisse des neuesten Builds sehen
  10. Automatisieren Sie die Bereitstellung
icc97
quelle
3
oO Ihre Marketingabteilung nutzt Subversion? Versuchung zu stimmen, um als "Too Localized" zu schließen ... ;-)
Jeroen
@Jeroen Ja, wirklich, für Dateien auf der Website. Ich habe ihnen einen schönen großen roten Knopf auf einer Webseite mit der Aufschrift "Do it" hinzugefügt, um Subversion auf dem Server zu aktualisieren. :)
icc97

Antworten:

27

Wenn jemand die Dateien ändert, aus denen das Softwareprodukt besteht, und dann versucht, sie einzuchecken ( dh die Änderungen in den Hauptproduktcode zu integrieren ), möchten Sie sicherstellen, dass das Softwareprodukt weiterhin erfolgreich erstellt werden kann.

In der Regel gibt es ein externes System namens CI-Server , das entweder regelmäßig oder bei jeder Änderung die Quelldateien aus der Versionskontrolle abruft und versucht, das Produkt zu erstellen (kompilieren / testen / paketieren). Wenn der CI-Server einen Build erfolgreich ausführen kann, wurden die Änderungen erfolgreich integriert.

Der CI-Server muss auch in der Lage sein, Broadcasts zu senden, wenn der Build fehlgeschlagen oder erfolgreich war, sodass Systeme wie Jenkins (einer der heute am häufigsten verwendeten CI-Server) über Möglichkeiten zum Senden von E-Mails / Texten sowie eine dashboardähnliche Webschnittstelle mit a verfügen Eine Reihe von Informationen über aktuelle und frühere Builds, wer den Code eingecheckt hat, wann etwas kaputt gegangen ist usw. (In Ihrem obigen Bild wäre dies der Feedback-Mechanismus .)

CI ist wichtig, weil es sicherstellt, dass Sie kontinuierlich ein funktionierendes Produkt haben. Dies ist wichtig für alle Entwickler, die an dem Softwareprodukt arbeiten, sowie für alle Personen, die Zugriff auf tägliche Releases des Softwareprodukts haben möchten, z. B. auf die Qualitätssicherung.

c_maker
quelle
1
Continuous Integration kümmert sich um den Build-Status, aber auch um Tests.
Quentin Pradet
1
und Bereitstellung, es reicht nicht aus, um Tests zu kompilieren und auszuführen, aber Sie sollten die Binärdateien auch an eine Umgebung senden, damit sie auch von Personen (oder automatisierten Tools) getestet werden können.
gbjbaanb
1
Da die Frage eine einfache Erklärung verlangte, ließ ich viele (meist projekt- / teamspezifische) Details aus, die in ein CI-System einfließen könnten.
c_maker
Ist dies abhängig von einer testgetriebenen Entwicklung? Code, der kompiliert, funktioniert nicht immer richtig? Wie kann das CI-System feststellen, ob der Code wirklich erfolgreich integriert wurde, ohne dass Tests fehlschlagen, wenn der Code noch nicht fertig ist?
Mowwwalker
1
@ user828584: In meiner Antwort impliziere ich, dass 'test' Teil eines Builds ist. Und als Randnotiz: TDD unterscheidet sich von Tests zur Qualitätsprüfung. Als Nebeneffekt von TDD verfügen Sie über gut geschriebene Tests, Sie können jedoch auch Tests durchführen, ohne TDD durchzuführen.
c_maker
33

Ich denke, für Ihre Marketingabteilung ist es nicht wichtig, wie CI funktioniert , sondern was CI für neue Versionen Ihrer Software bedeutet .

CI bedeutet im Idealfall, dass Sie jeden Tag eine neue, potenziell veröffentlichbare Version Ihrer Software erstellen können, die Ihrem Kunden präsentiert oder verkauft werden kann und einige neue Features, Funktionen oder Bugfixes enthält. Das bedeutet nicht, dass Sie die neue Version jeden Tag ausliefern müssen , aber Sie können, wenn Sie möchten.

Wenn Sie beispielsweise einen neuen Funktionsumfang haben, der offiziell für die Version "2015" Ihrer Software freigegeben werden soll, und Teile dieses Funktionsumfangs bereits heute codiert und integriert sind, können die Marketingmitarbeiter die aktuelle Version Ihrer Software verwenden Software und zeigen Sie es - mehr oder weniger sicher - auf der nächsten Konferenz im Jahr 2013. Ohne CI mussten sie Ihr Team um einen ungeplanten Code-Freeze bitten Produkt, sie haben möglicherweise nicht genügend automatische Tests bereit und raten, was auf der Konferenz passieren wird - die "Alpha-Version" Ihrer 2015er-Version wird ein viel höheres Absturzrisiko aufweisen, insbesondere wenn die neuen Funktionen demonstriert werden.

Doc Brown
quelle
4
+1 für die Annäherung aus der Perspektive des Nutzens, den es bietet.
17.05.13
17

Sie können nicht wissen, was CI ist, wenn Sie nicht wissen, was wir früher getan haben. Stellen Sie sich ein System mit 3 Teilen vor. Es gibt eine Benutzeroberfläche, die Daten sammelt und in die Datenbank stellt. Es gibt ein Berichtssystem, das Berichte aus der Datenbank erstellt. Und es gibt eine Art Server, der die Datenbank überwacht und E-Mail-Benachrichtigungen sendet, wenn bestimmte Kriterien erfüllt sind.

Vor langer Zeit würde dies wie folgt geschrieben werden:

  1. Vereinbaren Sie das Schema für die Datenbank und die Anforderungen - dies würde Wochen dauern, da es perfekt sein musste, da Sie bald sehen werden, warum
  2. Weisen Sie den 3 Teilen 3 Entwickler oder 3 unabhängige Entwicklerteams zu
  3. Jeder Entwickler arbeitete an seinem Stück und testete es über Wochen oder Monate mit seiner eigenen Datenbankkopie.

Während dieser Zeit führten die Entwickler weder den Code der jeweils anderen aus, noch versuchten sie, eine Version der Datenbank zu verwenden, die mit dem Code einer anderen Person erstellt wurde. Der Verfasser des Berichts fügte lediglich eine Reihe von Beispieldaten hinzu. Der Benachrichtigungsschreiber fügte manuell Datensätze hinzu, die Berichtsereignisse simulierten. Und der GUI-Schreiber würde in der Datenbank nachsehen, was die GUI hinzugefügt hatte. Mit der Zeit bemerkten die Entwickler, dass die Spezifikation in irgendeiner Weise falsch war, z. B. ohne Angabe eines Index oder mit zu kurzer Feldlänge, und "korrigierten" dies in ihrer Version. Sie könnten den anderen sagen, wer darauf reagieren könnte, aber normalerweise werden diese Dinge für später auf eine Liste gesetzt.

Wenn alle drei Teile vollständig codiert und von ihren Entwicklern und manchmal sogar von den Benutzern getestet wurden (indem ihnen ein Bericht, ein Bildschirm oder eine E-Mail-Warnung angezeigt wurde), kam die "Integrations" -Phase. Dies wurde oft mit mehreren Monaten budgetiert, ging aber immer noch über. Diese Feldlängenänderung durch dev 1 wird hier entdeckt und erfordert dev 2 und 3, um große Codeänderungen und möglicherweise auch Änderungen an der Benutzeroberfläche vorzunehmen. Dieser zusätzliche Index würde sein eigenes Chaos anrichten. Und so weiter. Wenn einer der Entwickler von einem Benutzer angewiesen wurde, ein Feld hinzuzufügen, und dies tat, wäre jetzt der Zeitpunkt, an dem die anderen beiden es ebenfalls hinzufügen müssten.

Diese Phase war äußerst schmerzhaft und kaum vorhersehbar. Also sagten die Leute: "Wir müssen uns häufiger integrieren." "Wir müssen von Anfang an zusammenarbeiten." "Wenn einer von uns eine Änderungsanfrage stellt [so haben wir damals geredet], müssen die anderen davon wissen." Einige Teams haben früher mit Integrationstests begonnen, während sie weiterhin separat arbeiteten. Und einige Teams begannen von Anfang an, den Code des anderen zu verwenden und die ganze Zeit auszugeben. Und das wurde zu Continuous Integration.

Sie denken vielleicht, ich übertreibe diese erste Geschichte. Ich habe einmal für ein Unternehmen gearbeitet, bei dem mein Kontakt mich für das Einchecken von Code gekaut hat, der unter den folgenden Fehlern litt:

  • Ein Bildschirm, an dem er nicht arbeitete, hatte einen Knopf, der noch nichts tat
  • Kein Benutzer hatte sich für das Bildschirmdesign abgemeldet (genaue Farben und Schriftarten; das Vorhandensein des Bildschirms, seine Funktionen und die in der 300-Seiten-Spezifikation enthaltenen Schaltflächen).

Es war seine Meinung, dass man Sachen erst dann in die Quellcodeverwaltung bringt, wenn sie fertig sind. Normalerweise hat er ein oder zwei Check-ins pro Jahr durchgeführt. Wir hatten ein bisschen einen philosophischen Unterschied :-)

Wenn Sie es schwierig finden zu glauben, dass Teams um eine gemeinsam genutzte Ressource wie eine Datenbank getrennt werden, werden Sie wirklich nicht glauben (aber es ist wahr), dass derselbe Ansatz für Code gewählt wurde. Sie werden eine Funktion schreiben, die ich aufrufen kann? Das ist großartig, mach weiter so, ich werde in der Zwischenzeit einfach fest programmieren, was ich brauche. Monate später "integriere" ich meinen Code so, dass er Ihre API aufruft und herausfindet, dass er explodiert, wenn ich null übergebe. Wenn er null zurückgibt (und dies oft tut), gibt er zu große Dinge zurück Für mich ist es nicht in der Lage, Schaltjahre und tausend andere Dinge zu bewältigen. Es war normal, unabhängig zu arbeiten und dann eine Integrationsphase zu haben. Jetzt klingt es nach Wahnsinn.

Kate Gregory
quelle
2
Wir hatten eine ähnliche Geschichte, in der wir eine benutzerdefinierte Anwendung, die auf SP 2003 basiert, auf SP 2007 aktualisiert haben. Mit VSS (yes, VSS :) hat jeder Entwickler einen Teil seiner Datei ausgecheckt, die für ein bis zwei Wochen codiert war, und dann bei der Integration Unser Code boomte, als das Problem begann, da unser Code erheblich abwich. Wir haben das Integrationsproblem für einen Monat behoben, und das Projekt hat ein Hotel gemietet, um diejenigen unterzubringen, die an Wochentagen sehr weit weg wohnen. An diesem Tag habe ich gelernt, täglich Code zu integrieren :-)
OnesimusUnbound
@OnesimusUnbound Ich erinnere mich, dass ich von VSS nach Clearcase gestoßen wurde ... aus der Pfanne ins Feuer. Jahre später, nachdem ich zu derselben Firma zurückgekehrt war, um etwas zu trinken, erinnere ich mich an jemanden, der einen anderen Entwickler auslachte, der diese neue Quellcodeverwaltung namens "Git" erwähnte: "Wofür brauchen wir ein anderes Quellcodeverwaltungssystem?".
ICC97
1
Vielen Dank - ich habe mich bemüht, CI zu verstehen, nur weil ich nicht wusste, was die Alternative war
Rhys
Interessant. Für mich klingt das eher so, als würde man CI mit Wasserfall vergleichen. Sie können jedoch eine Methode ohne Wasserfall verwenden, die diese Probleme vermeidet (z. B. iterative Entwicklung) und kein CI verwendet.
Dan Moulding
@DanMoulding Wenn ich agil und iterativ bin und was nicht in meinem Teil einer größeren Sache, die nicht in das integriert ist, was jemand anderes tut, mache ich kein CI. Heck, Sie können Wasserfall und CI. Entwerfen Sie alles, codieren Sie alles, testen Sie alles, wenn Sie möchten - wenn jeder ständig die Code-, Schema- und Dateilayouts aller anderen verwendet, ist dies CI, auch wenn Sie Wasserfälle verwenden. Die Verbindung ist, dass Sie ohne CI von BDUF leben und sterben, weil dies Ihre einzige Hoffnung ist (und es sich als schwache Hoffnung herausstellt), eine Integrationsphase von angemessener Länge zu haben. Durch die Einführung von CI konnten wir BDUF loslassen.
Kate Gregory