Wie kann ich Produktionsbereitstellungen automatisieren, ohne dass ich große Angst habe?


32

In unserem Shop verwenden wir SVN für die Quellcodeverwaltung und CruiseControl für CI für die Verarbeitung automatischer Builds und Bereitstellungen in unseren Entwicklungs-, Test- und Integrationsumgebungen.

Dies alles funktioniert reibungslos. Aufgrund von Hardware- und Ressourcenbeschränkungen ist unsere Integrationsumgebung jedoch keine Umgebung mit einem Lastausgleich von 2 Servern wie unsere Produktionsumgebung. Während alles andere gleich ist, wäre das der einzige Unterschied zwischen unserer Integrations- und Produktionsumgebung (obwohl ein großer!)

Theoretisch liegt der Unterschied in einer etwas anderen Konfiguration unserer App-Server, und das Bereitstellungsskript müsste lediglich die Build-Artefakte auf zwei Server anstatt nur auf einen ablegen. Warum bin ich jedoch so nervös, unsere Produktionsbereitstellungen zu automatisieren ?!

Ich bin im Allgemeinen kein Kontrollfreak, aber ich habe immer das unersättliche Bedürfnis, die Produktion manuell in die Produktion umzusetzen. Ich habe von Kollegen gehört, dass dies im Allgemeinen eine wirklich schlechte Sache ist, aber sie haben es nicht geschafft, dagegen vorzugehen.

Wenn ich es manuell mache, kann ich SEHEN, dass ich die richtigen Dateien physisch kopiere, die App-Server physisch herunterfahre und sicherstelle, dass sie erfolgreich geschlossen wurden. Ich starte die Server physisch und überprüfe dann die Protokolle, um sie zu erstellen Sicher, es wurde ordnungsgemäß gestartet und die Bereitstellung war erfolgreich. Es gibt mir einen Seelenfrieden.

Was spricht gegen diese ODER-Argumente für die automatische Bereitstellung von Produktionsskripten?


'ls' nach 'rm' erlaubte mir einmal, einen katastrophalen rm zu fangen, der durch harte Verbindungen zu höheren Stellen im Dateisystem zurückkehrte. Konnte es abfangen, während noch genügend System vorhanden war, um die bereits gelöschten Dateien wiederherzustellen (das Löschen von Millionen von Dateien scheint glücklicherweise eine Weile zu dauern!). :-)
Brian Knoblauch

Antworten:


30

Es gibt ein paar offensichtliche Argumente dagegen.

  1. Was passiert, wenn du gehst? Sind all diese Informationen sorgfältig dokumentiert oder befinden sie sich größtenteils in Ihrem Kopf? Automatisierte Skripte sind ein viel besserer Ort für jemanden, den jemand anderes übernehmen kann.

  2. Jeder macht Fehler. Es wird eine Zeit kommen, in der die Person, die den Einsatz durchführt, müde ist und überhaupt nicht aufpasst. Ja, im Idealfall werden Bereitstellungen nur an einem ruhigen Ort mit viel Zeit durchgeführt. In der Praxis können sie überstürzt und gestresst sein, wenn sie versuchen, dringende Korrekturen vorzunehmen. Dies ist die wahrscheinlichste und teuerste Zeit, um einen Fehler zu machen. Handelt es sich bei der Bereitstellung um ein einzelnes Skript, ist das Fehlerpotenzial begrenzt.

  3. Zeit. Wenn Bereitstellungen komplizierter werden, steigt der erforderliche Aufwand. Skripte müssen nur gestartet, manuell überprüft und dann manuell umgeschaltet werden (Sie können dies auch automatisieren, aber ich teile einige der Paranoia :).


21

Sie können das Beste aus den besten Welten gewinnen: Sorgenfreie Prozessverifizierung und zuverlässige Automatisierung.

Erstellen Sie ein Skript für die Bereitstellung. Überprüfen Sie anschließend manuell, ob Prozesse gestartet, Dateien entfernt usw. wurden. Schreiben Sie also Ihr eigenes QA-Skript, um zu überprüfen, ob die automatisierten Schritte 1 - X tatsächlich ausgeführt wurden.


7
Vielleicht so etwas wie das Erstellen eines eigenen Assistenten, bei dem Sie jeden Schritt manuell auslösen können. Es wird eine Protokollausgabe mit den Details erstellt, die Sie überprüfen müssen, bevor Sie mit dem nächsten Schritt fortfahren.
JeffO

@ Jeffo Ich mag diese Idee! Wir haben gerade in ein nettes Swing-GUI-Tool investiert, das ich für jede Ausrede, es zu benutzen, auf den neuesten Stand bringe. Ich rüste GUI-Tools schneller als je zuvor aus, und ein visueller Assistent wäre so nett, dass ein Junior-Entwickler damit umgehen könnte.
maple_shaft

@maple_shaft Und Sie wissen, dass der Schritt, bei dem die richtigen Dateien kopiert werden, zum richtigen Zeitpunkt ausgeführt wurde.
JeffO

Ich stimme dem zu. Etwas so Einfaches wie eine Batch-Datei (oder eine Reihe von Dateien), die Sie für Ihre Bereitstellung benötigen, kann die Spannung erheblich verringern. Verwenden Sie Stapeldateien, um sicherzustellen, dass Sie keine Fehler machen, und führen Sie die manuell aus, um sicherzustellen, dass beim Ausführen der Stapeldateien keine schwerwiegenden Fehler auftreten.
Kibbee

4
@ Jeff O - Ich mag die Protokollierungsidee. Dies schafft Rückverfolgbarkeit und gibt Ahorn etwas für die Qualitätssicherung. Die Zaubereridee gefällt mir nicht. Je mehr Schritte erforderlich sind, um Ihr Produkt für die Produktion zu veröffentlichen, desto wahrscheinlicher wird es jemand vermasseln. Automatisieren Sie einfach alles. Überprüfen Sie es mit Menschen.
P.Brian.Mackey

15

Ich denke, der Schlüssel hier ist: Warum denkst du, dass du den Überprüfungsprozess nicht skripten kannst?

Meine Bereitstellungsskripte übertragen nicht nur Archive und starten Dienste neu. Sie drucken bei jedem Schritt der Bereitstellung viele farbcodierte Informationen aus und bieten mir am Ende eine Zusammenfassung der Ereignisse. Es zeigt mir, dass Prozesse aktiv sind, dass die Homepage einen Statuscode von 200 enthält und dass alle Maschinen und Dienste einander gut sehen können. Ich habe dann einen separaten Dienst, der nicht Teil des Skripts ist und der Protokolldateien, Fehler auf 4xx- und 5xx-Ebene sowie wichtige Site-Metriken überwacht. Es schreit mich dann über alle möglichen Medien (E-Mail, SMS und Alarme) an, wenn es drastische Spitzen mit negativen Auswirkungen gibt.

Zwischen diesen und CI-Servern, auf denen Tests ausgeführt werden, wird auf dieser Automatisierungsebene buchstäblich implementiert und vergessen. Ich kann nach einem Push nicht einmal eine einzelne Seite auf der Website durchsuchen, da der Prozess jetzt so zuverlässig ist, dass ich nicht nur so oft wie gewünscht bereitstellen kann, sondern auch ein neuer Entwickler des Projekts eine Aktualisierung der Live-Version vornehmen kann Website innerhalb von Minuten an Bord zu kommen. In der Vergangenheit habe ich sogar die CI-Server nach einer Übergabe an einen Master- / Trunk-Zweig, der alles übergibt, automatisch für die Produktion bereitstellen lassen. So sicher bin ich mit meinen Werkzeugen.

Das solltest du auch sein.


1
Ich wünschte, ich könnte dieses Maß an Vertrauen haben, aber es ist nicht das Vertrauen in Tools, das dies verhindert, sondern das Vertrauen in die Qualität der Anwendung, die ich geerbt habe, und in die "Primadonna" -Natur nach der Bereitstellung. Natürlich ist das, was Sie beschreiben, mein feuchter Traum und das Endspiel, das ich suche.
maple_shaft

@maple_shaft Ja, wenn es sich um eine Legacy-Anwendung mit unzureichender Testabdeckung handelt, kann ich definitiv feststellen, dass manuelle Eingriffe erforderlich sind, insbesondere wenn bekannt ist, dass sie heikel sind.
Pewpewarrows

1
Eine gute Methode zur Vorbereitung des Skripts besteht darin, einfach eine der Bereitstellungen in einer Datei aufzuzeichnen, einzugeben und auszugeben und sie dann so zu ändern, dass die Ausgabe nach Fakten durchsucht wird, die Sie normalerweise mit Ihren Augen überprüfen.
SF.

8

Führen Sie Ihre Produktionsmaschinen auch mit Remote-Debugging aus und gehen Sie diese manuell durch? Das Erstellen eines richtigen Skripts ist identisch mit dem Schreiben eines Programms. Alle Probleme, die Sie haben, weisen auf Dinge hin, auf die Sie achten und prüfen müssen.

Wenn etwas schief geht, sollte es die richtigen Rollback-Prozeduren durchlaufen und Ihnen eine Nachricht senden. Alles, was passiert, kann für später protokolliert werden. Sie können die Skripte versionieren und Testfälle einrichten.

Wenn Sie jedoch Befehle manuell ausführen, haben Sie keinen dieser Vorteile. Sie haben stattdessen eine Liste von Nachteilen.

  • Sie haben kein gutes Protokoll, der Shell-Verlauf zählt nicht
  • Niemand weiß, wie es geht
  • Schritte werden übersehen
  • Überprüfungen werden nur manchmal durchgeführt
  • Einige Elemente, die bereitgestellt werden sollen, werden möglicherweise übersehen. Das habe ich bereits getan
  • Es dauert viel länger
  • Sie können während des Vorgangs unterbrochen werden

Ein richtiges Skript sollte fast identisch sein, wenn Sie alles in die Shell eingegeben haben. Dies ist einer der Gründe, warum wir Bash-Skripte haben. Wenn Sie den Dingen vertrauen, die Sie tun, warum können Sie dann nicht alles aufzeichnen und straffen? Besser prüfen, schneller prüfen, mehr prüfen kann passieren, weil der Computer es tut.


7

Ich kann verstehen, dass ich etwas nervös bin, wenn ich etwas Neues in der Produktumgebung probiere. Sein vorsichtig mögliche Katastrophe ist eine gute Sache TM .

Automatisierte Scripting ist auch eine gute Sache TM und so lange , wie Sie es vorsichtig nähern, sollten Sie in der Lage sein , um die Gefahr zu minimieren und Ihre Angst zu senken. Mein Rat lautet also:

  • Bereiten Sie eine Checkliste / Testreihe vor (und üben Sie diese), damit Sie schnell herausfinden können, ob sie funktioniert hat und was passiert, wenn etwas schief gelaufen ist. Eine ausführliche Protokollierung kann dabei hilfreich sein.
  • Alles sichern. Bereiten Sie ein manuelles Rollback vor und üben Sie es, damit Sie es wiederherstellen können, wenn ein schwerwiegender Fehler auftritt.
  • Testen Sie so viel wie möglich, bevor Sie es mit dem richtigen Produkt versuchen. Klingt so, als wären Sie mit Ihrer Integrationsumgebung ein guter Weg.
  • Wenn Sie es zum ersten Mal versuchen, sollten Sie es mit einer geringen Änderung des Profils und der Auswirkung durchführen. So etwas wie ein kleines Upgrade oder ein Patch. Die Idee ist, die Auswirkungen zu minimieren, wenn es schief geht. Wählen Sie für Ihren ersten Lauf kein bedeutendes Upgrade (bei dem der CEO und alle Ihre Konkurrenten zuschauen).

Sobald Sie ein paar erfolgreiche Läufe hinter sich haben, wächst Ihr Selbstvertrauen und Sie werden sich bald fragen, wie Sie es jemals geschafft haben, manuelle Bereitstellungen vorzunehmen.


1
Ich denke, Ihre Antwort ist eine der besten, da sie tatsächlich die Ängste beseitigt, während die meisten anderen Antworten nicht zum Thema gehören und eine automatisierte Bereitstellung befürworten - deren Vorteile dem OP bereits bewusst sind. So verdient Ihre Antwort die Prämie!
user40989

4

Hier ist das größte Argument gegen manuelle Bereitstellungen in der Produktion: Sie sind ein Mensch und werden Fehler machen. Es wird zweifellos Zeiten geben, in denen Sie vergessen werden, etwas zu tun, das Ihnen Kummer bereiten wird. Eine gut geschriebene automatisierte Bereitstellung weist nicht dieselbe Tendenz auf. Es ist wahr, dass Sie immer noch fehlerhafte Produktivbereitstellungen haben können, aber das liegt daran, dass Ihre automatisierte Bereitstellung Fehler enthält, die behoben werden müssen.

Nach meiner Erfahrung sind die Vorteile der automatisierten Bereitstellung in der Produktion enorm. Das größte Problem ist, dass Sie an den Wochenenden Spaß haben, anstatt zu versuchen, durch einen manuellen Bereitstellungsprozess zu marschieren, der nicht zusammenarbeitet.

Im Folgenden finden Sie einige wichtige Hinweise zur Automatisierung Ihrer Produktionsbereitstellungen:

  • Mach nicht alles auf einmal! Beginnen Sie langsam mit dem Schreiben Ihrer automatisierten Bereitstellungen. Richten Sie zuerst eine separate Nichtproduktionsumgebung ein und versuchen Sie, die Bereitstellung dort zu automatisieren. Sobald Sie Vertrauen in Ihre automatisierten Bereitstellungen aufgebaut haben, können Sie über Produktionsbereitstellungen nachdenken
  • Starten Sie die Freigabe und Bereitstellung sehr häufig! Es ist viel einfacher, automatisierte Bereitstellungen durchzuführen, wenn Sie nicht über 4 Monate Code verfügen, der auf die Freigabe wartet. Veröffentlichen Sie mehrmals pro Woche kleine Funktionen und Fehlerbehebungen. Die Vorteile dieses Release-Stils sind nicht zu unterschätzen!
  • Verlassen Sie sich auf automatisierte Tests, um sicherzugehen, dass Ihre Produktionsumgebung funktioniert. Auch dies braucht Zeit zum Aufbau, ist aber sehr wichtig. Automatisierte Tests sind immer besser als manuelle Abnahmetests. Sicher, manuelle Abnahmetests sind in Ordnung, aber automatisierte Tests können Ihnen helfen, festzustellen, ob Sie in der Produktion bereitstellen sollen oder nicht. Sie sind der Schlüssel, der diesen gesamten Prozess der automatisierten, kontinuierlichen Lieferung ermöglicht. Wenn Ihre Tests nicht bestanden werden, sollten Sie sie nicht in der Produktion bereitstellen.

3

Führen Sie die Skripte auf dem Live-Server aus. Es wird funktionieren, und nachdem Sie ein paar Mal gesehen haben, dass es gut funktioniert, werden Sie vollkommen zuversichtlich sein.

Im Ernst, es ist wahrscheinlicher, dass Sie Fehler machen als das Bereitstellungsskript.


3

Computer machen keine Fehler, die Leute machen es.

Schreiben Sie Ihr Skript einmal und überprüfen Sie es gründlich, gehen Sie es Zeile für Zeile durch. Von da an können Sie sicher sein, dass es bei jeder Bereitstellung funktioniert.

Tun Sie es von Hand und Sie sind verpflichtet, Fehler zu machen. Vielleicht hast du geschrieben, was du zu tun hast, aber es ist so einfach, einen Fehler zu machen. Müssen Sie alle Dateien außer der Datei web.config kopieren? Sie können wetten, dass Sie es eines Tages überschreiben werden. Ein Skript wird diesen Fehler niemals machen.


3

Wie kann ich Produktionsbereitstellungen automatisieren, ohne dass ich große Angst habe?

Die extreme Besorgnis, die Sie bei der Automatisierung von Produktionsbereitstellungen verspüren, beruht höchstwahrscheinlich auf zwei Überzeugungen:

  1. Eines Tages oder des anderen schlägt ein Bereitstellungsschritt fehl und Sie oder ein anderer Mensch können sich schnell von dem Fehler erholen, während ein automatisiertes Skript dies übersehen könnte.

  2. Ein übersehener Produktionsausfall hat dramatische Folgen.

Es gibt wenig, was man gegen 2. tun kann, abgesehen von der Vermeidung von Fehlern. Konzentrieren wir uns also auf 1.

Eine kostengünstige Lösung, die die vorhandene Lösung leicht verbessert, wäre die Verwendung eines halbautomatischen Bereitstellungsverfahrens, das am Ende jedes Installationsschritts auf die Validierung wartet. Mit einer halbautomatischen Lösung profitieren Sie von den Vorteilen einer vollautomatischen Lösung wie Konsistenz und Reproduzierbarkeit, während Sie dennoch die Möglichkeit haben, Fortschritte zu überwachen und Fehler zu beheben, wie Sie es derzeit gewohnt sind.

Das halbautomatische Skript und sein Biotop (Regressionstests usw.) können auch als Grundlage für das gesammelte Wissen über Fehler bei der Installation und Möglichkeiten zur Behebung dienen.


2

Was ich mag, ist, dass Sie die Bereitstellung auf Staging oder QS testen können und wissen, dass beim Ausführen auf prod genau dieselben Schritte ausgeführt werden.

Wenn Sie es manuell machen, ist es einfacher, einen Schritt zu vergessen oder sie außer Betrieb zu setzen.


Das Problem ist, dass Prod und Staging und QA nicht gleich aussehen. Das Skript erledigt also in jeder Umgebung unterschiedliche Aufgaben. Das Skript wird also zum ersten Mal in der Produktion getestet.
Piotr Perak

Richten Sie dann eine Umgebung ein, die Sie von Prod aus aktualisieren, bevor Sie das automatisierte Skript ausführen. Verwenden Sie es für nichts anderes.
HLGEM

Ich verstehe nicht Wenn er eine Umgebung einrichten könnte, die wie PROD aussieht, hätte er überhaupt kein Problem.
Piotr Perak

1

... Aufgrund von Hardware- und Ressourcenbeschränkungen ist unsere Integrationsumgebung keine Umgebung mit 2 Servern und Lastausgleich, wie unsere Produktionsumgebung. Während alles andere gleich ist, wäre das der einzige Unterschied zwischen unserer Integrations- und Produktionsumgebung (obwohl ein großer!)

Angesichts der obigen Ausführungen wäre ich wahrscheinlich genauso besorgt wie Sie.

Ich habe einmal automatisierte Skripts überprüft und getestet, die für SLB bereitgestellt werden, und ich habe das Gefühl, dass ich es vorziehen würde, die Dinge manuell zu erledigen , ohne sie zuvor bei einem Setup mit Lastenausgleich zu testen .


Abgesehen von den prod-ähnlichen Testkonfigurationen hatte eine weitere wichtige Auswirkung darauf, dass die Prod-Bereitstellung von einem anderen Team als den Entwicklern durchgeführt wurde - von Leuten, deren einzige Aufgabe darin bestand, die Produktionsumgebung zu warten.

  • In einem der Projekte unterstützte ich sie bei der Bereitstellung als Entwickler-Team-Vertreter. Vor der Bereitstellung überprüften sie meine Anweisungen, und während der Bereitstellung saß ich nur online und war bereit, um zu erfahren, ob Probleme auftreten. Damals lernte ich diese Trennung zu schätzen .
     
    Nicht, dass sie schneller waren (warum? Ich habe Bereitstellungen 5x-10x häufiger getestet als sie). Der große Unterschied lag im Fokus. Ich meine, mein Kopf wird immer von "Hauptinhalten" belastet - Codierung, Debugging, neue Funktionen - es gibt einfach zu viele Ablenkungen, um mich richtig auf die Bereitstellung zu konzentrieren. Im Gegensatz dazu war ihre Hauptaufgabe nur die Instandhaltung der Produktion und sie waren darauf fokussiert.
     
    Es ist erstaunlich, wie viel besser das Gehirn arbeitet, wenn es fokussiert ist. Diese Jungs, sie waren einfach so viel aufmerksamer, sie haben so viel weniger Fehler gemacht als ich. Sie kannten das Zeug einfach besser als ich. Sie haben mir sogar ein oder zwei Dinge beigebracht, die meine eigenen Testbereitstellungen einfacher machten.

Danke, es ist schön, von jemandem zu hören, der weiß, wie sich das anfühlt. Selbstverständlich sind wir viel zu klein, um ein Build-Team zu gewährleisten, das sich um unsere Produktionsbereitstellungen kümmert. Wenn du bei einem Startup arbeitest, lernst du ziemlich schnell, 20 verschiedene Hüte zu tragen und ich habe nicht immer den Luxus des "Fokus". Ich denke, dass ich ein stabiles Bereitstellungs- und Überprüfungsskript für meine Vernunft schreiben werde. Zum ersten Mal in einer Weile habe ich eine zweiwöchige Pause zwischen Projekten, in denen ich so etwas erledigen kann.
maple_shaft

Verifizierungsskript sehe ich. Nun, angesichts Ihrer Situation scheint dies nach einem engagierten Build-Team die zweitbeste Sache zu sein. Ich frage mich übrigens, ob Sie wirklich keine Möglichkeit haben, die Bereitstellung auf zwei Servern zu testen. Auch wenn Sie den Load Balancer überspringen, nur um zu testen, ob beide Master / Slave-URLs antworten.
gnat

1

Erstellen Sie ein Implementierungsskript, mit dem Sie Ihren Code in eine beliebige Umgebung verschieben können. Wir verwenden genau den gleichen Bereitstellungsprozess, um Code nach dev, qa, Staging und schließlich in die Produktion zu verschieben. Da wir mehrmals täglich für Entwickler und täglich für die Qualitätssicherung bereitstellen, haben wir das Vertrauen gewonnen, dass die Bereitstellungsskripten korrekt sind. Testen Sie es einfach, indem Sie es häufig verwenden.


1
  1. Vereinfachen. Ihr Änderungsprozess sollte Rsync-Dateien sein, SQL-Skript ausführen, nichts weiter.
  2. Automatisieren.
  3. Prüfung.

Der Grund für die Automatisierung ist, dass Sie etwas erhalten, das testfähig und wiederholbar ist und auf das Sie vertrauen können, dass es in jeder erwarteten Situation richtig funktioniert.

Wie bei jeder Änderung in einem beliebigen Kontext müssen Sie immer noch einen Zurücksetzungsplan haben, der auch automatisiert werden sollte.

Sie möchten den Vorgang auch dann beobachten, wenn die Umgebung sehr empfindlich ist, aber niemals manuell, da er einfach nicht reproduziert werden kann.


0

Es ist durchaus möglich, Automatisierungsskripts für die Bereitstellung in Produktionsumgebungen zu verwenden. Um dies jedoch zuverlässig zu tun, müssen Sie in der Lage sein, mehrere Dinge zu tun.

  1. Führen Sie einen Rollback auf die vorherige Version durch.
  2. Erhalten Sie eine positive Bestätigung, dass die Bereitstellung erfolgreich angewendet wurde und auf gültigen Datenverkehr reagiert.
  3. Haben Sie vergleichbare Umgebungen für Entwicklung und Qualitätssicherung, die auch die gleichen Skripte verwenden.

Skripte haben einige Vorteile: Sie werden niemals einen Befehl verpassen, weil es 2 Uhr morgens ist und sie müde sind.

Skripte können und werden jedoch weiterhin fehlschlagen. Manchmal liegt der Fehler im Design des Skripts, aber er kann auch durch einen Netzwerk- oder Stromausfall, ein beschädigtes Dateisystem oder Speichermangel verursacht werden.

Aus diesem Grund ist es wichtig, dass nach der Ausführung des Skripts auch eine definierte Testphase befolgt wird, in der überprüft wird, ob die neue Bereitstellung ausgeführt wird und Anforderungen verarbeitet werden, bevor der Live-Datenverkehr aktiviert wird.


-2
  1. Nehmen Sie zum ersten Mal ein größeres Fenster für die Bereitstellung in Anspruch, wenn Probleme auftreten
  2. Teilen Sie den Bereitstellungsprozess in zwei Teile. ein. Backup (manuell) - Dies sollte Ihnen Sicherheit geben, wenn während der Bereitstellung etwas schief geht

    b. Bereitstellung (automatisiert)

sobald Sie in der Lage sind, mit Vertrauen zum ersten Mal bereitzustellen. Sie können den Sicherungsvorgang auch automatisieren.


Dies beantwortet die gestellte Frage nicht: "Was spricht gegen diese ODER-Argumente für die automatische Bereitstellung von Produktionsskripten?"
gnat
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.