Was können Sie tun, um die Anzahl der Bereitstellungsfehler einer Live-Website zu verringern?


11

Ich bin sicher, dass viele von Ihnen dieses Problem erlebt haben. Eine Website oder Webanwendung wird ausgeführt und ist live. Sie möchten die nächste Version hochladen, haben aber noch nicht alles herausgefunden, z. B. einen Wert in der Konfigurationsdatei auf false setzen, einen weiteren Datensatz in die Datenbank einfügen und viele kleinere Dinge ausführen, die manchmal bis zu 20 oder mehr Parameter zählen können.

Sobald Sie die neue Version hochladen, bricht alles zusammen. Jetzt kann die Behebung des Problems nur bis zu 20 Minuten dauern, aber der von Ihnen tolerierte Gesamtstress sowie der finanzielle und Goodwill-Schaden für das Unternehmen sind manchmal nicht zu vergessen.

Wie können diese Arten von Fehlern reduziert werden, die sich aus der Erstkonfiguration der Bereitstellung neuer Versionen ergeben?

PS: Bitte erwähnen Sie keine Checklisten, da wir sie bereits haben. Das Problem mit Checklisten ist, dass sie immer aktualisiert werden sollten, aber nicht.


6
Sie sollten Ihre Website nicht beschädigen, wenn Sie sie aktualisieren. Wenn Sie ... dann ist Ihr Verfahren falsch.
Ramhound

10
"Das Problem mit Checklisten ist, dass sie immer aktualisiert werden sollten, aber nicht." In diesem Fall sind Sie zum Scheitern verurteilt. Wir können Ihnen gute Dinge sagen, die - genau wie die Checkliste - nicht erledigt werden. Wenn Sie die Checklisten nicht auf dem neuesten Stand halten können, sollten Sie in Betracht ziehen, eine andere Art von Arbeit zu finden, bei der Fehler und Schlamperei besser toleriert werden. Vielleicht Regierungsdienst.
S.Lott

5
Wenn Sie nicht alles herausgefunden haben, sollten Sie nicht bereitstellen.
HLGEM

Wenn eine Bereitstellung fehlschlägt, müssen Sie sie zurücksetzen.
Tulains Córdova

Antworten:


28

Zwei Dinge:

  • Staging-Umgebung, ähnlich der Live-Umgebung, in der Sie Testbereitstellungen durchführen.
  • Ausführliche Tests dieser Umgebung nach der Bereitstellung. Automatisiert und nicht automatisiert.

Es gibt andere Dinge, die getan werden können.

Ich schlage vor, die 5-teilige Blogserie über die automatisierte Bereitstellung durch Troy Hunt zu lesen . Das Werkzeug, das er verwendet, ist MS-Stack-spezifisch, aber die Konzepte sind universell.


Sie meinen, dass alle Websites auf der ganzen Welt eine Staging-Umgebung haben .
Saeed Neamati

15
Nicht alle von ihnen. Aus diesem Grund haben sie solche Probleme mit der Bereitstellung. Jede Site von bedeutender Größe, mit der ich gearbeitet habe, hat eine.
Oded

@Saeed Neamati - Natürlich ist dies nicht der genaue Grund, warum so viele Websites nicht so funktionieren, wie sie sollten (dh die externe Lastzahlungswebsite meiner Kreditgenossenschaften), wenn Ihre Kunden vor Ort nur über Sie lachen. In meinem Fall habe ich die Wahl, meine Website für Kreditgenossenschaften zu verwenden.
Ramhound

6
@saeed: Ich kann nicht für die Welt sprechen, aber alle meine verdammt sicher.
Wyatt Barnett

1
@saeed alle guten tun.
HLGEM

13

Ich frage mich, warum niemand die Versionskontrolle erwähnt hat - dies ist eine der wichtigsten Möglichkeiten, um Sie vor Problemen beim Aktualisieren / Aktualisieren zu bewahren.

Erstens sollte Ihre Bereitstellung nur ein Klon des stabilen Zweigs in Ihrem Repository sein. Alles, einschließlich Konfigurationsdateien, SQL-Dateien, Installations- / Aktualisierungsskripten, MUSS versioniert sein.

Zweitens benötigen Sie "eine Art" Staging-Bereich - es kann alles sein - einen lokalen Server, einen temporären virtuellen Cloud-Server, den Sie gerade erstellt haben, ein sehr einfaches virtuelles Host-Setup oder eine vollwertige benutzerdefinierte Anwendung, die Sie pflegen zusammen mit der Haupt-App. Der Unterschied zwischen diesem "Staging-Bereich" und Ihrem "Entwicklungsbereich" besteht darin, dass der erstere Ihre tatsächliche Bereitstellungsumgebung genauer modelliert (oder simuliert). Sie können beispielsweise mit dem Apache-Modul auf PHP 5.3.x entwickeln. Da Ihr Host jedoch PHP 5.2.x mit FCGI ist, muss Ihr Staging-Bereich identisch sein.

Anschließend schreiben und testen Sie Ihre Updates zunächst in Ihrer Entwicklungsumgebung. Führen Sie diese Änderungen im Staging-Bereich-Repository zusammen und testen Sie sie erneut. Zu diesem Zeitpunkt können Sie Änderungen an Ihrer Konfiguration vornehmen, um sie an Ihre Bereitstellung anzupassen. Da diese versioniert ist, geht nichts verloren und Sie können bei Problemen jederzeit zurückkehren.

Führen Sie abschließend die Änderungen im Staging-Bereich auf Ihrer Live-Bereitstellungskopie zusammen.

Die Komplexität Ihres Staging-Bereichs sollte die Komplexität und den Umfang Ihrer App widerspiegeln. In jedem Fall ist die Versionskontrolle unverzichtbar.

Natürlich, wenn Sie keine Versionskontrolle verwenden - nichts davon trifft zu -, aber dann ist es so naiv wie das Schreiben einer Datenbank in Logo.


3
+1, aber ich habe es nicht erwähnt, weil ich nur angenommen habe, dass die Versionskontrolle verstanden wurde ...
maple_shaft

3
Ja, erstaunlich, wie viele Leute nur den Code kontrollieren, den sie interessieren, und nicht Dinge wie Konfigurationen, SQL usw.
HLGEM

1
@HLGEM, Sie haben leider Recht, ich habe alles in der Quellcodeverwaltung, ich habe sogar einen Subversion-Server, der zu Hause für NICHT-ENTWICKLUNG-Dokumente läuft, die ich zu Hause habe, wie meinen Lebenslauf und Kochrezepte. :)
maple_shaft

2
@maple_shaft, Ohhhh, ich hätte nie gedacht, meinen Lebenslauf zu versionieren, was für eine großartige Idee.
HLGEM

3
Mit Sicherheit eine großartige Idee - eines Tages würden Sie sich das Protokoll ansehen und sehen, was Sie gelernt haben und wie Sie im Laufe der Zeit immer erfahrener wurden. Und wenn Sie sich alle ein oder zwei Monate verpflichten, wäre Ihr Protokoll nach 25 Jahren sehr interessant.
Treecoder

6

Verwenden Sie wie vorgeschlagen ein Staging-System . Dies gibt Ihnen die Möglichkeit, Ihre Änderungen in einer Live-Umgebung zu testen.

Dies bringt einen weiteren Punkt auf den Punkt: Tester haben . Das Testen der Dinge, die ich selbst geschrieben habe, findet nicht so viele Fehler wie wenn jemand anderes meine Anwendung testet.

Eine andere Sache: Automatisieren Sie Ihren Bereitstellungsprozess . Führen Sie Datenbankmigrationen mit ant migrate durch, stellen Sie die neueste Version automatisch von svn über capistrano usw. bereit. Wenn Sie etwas bereitstellen, sollten Sie nicht mehr als nur einen Klick tun müssen und alles ist automatisch. Insbesondere für Websites, für die eine Konfiguration erforderlich ist, sind die für die Bereitstellung erforderlichen manuellen Schritte ein Albtraum und die Möglichkeit, dass etwas schief geht, ist enorm.


6

Für etwas, das absolut nicht brechen darf, sollten Sie ein A- und ein B-System in Betracht ziehen und einen Load Balancer verwenden, um alle Anforderungen an A weiterzuleiten, während Sie B aktualisieren und testen, und dann alles an B weiterleiten, während Sie A aktualisieren.

Fügen Sie für Bonuspunkte C hinzu und stellen Sie sicher, dass Ihre Systeme geografisch getrennt sind, damit bei einem Erdbeben nicht zwei davon gleichzeitig entfernt werden.

Für viele Anwendungen gebe ich zu, dass dies übertrieben ist.

Dies erschwert auch die Transaktionsverwaltung, die Sie durchführen müssen, aber die Probleme sind nicht unüberwindbar.


1
Dies ist die richtige Antwort

2
Vielen Dank. Aber auch Versionierung, Staging-Systeme und One-Touch-Bereitstellungen sind unerlässlich.
Bill Michell

5

Ja, Sie benötigen eine Test- oder Staging-Umgebung, in der Sie alle Schritte ausführen. Es ist jedoch ein Muss, separate Konfigurationsdateien für separate Umgebungen aufzubewahren.

Environments
|_property_files
    |_ dev
        |_ com.bla.util
        |    |_ example.properties
        |_ com.bla.beans
        |    |_ someconfig.xml
    |_ test
        ....
    |_ production
        ....
|_database_updates
    |_ dev
        |_ insert_new_static_data.sql
        |_ ...

...

Grundsätzlich verwende ich in meinen Build- und Bereitstellungsskripten eine Umgebungseigenschaft, die die umgebungsspezifischen Metadatendateien wie XML-Dateien abruft und sie vor dem Packen an meinem Build-Speicherort ersetzt. Außerdem werde ich in meinen Bereitstellungsskripten in Datenbankaktualisierungen nach SQL-Dateien suchen und diese in der konfigurierten Datenbank auch für diese Umgebung ausführen.

Ich könnte dies mit einer benutzerdefinierten Build-Aufgabe tun, aber ich verwende tatsächlich nur einige JUnit- Tests, um dies für mich zu tun. Wenn SQL-Ausnahmen auftreten, schlägt der Test fehl und somit schlägt die Bereitstellung fehl. Im Allgemeinen verfügen die SQL-Skripte auch über Intelligenz. Wenn die erforderlichen Daten bereits in der Umgebung vorhanden sind, überspringen sie das Einfügen oder Aktualisieren.

Ich habe auch ein ähnliches Verzeichnis für Batch- oder Shell-Skripte, das ich für eine bestimmte Umgebung ausführen muss.

Das Wichtigste in Ihrer Frage lautet: Sie sollten immer aktualisiert werden, werden es aber nicht.

Diese Konfigurationen steuern Ihre automatisierten Builds und Bereitstellungen. Wenn Sie sie also NICHT aktualisieren, schlagen Ihre Builds fehl und Ihr Manager wird per E-Mail darüber informiert. Für das Team ist es dann genauso wichtig, die Build- und Bereitstellungskonfigurationen für eine bestimmte Version beizubehalten, wie für das Einchecken des kompilierten Codes. Jeder Verstoß bricht den Build.

Kurz gesagt, eine stärkere Übernahme der Prinzipien der kontinuierlichen Integration (CI) wird dazu beitragen, die Schmerzen bei Produktionsfreigaben zu beseitigen.


4

1) Stellen Sie zuerst auf der Testwebsite bereit und testen Sie Ihre Änderungen

2) Haben Sie alle Konfigurationen in einer Konfigurationsdatei (Webkonfiguration oder ähnlich). Diese Konfiguration sollte dann anwendungsspezifisch sein und niemals überschrieben werden. Alle Änderungen werden dann delibriert, anstatt zu vergessen, etwas zu ändern, das sich vom Test unterscheiden sollte.


Stellen Sie sicher, dass jemand diese Konfiguration für jede Umgebung überprüft.
HLGEM

4

Zusätzlich zu den oben genannten hervorragenden Vorschlägen für eine Vorproduktionsumgebung und die Verwendung automatisierter Tests:

Reduzieren Sie die Komplexität der Codebasis. Weniger Code bedeutet im Allgemeinen weniger Fehler und eine einfachere Suche. Dies ist die Philosophie hinter Refactoring, Trennung von Bedenken und so weiter.

Segmentieren Sie die Codebasis . Ein üblicher Ansatz besteht darin, ihn zu unterteilen in:

  • Einige Kernteile, die sich langsam ändern und auf der gesamten Website gemeinsam genutzt werden
  • Viele Blattteile können sich schneller ändern, wirken sich jedoch nur auf einen kleineren Teil der Website aus

Dieses Verständnis Ihrer Codebasis ermöglicht es Ihnen, Ihre Entwicklung und Tests auf die Kernteile zu konzentrieren, da Fehler dort den drastischsten Effekt haben.


3

Bei einer gut ausgeführten Veröffentlichung dreht sich alles um Planung und Kommunikation. Berücksichtigen Sie daher vor der Durchführung einer Veröffentlichung die folgenden Fragen:

  1. Wie lange wird die Veröffentlichung voraussichtlich dauern, und besteht das Risiko, dass Personen während der Veröffentlichung weiterhin mit meinem Produkt kommunizieren können? Wenn ein Risiko für das System besteht, sollten Sie in Betracht ziehen, das System offline zu schalten und an seiner Stelle die Meldung "System befindet sich derzeit in Wartung" zu platzieren.

  2. Gibt es Kunden, die Sie möglicherweise vorab über die Veröffentlichung informieren müssen? Muss ich sie über eine mögliche Dienstunterbrechung oder Leistungsverschlechterung informieren, während die Veröffentlichung läuft? Persönlich irre ich mich immer auf der Seite der Überkommunikation und der Information aller Kunden über ein bevorstehendes Release- oder Wartungsfenster in einem öffentlichen Blog oder einem ähnlichen Veranstaltungsort.

  3. Was sind meine Notfallpläne, sollte die Veröffentlichung schief gehen? Wenn die Version beispielsweise schlecht läuft, sollten wir das System so zurücksetzen, wie es war, um die Zeit zu minimieren, in der wir offline sind? Und wenn ja, sind die Schritte zum Zurücksetzen einer Version gut dokumentiert? Oder sollte ich die richtigen Leute zur Verfügung haben, um bei der Fehlerbehebung zu helfen, falls sie auftreten sollten? Persönlich denke ich, dass der beste Weg, sich der Planung einer Veröffentlichung zu nähern, darin besteht, anzunehmen, dass mit der Veröffentlichung etwas schief gehen wird. Auf diese Weise habe ich mich gezwungen, einige dieser Themen im Voraus zu durchdenken.

Wenn Sie eine Version ausführen möchten, können Sie am besten sicherstellen, dass sie reibungslos funktioniert, indem Sie alles üben, üben, üben und dokumentieren, was Ihnen auf dem Weg begegnet. Bevor Sie neuen Code für die Produktion bereitstellen, sollten Sie zunächst die Bereitstellung des Codes in einer sicheren Staging-Umgebung mit ordnungsgemäßer Sandbox üben. Lassen Sie die Person, die für die Bereitstellung in der Produktion verantwortlich ist, die Testbereitstellung für das Staging durchführen. Betrachten Sie dies als Ihre Generalprobe und verhalten Sie sich so, als ob dies die Realität wäre. Dokumentieren Sie alles, was Sie bei jedem Schritt tun. Dokumentieren Sie jeden Befehl, den Sie ausführen, jeden SQL-Code, den Sie ausführen, alle Dateien, die Sie ändern und wie Sie sie geändert haben, und dokumentieren Sie für jeden Schritt auf dem Weg, was Sie erwarten, um zu sehen, ob die Prozedur ordnungsgemäß ausgeführt wird. Wenn Sie auf ein Problem stoßen, dokumentieren Sie, was Sie getan haben, um es zu beheben.

Dann ist die Übungsbereitstellung abgeschlossen. Sehen Sie sich Ihre Notizen an und prüfen Sie, ob Sie den Prozess verfeinern können, um Fehler zu beseitigen. Dann mach alles noch einmal . Üben Sie weiter, bis das Ausführen einer Version so routinemäßig wird wie das Befolgen eines einfachen Anweisungsblatts wie "Anmelden an diesem Computer, Ausführen dieses Befehls; Anmelden an der Datenbank und Ausführen dieses SQL-Befehls; dann ...".

Oben sind die Dinge aufgeführt, die ein Betriebs- oder Release-Management-Team tun kann, um einen reibungslosen Ablauf einer Version zu gewährleisten. Aber was kann das Engineering tun, um die Risiken in einem Release zu minimieren?

  1. Halten Sie Releases klein. Einfach ausgedrückt, je komplexer die in einer Version enthaltenen Codeänderungen sind, desto riskanter wird die Version. Tun Sie Ihrem Betriebsteam einen Gefallen, indem Sie planen, im gleichen Zeitraum eine größere Anzahl kleiner Releases anstelle einer kleineren Anzahl großer Releases zu haben.

  2. Test, Test, Test. Testen Sie Ihren Code nicht nur in Ihrer QS-Umgebung, sondern verwenden Sie die Staging-Umgebung auch zum Testen Ihrer Software. Oft gibt es Fehler, die wenig oder gar nichts mit dem Code selbst zu tun haben, sondern eine Grundursache haben, die in der Konfiguration der Umgebung selbst (oder einer Mischung aus beiden) liegt. Um diese Probleme zu finden, müssen Sie Ihren Code in einer Umgebung testen, die die Produktion genau widerspiegelt, auch bekannt als Staging.

Als letztes Wort ist manchmal nicht das Wichtigste, was wir tun, um zu verhindern, dass etwas schief geht, sondern wie wir uns verhalten, wenn etwas schief geht. Daher halte ich es für wichtig, in Ihrem Unternehmen eine Kultur aufzubauen, die sich auf betriebliche Transparenz konzentriert. Versuchen Sie nicht, Probleme vor Kunden zu verbergen. Verwenden Sie Twitter aktiv, um Kunden darüber zu informieren, ob es Probleme gibt, die Ihrem Ops-Team derzeit bekannt sind und an deren Lösung gearbeitet wird ( Lighthouse ist in dieser Hinsicht fantastisch!). Erwägen Sie, eine " Statusseite " für Ihren Service zu veröffentlichen, auf die Kunden verweisen können, um festzustellen, ob etwas nicht stimmt ( TypePad bietet ein hervorragendes Beispiel dafür). Unterm Strich immer auf der Seite der Überkommunikation irren. Ihre Kunden werden es Ihnen danken.


1

Viele Antworten hier zeigen Ihnen bereits, wie Sie Ihre spezifische Lösung für das Problem implementieren können, aber soweit ich das beurteilen kann, besteht das eigentliche Problem nicht darin, eine Website ordnungsgemäß zu migrieren / zu aktualisieren. Es kann sein, dass das Design / die Architektur dahinter fragil ist.

Wenn dies zutrifft, müssen Sie die Architektur Ihres Systems so anpassen, dass sie robust genug ist, um auch dann ordnungsgemäß zu funktionieren, wenn sich die Konfigurationseinstellungen ändern oder nicht richtig eingestellt sind, und dass sie sich bei Auftreten ordnungsgemäß verschlechtert. Wenn Sie neue Funktionen hinzugefügt oder alte Funktionen so geändert haben, dass eine neue Datenbankspalte erforderlich ist, funktioniert Ihre Site im Idealfall auch dann, wenn die Spalte fehlt (möglicherweise ohne die neue Funktionalität oder mit einer verschlechterten Form der alten Funktionalität). . Ihr Kunde sollte kein Geld verlieren - im schlimmsten Fall erhält er möglicherweise kein neues Geld aus den Verbesserungen, die Sie vorgenommen haben.

Wenn Ihr System so zerbrechlich ist, dass Konfigurationseinstellungen so schwerwiegende Probleme verursachen können, sind Programmaktualisierungen nicht die einzigen Ursachen für Probleme. Wenn Sie herausfinden, wie die Aktualisierungen sicher durchgeführt werden, erhöht sich nur der Schaden, den Sie erleiden, wenn ein Fehler auftritt eine andere Quelle.

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.