Tipps für eine „kontinuierliche“ Lieferung

14

Ein Team hat häufig Schwierigkeiten, Software zu veröffentlichen (einmal pro Woche). Was folgt, ist ein typischer Release-Zeitplan:

Während der Iteration:

  • Entwickler arbeiten an Storys im Backlog für kurzlebige (dies wird enthusiastisch durchgesetzt) ​​Feature-Zweige, die auf dem Master-Zweig basieren.
  • Entwickler ziehen ihre Feature-Zweige häufig in den Integrationszweig, der kontinuierlich erstellt und (soweit die Testabdeckung reicht) automatisch getestet wird.
  • Die Tester können die Integration in eine Staging-Umgebung automatisch bereitstellen. Dies geschieht mehrmals pro Woche und ermöglicht die kontinuierliche Ausführung ihrer Testsuiten.

Jeden Montag:

  • Es gibt ein Release-Planungs-Meeting, um zu bestimmen, welche Storys (basierend auf der Arbeit der Tester) "als gut bekannt" sind und daher in der Veröffentlichung enthalten sein werden. Wenn ein Problem mit einer Story bekannt ist, wird der Quellzweig aus der Integration entfernt.
  • An diesem Montag darf kein neuer Code (nur von den Testern angeforderte Fehlerkorrekturen) in die Integration übernommen werden, um sicherzustellen, dass die Tester über eine stabile Codebasis verfügen, von der eine Veröffentlichung abgeschnitten werden kann.

Jeden Dienstag:

  • Die Tester haben den Integrationszweig so oft wie möglich getestet, und es sind keine Fehler bekannt, sodass ein Release nur langsam herausgeschnitten und an die Produktionsknoten gesendet wird.

In der Praxis klingt das in Ordnung, aber wir haben festgestellt, dass es unglaublich schwer zu erreichen ist. Das Team sieht die folgenden Symptome

  • In der Produktion wurden "subtile" Fehler gefunden, die in der Staging-Umgebung nicht identifiziert wurden.
  • Last-Minute-Hotfixes werden bis zum Dienstag fortgesetzt.
  • Probleme in der Produktionsumgebung erfordern Rollbacks, die die weitere Entwicklung blockieren, bis eine erfolgreiche Live-Bereitstellung erreicht ist und der Hauptzweig aktualisiert werden kann (und daher von dem Zweig abgezweigt werden kann).

Ich denke, Testabdeckung, Codequalität, schnelle Regressionstests, Änderungen in letzter Minute und Umgebungsunterschiede spielen hier eine Rolle. Kann jemand Ratschläge geben, wie eine "kontinuierliche" Lieferung am besten erreicht werden kann?

Ben
quelle
1
Neben der Antwort von @ emddudley zum Buch "Continuous Delivery" möchte ich Sie ermutigen, sich unter infoq.com/presentations/Continuous-Deployment-50-Times-a-Day eine wirklich interessante Präsentation über den Einsatz mehrerer Male pro Tag in der Praxis anzusehen Produktion.
SDG

Antworten:

6
  • In der Produktion sind "subtile" Fehler aufgetreten, die in der Staging-Umgebung nicht identifiziert wurden. In einem der Projekte mit solchen Problemen habe ich gesehen, dass dies durch eine Taktik, die ich als Doppelprobleme bezeichne, recht erfolgreich behoben wurde. Ich meine, für solche Bugs haben die Jungs zwei Tickets im Issue Tracker erstellt: eines wurde Entwicklern zugewiesen, um den Code zu reparieren, das andere Testern, um Regressionstests oder Änderungen in der Staging-Umgebung zu entwerfen und einzurichten, die verhindern würden, dass sie in Zukunft wiederholt werden. Das half, die Inszenierung nahe genug zu halten, um sie anzustacheln.

  • Bei Problemen in der Produktionsumgebung sind Rollbacks erforderlich. Wenn diese häufig auftreten, handelt es sich bei Ihren wöchentlichen Veröffentlichungen tatsächlich um Fälschungen. Passen Sie die Häufigkeit an die tatsächlich funktionierende Stufe an. Mit Fälschung meine ich, dass, wenn Sie sagen, eines von zwei Ihrer wöchentlichen Releases rückgängig machen, dies bedeutet, dass die Benutzer alle zwei Wochen mit einem neuen (funktionierenden) Release konfrontiert werden - das ist alles, was zählt, nicht die Anzahl der von Ihnen bereitgestellten Releases.

  • Begeisterte Feature-Verzweigungen - Bedeutet das, dass Sie vor einiger Zeit auch versucht haben, an einer einzelnen Verzweigung zu arbeiten, und diese als minderwertig eingestuft haben? Wenn ja, dann überspringen Sie den Rest. Andernfalls versuchen Sie, an einem einzelnen Zweig zu arbeiten (falls erforderlich, suchen Sie bei Google nach der Verzweigungsstrategie "Entwicklungszweig" oder nach der Verzweigungsstrategie "instabiler Trunk", um weitere Informationen zu erhalten). Wenn Sie Perforce verwenden, durchsuchen Sie das Web nach Microsoft-Richtlinien zum Verzweigen und Zusammenführen. Versuchen Sie, habe ich das gesagt? Es tut mir leid, ein passendes Wort sollte getestet werden : Ich meine, 1) Planen Sie, wann und wie zu messen ist, ob ein einzelner Zweig besser ist oder nicht, als einer, den Sie jetzt haben, und 2) Planen Sie, wann und wie Sie in diesem Fall zurück zu Feature-Zweigen wechseln Testen schlägt fehl .


PS.

Wahrscheinlich finden Sie weitere Tricks wie diese, wenn Sie im Web nach Risikomanagement für Softwareprojekte suchen


aktualisieren

<Kopie aus Kommentaren>

Ich empfinde häufige Hotfixes als Symptom für eine unterbrochene Testpipeline. Ist dies nicht der Fall? In jedem Fall sind wiederholte Veröffentlichungen erforderlich, damit die Hotfixes veröffentlicht werden und mehr Arbeit für das Ops-Team geleistet wird. Darüber hinaus werden Hotfixes normalerweise unter extremem Zeitdruck codiert, was bedeutet, dass sie wahrscheinlich von geringerer Qualität sind als normale Arbeit.

</ copy from comments>

  • Last-Minute-Hotfixes - obige Bedenken erscheinen mir angemessen, ebenso wie Ihr Hinweis auf eine unterbrochene Test-Pipeline. Mit diesem Update klingt Ihre vorherige Notiz, dass die Integration von neuem Code am Montag blockiert ist, wie ein weiteres Symptom einer unterbrochenen Pipeline (ich denke, ein genaueres Wort wäre umstritten ). Mit Konflikt meine ich Folgendes: Sie verwenden einen einzelnen Zweig, um gleichzeitig zwei Zwecke zu erfüllen : Integration und Freigabe. Wenn sich die Freigabe nähert, geraten diese beiden Zwecke in Konflikt miteinander, was zu widersprüchlichen Anforderungen führt: Der Integrationszweck wird am besten mit einem kontinuierlich geöffneten Zweig ( Früh und häufig zusammenführen ) erfüllt, während die Freigabestabilität davon profitiert, dass der Zweig versiegelt wird(isoliert) so lange wie möglich. A-ha, es sieht so aus, als würden Puzzle-Teile zusammenpassen ...

Sehen Sie, dieses Einfrieren am Montag scheint nun ein Kompromiss zu sein, der zu widersprüchlichen Zwecken gemacht wurde: Entwickler leiden unter einer Blockade der neuen Code-Integration, während Tester unter einer zu kurzen Blockade leiden. Jeder ist etwas unglücklich, aber beide Zwecke werden mehr oder weniger erfüllt.

Wissen Sie, ich denke, Ihre beste Wahl wäre es, wenn Sie versuchen , von einem bestimmten Zweig (außer der Integration) freizugeben . Ob dieser Zweig langlebig ist wie die Integration oder kurzlebig wie Ihre Feature-Zweige (wobei "Feature" nun, Release ist) - es liegt an Ihnen, es muss nur getrennt sein.

Man denke nur daran. Momentan ist ein Tag nicht genug, um die Freisetzung bequem zu stabilisieren, oder? Mit der neuen Verzweigungsstrategie können Sie nur zwei Tage vor der Veröffentlichung eine Verzweigung vornehmen, kein Problem. Wenn Sie feststellen, dass nicht einmal zwei Tage ausreichen, versuchen Sie, 3 Tage vorher zu forken, usw. Sie können den Release-Zweig so früh wie gewünscht isolieren, da dies das Zusammenführen von neuem Code mit dem Integrationszweig nicht mehr blockiert. Beachten Sie, dass in diesem Modell der Integrationszweig überhaupt nicht eingefroren werden muss. Ihre Entwickler können ihn kontinuierlich am Montag, Dienstag und Freitag verwenden.

Der Preis, den Sie für dieses Glück bezahlen, ist die Komplikation von Hotfixes. Diese müssten statt in einem Zweig in zwei Zweigen zusammengeführt werden (Release + Integration). Darauf sollten Sie sich beim Testen eines neuen Modells konzentrieren. Verfolgen Sie alles, was damit zusammenhängt - zusätzlicher Aufwand für das Zusammenführen mit dem zweiten Zweig, Aufwand für das Risiko, dass das Zusammenführen mit dem zweiten Zweig vergessen wird - alles im Zusammenhang.

Fassen Sie am Ende des Tests einfach zusammen, was Sie aufgezeichnet haben, und erfahren Sie, ob die Menge dieses zusätzlichen Aufwands akzeptabel ist oder nicht. Wenn es akzeptabel ist, sind Sie fertig. Wechseln Sie andernfalls zu Ihrem aktuellen Modell, analysieren Sie, was schief gelaufen ist, und überlegen Sie, wie Sie sich noch verbessern können.


update2

<Kopie aus Kommentaren>

Mein Ziel ist es, Storys innerhalb einer Iteration (hinter oder vor einer Konfigurationswand) zu testen und bereitzustellen. Dies kann nur erreicht werden, wenn die Tester die in der Iteration durchgeführten Arbeiten testen (und nicht den Code aus der vorherigen Iteration stabilisieren).

</ copy from comments>

Aha. Nun, ich habe keine direkte Erfahrung mit dieser Methode, aber ich habe in einem Projekt, das mit unserer verwandt ist, erfolgreiche In -Iteration- Art-Tests gesehen . Da unser Projekt den umgekehrten Weg einschlug, hatte ich auch den Luxus, diese gegensätzlichen Ansätze von Angesicht zu Angesicht zu vergleichen .

Aus meiner Sicht sah der Testansatz außerhalb der Iteration in diesem Rennen überlegen aus. Ja, ihr Projekt ist gut gelaufen und ihre Tester haben Bugs schneller als unsere entdeckt, aber irgendwie hat das nicht geholfen. Unser Projekt lief auch gut, und irgendwie konnten wir uns kürzere Iterationen als sie leisten, und wir hatten weniger (viel weniger) verrutschte Veröffentlichungen als sie, und es gab weniger Spannungen zwischen Entwicklern und Testern an unserer Seite.

BTW trotz schnellere Erkennung an ihrer Seite konnten wir über die gleiche durchschnittliche Bug Lebensdauer (Lebensdauer ist die Zeit zwischen der Einführung und haben fix , nicht zwischen Einführung und Detektion). Wahrscheinlich hatten wir hier sogar einen kleinen Vorteil, da wir mit kürzeren Iterationen und weniger verrutschten Releases behaupten konnten, dass unsere Fixes Benutzer im Durchschnitt schneller erreichen als ihre.

Zusammenfassend glaube ich immer noch, dass die Isolierung der Release-Codeline bessere Chancen bietet, die Produktivität Ihres Teams zu verbessern.


auf einen weiteren Gedanken ...

  • Die Isolation der Release-Codeline hat bessere Chancen - beim erneuten Lesen könnte dies den Eindruck erwecken, dass ich Sie davon abhalte, In-Iteration- Tests durchzuführen . Ich möchte klarstellen, dass ich es nicht tue.

In Ihrem Fall ist der Ansatz des In-Iteration-Testens sicher (äh ... Test ), da Sie offenbar ein klares Verständnis dafür haben, wie dies erreicht werden kann (glatte Test-Pipeline ) und welche Haupthindernisse bestehen. Und schließlich haben Sie immer die Möglichkeit, auf einen alternativen Ansatz zurückzugreifen, wenn Sie es zu schwierig finden, diese Pipeline richtig zu machen.

Übrigens in Bezug auf Hindernisse, weitere, die es in diesem Fall wert sind, im Auge behalten zu werden, sind Probleme wie das Versagen, einen Fehler auf der Seite des Entwicklers zu reproduzieren, und das verspätete Finden / Verspätete Überprüfen der Fehlerbehebung auf der Seite des Testers. Diese könnten auch Ihre Pipeline blockieren, wie dies jetzt bei Hotfixes der Fall ist.

Mücke
quelle
1
Vielen Dank für Ihre Erkenntnisse. Bezüglich der Verzweigung haben wir eine Nr. von Ansätzen (und in der Tat habe ich eine Reihe von @ verschiedenen Organisationen in meiner Karriere verwendet). Wir haben uns für einen sauberen Master entschieden, der den Code in der Produktion darstellt, einen Integrationszweig (basierend auf dem Master), in den alle Entwickler häufig (im Idealfall mehrmals am Tag) zugreifen. Die Integrationsbranche wird kontinuierlich aufgebaut und getestet und häufig automatisch bereitgestellt. Ich habe es schon einmal mit großem Erfolg mit Dirty Mainline versucht. Unser gegenwärtiger Ansatz scheint kontrollierter zu sein. Wir verwenden Konfigurationswände für unvollständige, unerwünschte Funktionen.
Ben
1
@maple_shaft Nun, das erste Mal, dass ich Bugs gesehen habe, die in Tracker gegen Test Suite aufgetaucht sind, war 2002 oder 2003. Und es schien eine etablierte Praxis in dem Team zu sein, dem ich damals beigetreten bin. Was Bugs diffs zwischen prod und Staging - Targeting, scheinen diese in der Tat Roman mir seit dem ersten Mal habe ich es gesehen (und war wirklich überrascht) weniger als 2 Jahren
gnat
1
@gnat, Es scheint wie gesunder Menschenverstand, weshalb ich mich frage, warum ich noch nie davon gehört habe. Jetzt, wo ich darüber nachdenke, macht es Sinn, weil jede QA-Gruppe, mit der ich jemals zusammengearbeitet habe, vollkommen glücklich schien, Bugs auszuteilen, aber zwei Jahre alt wurde, wenn Bugs gegen sie gebracht wurden.
maple_shaft
1
@maple_shaft Ich stimme zu, dass dieser Weg unverdient selten zu sein scheint. Wussten Sie übrigens, dass man Fehler nicht nur auf Tester, sondern auch auf Dokumentations- / Spezifikationsschreiber werfen kann? - Build 12 von Dev Guide sagt "black" auf Seite 34, Zeile 5; sollte "weiß" sein. - John Writer zugewiesen. - In Build 67 behoben. - In Build 89 von Paul Tester verifizierte Korrektur.
gnat
1
Meine letzte Antwort, da ich mich nicht in eine Chat-Sitzung verwandeln möchte, aber in meiner letzten Org habe ich einen Bug gegen einen Spec-Writer geschrieben und die gesamte Division hat sich in einem WTF-Moment zurückgezogen. Mir wurde sofort gesagt, dass ich ein "Einstellungsproblem" habe und kein "Teamplayer" bin und es nicht noch einmal machen soll.
maple_shaft
8

Ohne die Natur der User Stories und deren Anzahl zu kennen, muss ich sagen, dass ein einwöchiger Release-Zyklus extrem erscheint. Das oben beschriebene Szenario ist kompliziert geplant und umfasst eine Reihe verschiedener Zweige, Zusammenführungspunkte, Übergaben, Umgebungen und Testsuiten. Auf diese Weise entsteht quasi ein menschliches System, bei dem ein einziger Fehler in der Komplexität des Plans zu einer verspäteten Veröffentlichung führen kann schlechte Qualität. Dies kann einen Dominoeffekt auf die nachfolgenden Releases haben.

Meiner Meinung nach ist der Zeitplan einfach zu eng.

Sie können die Codeabdeckung erhöhen, indem Sie effektivere Komponententests sowie umgebungsspezifische Integrationstests schreiben.

Sie können die Codequalität erhöhen, indem Sie die Paarprogrammierung und / oder die Codeüberprüfung einführen.

Eine bessere Schätzung der User Story-Punkte kann auch helfen, indem implizit die User Storys in einer einzelnen Version begrenzt werden, wodurch der Nenner Ihres Risikoverhältnisses gesenkt wird.

Im Großen und Ganzen klingt es so, als hätten Sie bewährte Methoden und ein gutes System, um Ihren extremen Release-Zyklus zu bewältigen. Sie scheinen auf dem richtigen Weg zu sein.

maple_shaft
quelle
Ja! Eine Woche mit einem großen Produkt in einer kompilierten Sprache, die windige Integrationstests erfordert, ist nicht ununterbrochen, sondern verlangsamt sich . Machen Sie zu viel mit und Sie werden Berufssterblichkeit erleben!
ZJR,
+1; Momentan führen wir dreiwöchige Iterationen durch und stellen fest, dass dies gut funktioniert.
Duncan Bayne
@ ZJR, können Sie das, was Sie damit meinen, in diesem Zusammenhang näher erläutern?
Ben
@Duncan, unsere Iterationen dauern 2 Wochen, aber wir versuchen, einwöchige Inkremente durchzuführen . Dies kann möglich oder nicht möglich sein / eine schlechte Idee. Es wird davon ausgegangen, dass ein wöchentliches Inkrement weniger neuen Code und damit weniger Probleme enthält.
Ben
1
@ Ben Aston, Die Menge an Code schafft keine Probleme, unrealistische Fristen, Stress und hohe Erwartungen schaffen Probleme.
maple_shaft
1

Warum nicht die tatsächliche kontinuierliche Bereitstellung verwenden, bei der durch ein Festschreiben (oder einen Push) die Tests ausgeführt werden und bei deren Bestehen eine Bereitstellung erfolgt?

Wenn Sie sich bei einer Änderung nicht sicher sind, führen Sie diese in einem separaten Zweig durch, wodurch die Tests zwar ausgeführt werden, aber keine Bereitstellung erfolgt.

Ich denke, es ist mehr Stress, wenn man versucht, einen kaputten Stamm / Master in Stabilität zu bringen, als wenn man ihn stabil hält.

Ricky Clarkson
quelle