Die Veröffentlichung eines neuen Projekt-Release in die Produktionsumgebung erfordert ein sorgfĂ€ltiges Gleichgewicht zwischen der Bereitgeschwindigkeit und der ZuverlĂ€ssigkeit der Lösung. Bei Slack schĂ€tzt man schnelle Iterationen, kurze Feedbackzyklen und eine zĂŒgige Reaktion auf Nutzeranfragen. AuĂerdem gibt es im Unternehmen Hunderte von Programmierern, die bestrebt sind, möglichst produktiv zu arbeiten.
Die Autoren des Materials, dessen Ăbersetzung wir heute veröffentlichen, sagen, dass ein Unternehmen, das sich solchen Werten verschrieben hat und gleichzeitig wĂ€chst, kontinuierlich seine Bereitstellungssysteme verbessern muss. Unternehmen sollten Kraft in die Transparenz und ZuverlĂ€ssigkeit ihrer Arbeitsprozesse investieren, damit diese Prozesse dem Umfang des Projekts entsprechen. Hier wird von den Arbeitsprozessen gesprochen, die sich bei Slack entwickelt haben, und von einigen Lösungen, die das Unternehmen zur bestehenden Bereitstellungssystematik gefĂŒhrt haben.
Wie die Prozesse der Projektbereitstellung heute funktionieren
Jeder PR (Pull-Request) bei Slack muss unbedingt einer Code-ĂberprĂŒfung unterzogen werden und alle Tests erfolgreich bestehen. Erst nachdem diese Bedingungen erfĂŒllt sind, kann der Programmierer seinen Code mit dem Master-Branch des Projekts zusammenfĂŒhren. Das Deployment dieses Codes erfolgt jedoch nur wĂ€hrend der Arbeitszeiten nach nordamerikanischer Zeit. Dadurch sind wir, da unsere Mitarbeiter an ihren ArbeitsplĂ€tzen sind, vollstĂ€ndig bereit, unerwartete Probleme zu lösen.
Jeden Tag fĂŒhren wir etwa 12 geplante Deployments durch. WĂ€hrend jedes Deployments ist der Programmierer, der als Hauptverantwortlicher fĂŒr das Deployment bestimmt ist, fĂŒr die Veröffentlichung einer neuen Build in die Produktionsumgebung zustĂ€ndig. Dies ist ein mehrstufiger Prozess, der eine reibungslose Veröffentlichung der Build in den Betriebsmodus gewĂ€hrleistet. Durch diesen Ansatz können wir Fehler entdecken, bevor sie alle unsere Nutzer betreffen. Wenn es zu viele Fehler gibt, kann die Bereitstellung der Build zurĂŒckgesetzt werden. Sollte jedoch ein spezifisches Problem nach dem Release entdeckt werden, kann dafĂŒr leicht ein Patch veröffentlicht werden.

Die BenutzeroberflĂ€che des Checkpoint-Systems, das bei Slack fĂŒr die Projektbereitstellung verwendet wird
Der Prozess der Bereitstellung eines neuen Releases in der Produktionsumgebung lÀsst sich in vier Schritte unterteilen.
â1. Erstellung eines Release-Zweigs
Jedes Release beginnt mit einem neuen Release-Zweig, der einen Punkt in unserer Git-Geschichte darstellt. Dies ermöglicht es, dem Release Tags zuzuweisen und bietet einen Ort, an dem zeitnahe Korrekturen fĂŒr Fehler vorgenommen werden können, die wĂ€hrend der Vorbereitung des Releases fĂŒr den Produktionsbetrieb gefunden wurden.
â2. Bereitstellung in einer Zwischenumgebung
Der nĂ€chste Schritt besteht darin, den Build auf den Staging-Servern bereitzustellen und automatisierte Tests zur allgemeinen FunktionsfĂ€higkeit des Projekts (Smoke-Test) durchzufĂŒhren. Die Zwischenumgebung ist eine Produktionsumgebung, in die kein externer Verkehr gelangt. In dieser Umgebung fĂŒhren wir zusĂ€tzliche manuelle Tests durch. Dies gibt uns zusĂ€tzliche Sicherheit, dass das geĂ€nderte Projekt korrekt funktioniert. Allein automatisierte Tests reichen nicht aus, um eine solche Sicherheit zu erlangen.
â3. Bereitstellung in Dogfood- und Canary-Umgebungen
Die Bereitstellung in der Produktion beginnt mit der Dogfood-Umgebung, die aus einer Gruppe von Hosts besteht, die unsere internen Slack Arbeitsbereiche bedienen. Da wir Ă€uĂerst aktive Slack-Nutzer sind, hat dieser Ansatz geholfen, viele Fehler in frĂŒhen Phasen der Bereitstellung zu entdecken. Nachdem wir sichergestellt haben, dass die GrundfunktionalitĂ€t des Systems nicht beeintrĂ€chtigt wurde, wird der Build in der Canary-Umgebung bereitgestellt. Diese besteht aus Systemen, die etwa 2 % des Produktionsverkehrs erhalten.
â4. Stufenweise Bereitstellung in der Produktion
Wenn die Ăberwachungswerte des neuen Releases stabil sind und wir nach der Bereitstellung des Projekts in der Canary-Umgebung keine Beschwerden erhalten haben, fahren wir mit der schrittweisen Umstellung der Produktionsserver auf das neue Release fort. Der Bereitstellungsprozess ist in die folgenden Phasen unterteilt: 10 %, 25 %, 50 %, 75 % und 100 %. Dadurch können wir den Produktionsverkehr langsam an das neue Release des Systems ĂŒbergeben. Dabei haben wir Zeit, die Situation zu analysieren, falls Anomalien auftreten.
âWas tun, wenn wĂ€hrend der Bereitstellung etwas schiefgeht?
Das Ăndern des Codes ist immer mit Risiken verbunden. Doch wir bewĂ€ltigen dies dank gut vorbereiteter "Deploy-Manager", die den Prozess der EinfĂŒhrung neuer Releases in die Produktion leiten, die Ăberwachungskennzahlen im Blick behalten und die Arbeit der Programmierer, die den Code veröffentlichen, koordinieren.
Wenn tatsĂ€chlich etwas schiefgeht, versuchen wir, das Problem so frĂŒh wie möglich zu entdecken. Wir untersuchen das Problem, finden den PR, der die Fehler verursacht, rollen ihn zurĂŒck, analysieren grĂŒndlich und erstellen einen neuen Build. Leider bleibt das Problem manchmal unentdeckt, bis das Projekt in die Produktion geht. In einem solchen Fall ist es am wichtigsten, den Betrieb des Dienstes wiederherzustellen. Daher rollen wir sofort auf den vorherigen stabilen Build zurĂŒck, bevor wir mit der Problemuntersuchung beginnen.
BaukĂ€sten fĂŒr das Deployment-System
Betrachten wir die Technologien, die unserer Projektdistributionssystem zugrunde liegen.
âSchnelle Deployments
Der oben beschriebene Arbeitsprozess mag im RĂŒckblick offensichtlich erscheinen. Aber unser Deploymentsystem wurde nicht von heute auf morgen so.
Als das Unternehmen viel kleiner war, konnte unsere gesamte Anwendung auf 10 Amazon EC2-Instanzen laufen. Ein Deployment des Projekts bedeutete in dieser Situation, rsync fĂŒr die schnelle Synchronisierung aller Server anzuwenden. FrĂŒher war der neue Code nur einen Schritt von der Produktion entfernt, dargestellt durch eine Entwicklungsumgebung. Builds wurden in dieser Umgebung erstellt und getestet und gingen dann direkt in die Produktion. Es war sehr einfach, sich in einem solchen System zurechtzufinden; es ermöglichte jedem Programmierer, jederzeit den von ihm geschriebenen Code zu deployen.
Mit dem Wachstum unserer Kundenanzahl wuchs auch die Infrastruktur, die fĂŒr den Betrieb des Projekts erforderlich war. Bald, angesichts des fortwĂ€hrenden Wachstums des Systems, konnte unser Deploymentsmodell, das auf dem Versand neuen Codes an die Server basierte, seiner Aufgabe nicht mehr gerecht werden. Besonders die HinzufĂŒgung jedes neuen Servers erhöhte die Zeit, die fĂŒr das Deployment benötigt wurde. Selbst Strategien, die auf paralleler Anwendung von rsync basieren, haben bestimmte EinschrĂ€nkungen.
Letztendlich haben wir dieses Problem gelöst, indem wir auf ein vollstĂ€ndig paralleles Deployment-System umgestiegen sind, das nicht wie das alte System strukturiert ist. Genauer gesagt, nun haben wir den Code nicht mehr auf die Server ĂŒbertragen, indem wir ein Synchronisierungsskript verwendet haben. Jetzt hat jeder Server selbstĂ€ndig die neue Version geladen, indem er durch die Beobachtung der SchlĂŒsselĂ€nderung in Consul informiert wurde, dass dies notwendig war. Die Server luden den Code parallel. Dies ermöglichte es uns, eine hohe Geschwindigkeit beim Deployment aufrechtzuerhalten, selbst in einer stĂ€ndig wachsenden Systemumgebung.

1. Produktionsserver beobachten den Consul-SchlĂŒssel. 2. Der SchlĂŒssel Ă€ndert sich, was den Servern mitteilt, dass sie mit dem Laden des neuen Codes beginnen mĂŒssen. 3. Die Server laden Tarball-Dateien mit dem Anwendungs-Code herunter.
âAtomare Deployments
Eine weitere Lösung, die uns geholfen hat, ein mehrstufiges Deployment-System zu erreichen, war das atomare Deployment.
Vor der Verwendung atomarer Deployments konnte jedes Deployment zu einer Vielzahl von Fehlermeldungen fĂŒhren. Der Grund dafĂŒr war, dass der Prozess des Kopierens neuer Dateien auf die Produktionsserver nicht atomar war. Dies fĂŒhrte zu einem kurzen Zeitfenster, in dem der Code, der neue Funktionen aufrief, verfĂŒgbar war, bevor diese Funktionen selbst verfĂŒgbar wurden. Wenn dieser Code aufgerufen wurde, fĂŒhrte dies zu internen Fehlern. Dies Ă€uĂerte sich in fehlgeschlagenen API-Anfragen und "kaputten" Webseiten.
Das Team, das sich mit diesem Problem beschĂ€ftigte, löste es, indem es das Konzept von "heiĂen" (hot) und "kalten" (cold) Verzeichnissen einfĂŒhrte. Der Code im "heiĂen" Verzeichnis ist fĂŒr die Verarbeitung des Produktionsverkehrs verantwortlich. In den "kalten" Verzeichnissen wird der Code wĂ€hrend des Betriebs des Systems nur fĂŒr die Nutzung vorbereitet. WĂ€hrend des Deployments wird der neue Code in ein unbenutztes "kaltes" Verzeichnis kopiert. Dann, sobald auf dem Server keine aktiven Prozesse mehr laufen, erfolgt ein sofortiger Wechsel der Verzeichnisse.

1. Entpacken des Anwendungs-Codes in das "kalte" Verzeichnis. 2. Umschalten auf das "kalte" Verzeichnis, das "heiĂ" wird (atomare Operation).
Ergebnisse: Verschiebung des Fokus auf ZuverlÀssigkeit.
Im Jahr 2018 erreichte das Projekt AusmaĂe, bei denen die sehr schnelle Bereitstellung die StabilitĂ€t des Produkts zu schĂ€digen begann. Wir hatten ein ziemlich fortschrittliches Bereitstellungssystem, in das wir viel Aufwand und Zeit investiert hatten. Wir mussten lediglich die Prozesse der Bereitstellungsorganisation umstrukturieren und verbessern. Wir hatten uns zu einem ziemlich groĂen Unternehmen entwickelt, dessen Entwicklungen weltweit fĂŒr die Bereitstellung einer unterbrechungsfreien Kommunikation und zur Lösung wichtiger Aufgaben eingesetzt wurden. Daher lag unser Fokus auf der ZuverlĂ€ssigkeit.
Wir mussten den Prozess der Bereitstellung neuer Slack-Versionen sicherer gestalten. Diese Notwendigkeit fĂŒhrte uns zur Verbesserung unseres Bereitstellungssystems. TatsĂ€chlich haben wir oben dieses verbesserte System diskutiert. Im Inneren des Systems nutzen wir weiterhin Technologien fĂŒr schnelle und atomare Bereitstellungen. Was sich geĂ€ndert hat, ist die Art und Weise, wie die Bereitstellung tatsĂ€chlich erfolgt. Unser neues System ist fĂŒr die schrittweise Bereitstellung neuen Codes auf verschiedenen Ebenen in unterschiedlichen Umgebungen konzipiert. Jetzt verwenden wir anspruchsvollere Hilfsmittel und Monitoring-Tools als zuvor. Dies ermöglicht es uns, Fehler zu erkennen und zu beheben, lange bevor sie die Chance haben, den Endbenutzer zu erreichen.
Aber wir haben nicht vor, auf dem Erreichten auszuruhen. Wir verbessern dieses System stÀndig, indem wir anspruchsvollere Hilfsmittel und Automatisierungstools einsetzen.
Liebe Leser! Wie ist der Prozess der Bereitstellung neuer Projektversionen dort, wo Sie arbeiten?
Quelle: habr.com
