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.
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:
- Pflegen Sie ein Code-Repository
- Automatisieren Sie den Build
- Machen Sie den Build-Selbsttest
- Jeder verpflichtet sich jeden Tag zur Basislinie
- Jedes Commit (zur Basislinie) sollte erstellt werden
- Halte den Build schnell
- Test in einem Klon der Produktionsumgebung
- Machen Sie es sich einfach, die neuesten Ergebnisse zu erhalten
- Jeder kann die Ergebnisse des neuesten Builds sehen
- Automatisieren Sie die Bereitstellung
quelle
Antworten:
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.
quelle
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.
quelle
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:
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:
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.
quelle