Wie kann eine kontinuierliche Integration für sehr große Projekte / Teams skaliert werden?


7

Herkömmlicherweise überwachen CI-Systeme nur die Qualität des Codes in einem Integrationszweig und signalisieren, wenn Regressionen auftreten. Für Reparaturen ist menschliches Eingreifen erforderlich.

Mit zunehmender Anzahl von Entwicklern, die an derselben Branche arbeiten, steigt das Risiko von Brüchen / Blockierungen. Schließlich wird ein Punkt erreicht, an dem durchschnittlich zu dem Zeitpunkt, an dem ein Bruch behoben wird, ein neuer auftritt - der Fortschritt auf dem Zweig wird praktisch vernachlässigbar.

Die Aufteilung in mehrere Teams, die jeweils an einem separaten Integrationszweig arbeiten und zu einem späteren Zeitpunkt zusammengeführt werden, kann hilfreich sein, verlängert jedoch die Projektdauer erheblich, da die erforderliche Integration lediglich für einen späteren Moment verzögert wird, während Abwanderung / Lärm / technische Abteilung hinzugefügt werden Die teilweise Integration aus einzelnen Branchen verschmilzt. Die Kosten steigen auch aufgrund von CI-Setups für jede Niederlassung, jede mit ihren eigenen Build- / QS-Ressourcen usw. Und die Gesamtqualität ist nicht unbedingt besser.

Skalierbarkeit ist bestenfalls zweifelhaft.

Gibt es eine Methode, um so große Projekte tatsächlich skalieren zu lassen?


1
Diese Frage ist für mich wie einige andere Fragen, die mich denken lassen: "Warum ist das überhaupt eine Frage?" Nicht dass es eine schlechte Frage ist, sondern etwas, von dem ich in der Welt komme (Mainframes, ich wette, Sie wissen es inzwischen ...), ist keine Frage mehr. Das ist es, was wir dort schon seit mindestens einem Jahrzehnt tun, und IMO funktioniert es wie ein Zauber. Wie sonst wäre es möglich, ein Bankensystem am Laufen zu halten? Ich weiß nur nicht, ob es sinnvoll ist, eine Antwort mit einer Mainframe-Brille zu veröffentlichen. Was denken Sie?
Pierre.Vriens

1
Der Umfang des Projekts bedeutet hier die Größe und Geschwindigkeit der Änderungen am System, die durchgeführt werden, nicht unbedingt die Größe des Systems selbst (was beispielsweise wichtig wäre, wenn das Projekt das gesamte System neu schreiben oder es erstellen würde von Grund auf neu). Und der Kontext ist ein einzelner Zweig. Das Trennen von Feature-Zweigen für Tage / Wochen / Monate ist keine kontinuierliche Integration. Nicht zu sagen, dass es bei Ihnen nicht passiert, sondern nur zu sagen, dass der Mainframe-Kontext selbst keine kontinuierliche Integration in großem Maßstab impliziert. Denken Sie an Hunderte von Commits pro Tag in derselben Branche.
Dan Cornilescu

Diese Frage lässt mich noch so viele Fragen offen - wie sind Sie in diese Situation gekommen? Warum arbeiten so viele Entwickler in derselben Branche? Warum benötigen Feature-Filialen eine eigene QS-Umgebung? Warum werden Änderungen an den Integrationszweig übertragen, die den Build beschädigen, und warum wird das Problem nicht behoben und nicht die CI-Skalierung? Testen sie nicht lokal? Nicht von Upstream verschmelzen, bevor sie zu ihm verschmelzen?
Adrian

1
@Adrian Zweige sind böse - sie bringen die Integrationshölle mit - riskant, langsam, teuer. Besonders für große Teams. Zweige können leicht zu stark voneinander abweichen und das Zusammenführen unpraktisch machen. Suchen Sie nach den CI-Vorteilen. Verzweigen bedeutet, isoliert zu arbeiten - all diese Vorteile aufzuheben und die komplementären Nachteile zurückzubringen. Ja, Filialen werden seit Jahrzehnten genutzt, um sw erfolgreich zu versenden - es gab keine Alternative. Aber jetzt haben wir CI. Dennoch benutzen viele immer noch Zweige - sie sind an sie gewöhnt, spüren nicht einmal mehr den Schmerz oder entscheiden sich, ihn zu ignorieren. Oder treffen Sie auf Skalierbarkeitsprobleme.
Dan Cornilescu

CI löst ein völlig anderes Problem als Zweige, und bei richtiger Verwendung arbeiten Zweige mit CI, nicht dagegen. Das Verzichten auf Zweige vermeidet auch nicht die Hölle der Integration, es macht es noch schlimmer: Jeder, der in demselben Zweig arbeitet, muss bei jedem Push zusammengeführt werden.
Adrian

Antworten:


5

Ja, aber es geht darum, die Dinge, die Sie in Ihrer Frage erwähnen, so weit wie möglich zu verhindern. Sie haben Recht, dass es nur so viele Entwickler gibt, die an demselben Code arbeiten können, bevor die Dinge nicht mehr verwaltet werden können. Sie benötigen jemanden oder etwas, das einen Überblick über alle Änderungen hat und sicherstellt, dass die Integration ordnungsgemäß funktioniert und keine Regression auftritt. Dies ist schwer zu skalieren, wenn alles in einem Repository geschieht.

Bevor Sie mit der Arbeit beginnen, müssen Sie die Funktionen so trennen, dass sie später ohne großen Aufwand integriert werden können. Dies bedeutet, dass Sie die Funktionalität in Teile aufteilen möchten, die unabhängig sind oder zumindest so wenig Abhängigkeiten wie möglich aufweisen. Wie Sie dies tun, hängt stark von dem Produkt ab, das Sie entwickeln. In der Vergangenheit wurde die Funktionalität durch die Erstellung verschiedener Bibliotheken getrennt. Der Nachteil dabei ist, dass Sie eine gute Methode zum Verwalten dieser Bibliotheken benötigen. Alte Windows-Versionen hatten zum Beispiel ein schlechtes Bibliotheksverwaltungssystem, das die berüchtigte DLL-Hölle verursachte . Heutzutage sind Mikrodienste ein beliebter Weg, dies zu tun, obwohl dies auch Nachteile hat (z. B. Kommunikationsaufwand, mehr zu überwachende Dienste).

Wenn eine Trennung aufgrund der Funktionalität schwierig ist, kann eine andere Option darin bestehen, die Entwicklung rechtzeitig zu trennen. Anstatt dass mehrere Teams gleichzeitig an vielen verschiedenen Funktionen arbeiten, haben Sie 1 Team, das jeweils nur an einer oder wenigen Funktionen arbeitet.

Wenn eine Trennung der Arbeit nicht möglich ist, benötigen Sie Tools und Tests, die sicherstellen, dass die Dinge aufeinander abgestimmt sind. Automatisierte Unit- und Integrationstests können hier eine große Hilfe sein, aber letztendlich gibt es Grenzen, wie groß ein Projekt oder Team sein soll.


4

Mit zunehmender Anzahl von Entwicklern, die an derselben Branche arbeiten, steigt das Risiko von Brüchen / Blockierungen. Schließlich wird ein Punkt erreicht, an dem durchschnittlich zum Zeitpunkt der Behebung eines Bruchs ein neuer auftritt

Während der erste Teil des Satzes wahrscheinlich statistisch korrekt ist, stimme ich dem zweiten nicht zu.

CI- und Integrationszweige können GIGO (Garbage-In-Garbage-Out) nicht besiegen. Wenn die Entwickler keine Disziplin haben, werden Sie in einem angehaltenen Zweig enden, aber Tests für Integrationszweige sollten nur als Lat-Barriere fungieren, nicht als erste.

Entwickler sollten geeignete Codierungsstandards, Codeüberprüfungen, lokale Komponententests und möglicherweise Verzweigungstests vor der Integration verwenden, um Kollisionen weniger wahrscheinlich zu machen.

Ich arbeite täglich an einem solchen System mit Hunderten von Mitwirkenden und überraschenderweise ist es ungewöhnlich, dass es hängt.

Ich habe nicht genügend Daten, aber es kann sein, dass die Kosten hoch sind. Andererseits ist es schwierig, die alternativen Kosten für späte Integration und Fehler zu beurteilen.


0

Ein anderer Ansatz besteht darin, auf ein anderes, nicht traditionelles CI-System umzusteigen , das Regressionen verhindern kann , indem die beleidigenden Kandidatenänderungen vor ihrem Festschreiben identifiziert und zurückgewiesen werden, anstatt Regressionen zu erkennen und auf die Wiederherstellung zu warten, während die Entwicklung in der Verzweigung blockiert ist. Ich nenne ein solches System gerne ein nicht blockierendes CI-System .

Für eine solche Garantie reicht es nicht aus, nur die vom Entwickler ausgeführten Anforderungen für die Überprüfung vor dem Festschreiben zu erhöhen, um die Regression der Zweige zu reduzieren. Dies kann tatsächlich zu einer Erhöhung der Regressionsrate führen : längere Überprüfungszeiten => höhere Anzahl von Änderungen, die gleichzeitig isoliert überprüft werden (ohne sich gegenseitig zu berücksichtigen) => höheres Risiko für Funktionskonflikte und Interferenzen. Ich erkläre dies etwas ausführlicher in der Erweiterung der Pre-Commit-Überprüfungsabdeckung, um unseren Mythos der Zweigstabilität zu verbessern .

Das CI-Tool muss natürlich auch skalierbar sein. Und solche Tools gibt es, siehe Gibt es ein CI-Tool, das keine Regressionen in der Qualitätsstufe der Branche garantiert?

Offenlegung: Ich bin mit dem in den obigen Links genannten Unternehmen verbunden.


Stört es Sie, wenn ich Ihren "Haftungsausschluss" ein wenig überarbeite (wenn es Ihnen nicht gefällt, führen Sie einfach einen Rollback durch)?
Pierre.Vriens

Überhaupt nicht, bitte.
Dan Cornilescu

1
Fertig ... IMO entspricht Ihrer Version, entspricht den SE-Anforderungen (um eine Offenlegung hinzuzufügen) und einer angemesseneren (weniger störenden) Schriftart. Fühlen Sie sich frei zu überarbeiten oder zurückzusetzen, wenn Sie möchten.
Pierre.Vriens
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.