Die EinfĂŒhrung einer neuen Projektversion in die Produktion erfordert eine sorgfĂ€ltige Balance zwischen der Geschwindigkeit des Deployments und der ZuverlĂ€ssigkeit der Lösung. Bei Slack wird Wert auf schnelle Iterationen, kurze Feedbackzyklen und eine zĂŒgige Reaktion auf Benutzeranfragen gelegt. DarĂŒber hinaus stehen Hunderten von Programmierern zur VerfĂŒgung, die nach maximaler ProduktivitĂ€t streben.
Die Autoren des Materials, dessen Ăbersetzung wir heute veröffentlichen, betonen, dass ein Unternehmen, das solche Werte verfolgt und gleichzeitig wĂ€chst, stĂ€ndig sein Deployment-System verbessern sollte. Es ist wichtig, in die Transparenz und ZuverlĂ€ssigkeit der Arbeitsprozesse zu investieren, damit diese den Anforderungen des Projekts gerecht werden. Hier wird ĂŒber die Arbeitsprozesse gesprochen, die in Slack entstanden sind, sowie ĂŒber einige Lösungen, die das Unternehmen zur aktuellen Deployment-Systematik gefĂŒhrt haben.
Wie die Deployment-Prozesse heute funktionieren
Jede PR (Pull Request) in Slack muss unbedingt einer Code-ĂberprĂŒfung unterzogen werden und alle Tests erfolgreich bestehen. Erst nachdem diese Bedingungen erfĂŒllt sind, kann der Entwickler seinen Code mit dem Master-Branch des Projekts zusammenfĂŒhren. Die Bereitstellung des Codes erfolgt jedoch nur wĂ€hrend der Arbeitszeiten in Nordamerikanischer Zeitzone. Dadurch sind wir dank unserer Mitarbeiter vor Ort vollstĂ€ndig bereit, unerwartete Probleme zu lösen.
Jeden Tag fĂŒhren wir etwa 12 geplante Bereitstellungen durch. WĂ€hrend jeder Bereitstellung ist der fĂŒr die Bereitstellung verantwortliche Entwickler fĂŒr die EinfĂŒhrung des neuen Builds in die Produktion zustĂ€ndig. Dies ist ein mehrstufiger Prozess, der eine reibungslose EinfĂŒhrung des Builds in den Live-Betrieb gewĂ€hrleistet. Mit diesem Ansatz können wir Fehler erkennen, bevor sie alle unsere Nutzer beeintrĂ€chtigen. Sollte es zu vielen Fehlern kommen, kann die Bereitstellung des Builds zurĂŒckgesetzt werden. Wird hingegen ein spezifisches Problem nach der Veröffentlichung entdeckt, lĂ€sst sich dafĂŒr leicht ein Hotfix ausbringen.

Die Schnittstelle des Checkpoint-Systems, die in Slack zur Bereitstellung von Projekten verwendet wird
Der Prozess der Bereitstellung eines neuen Releases in der Produktion kann als bestehend aus vier Schritten dargestellt werden.
â1. Erstellung eines Release-Branches
Jedes Release beginnt mit einem neuen Release-Branch zu einem bestimmten Zeitpunkt in unserer Git-Historie. Dies ermöglicht es, dem Release Tags zuzuweisen und schafft einen Bereich, in den schnelle Korrekturen fĂŒr Fehler eingefĂŒgt werden können, die wĂ€hrend der Vorbereitung des Releases fĂŒr die Produktion entdeckt wurden.
â2. Bereitstellung in der Zwischenumgebung
Der nĂ€chste Schritt besteht darin, das Build auf den Staging-Servern bereitzustellen und einen automatischen Test auf die allgemeine FunktionsfĂ€higkeit des Projekts (Smoke-Test) durchzufĂŒhren. Die Zwischenumgebung ist eine Produktionsumgebung, in die kein externer Traffic eindringt. In dieser Umgebung fĂŒhren wir zusĂ€tzliche manuelle Tests durch. Dies gibt uns zusĂ€tzliche Sicherheit, dass das angepasste Projekt korrekt funktioniert. Automatisierte Tests allein reichen nicht aus, um ein solches Vertrauen zu gewinnen.
â3. Bereitstellung in Dogfood- und Canary-Umgebungen
Die Bereitstellung in der Produktion beginnt mit der dogfood-Umgebung, die aus einer Reihe von Hosts besteht, die unsere internen Arbeitsbereiche in Slack unterstĂŒtzen. Da wir starke Slack-Nutzer sind, hat dieser Ansatz geholfen, viele Fehler in den frĂŒhen Phasen der Bereitstellung zu erkennen. Sobald wir unsergestellt haben, dass die grundlegenden FunktionalitĂ€ten des Systems nicht beeintrĂ€chtigt sind, erfolgt die Bereitstellung des Builds in der Canary-Umgebung. Diese besteht aus Systemen, die etwa 2% des Produktionsverkehrs erhalten.
â4. Schrittweise EinfĂŒhrung in der Produktion
Wenn die Ăberwachungskennzahlen der neuen Version stabil sind und wir nach der Bereitstellung des Projekts in der Canary-Umgebung keine Beschwerden erhalten haben, setzen wir die schrittweise Umstellung der Produktionsserver auf die neue Version fort. Der Bereitstellungsprozess ist in die folgenden Phasen unterteilt: 10%, 25%, 50%, 75% und 100%. So können wir den Produktionsverkehr schrittweise auf die neue Version des Systems ĂŒbertragen. Dies gibt uns Zeit, die Situation zu beobachten, falls Anomalien auftreten.
âWas tun, wenn wĂ€hrend der Bereitstellung etwas schiefgeht?
Ănderungen im Code sind immer mit Risiken verbunden. Doch wir meistern dies dank unserer gut geschulten Deployment-Leiter, die den Prozess der Bereitstellung neuer Releases in die Produktion leiten, die Ăberwachungskennzahlen im Blick behalten und die Arbeit der Entwickler koordinieren, die den Code erstellen.
Falls etwas tatsĂ€chlich schiefgeht, versuchen wir, das Problem so frĂŒh wie möglich zu erkennen. Wir analysieren das Problem, identifizieren den PR, der die Fehler verursacht, setzen ihn zurĂŒck, untersuchen ihn grĂŒndlich und erstellen ein neues Build. Manchmal bleibt das Problem jedoch bis zur Produktion unentdeckt. In einem solchen Fall ist es am wichtigsten, den Dienst wiederherzustellen. Daher setzen wir, bevor wir mit der Problemuntersuchung beginnen, sofort zur letzten funktionierenden Version zurĂŒck.
Die Grundbausteine des Deployment-Systems
Betrachten wir die Technologien, die unserer Projektbereitstellung zugrunde liegen.
âSchnelle Deployments
Der oben beschriebene Arbeitsprozess mag im RĂŒckblick als vollkommen offensichtlich erscheinen. Aber unser Deployment-System hat sich nicht von Anfang an so entwickelt.
Als das Unternehmen noch viel kleiner war, konnte unsere gesamte Anwendung auf 10 Amazon EC2-Instanzen laufen. Die Bereitstellung eines Projekts in einer solchen Situation bedeutete, rsync fĂŒr eine schnelle Synchronisation aller Server zu verwenden. FrĂŒher trennte nur ein Schritt den neuen Code von der Produktion, der durch eine Zwischenumgebung dargestellt wurde. Builds wurden in dieser Umgebung erstellt und getestet, bevor sie direkt in die Produktion gingen. Es war sehr einfach, sich in einem solchen System zurechtzufinden, da es jedem Programmierer zu jedem Zeitpunkt ermöglichte, seinen geschriebenen Code bereitzustellen.
Doch mit wachsenden Kundenzahlen stieg auch der Umfang der Infrastruktur, die fĂŒr den Betrieb des Projekts erforderlich war. Bald, angesichts des stĂ€ndigen Systemwachstums, konnte unser Bereitstellungsmodell, das auf dem Senden neuen Codes an die Server basierte, nicht mehr seinen Zweck erfĂŒllen. Jedes HinzufĂŒgen eines neuen Servers bedeutete eine Erhöhung der Zeit, die fĂŒr die Bereitstellung benötigt wurde. Selbst Strategien, die auf der parallelen Anwendung von rsync basierten, haben gewisse EinschrĂ€nkungen.
SchlieĂlich haben wir das Problem gelöst, indem wir auf ein vollstĂ€ndig paralleles Bereitstellungssystem umgestiegen sind, das anders strukturiert ist als das alte System. Statt den Code ĂŒber ein Synchronisationsskript auf Server zu senden, laden nun die Server selbststĂ€ndig die neue Version herunter, nachdem sie durch das Monitoring der Ănderung des Consul-SchlĂŒssels darĂŒber informiert wurden. Die Server laden den Code parallel herunter. Dies ermöglichte es uns, eine hohe Bereitstellungsgeschwindigkeit auch in Zeiten des stĂ€ndigen Systemwachstums aufrechtzuerhalten.

1. Produktionsserver ĂŒberwachen den Consul-SchlĂŒssel. 2. Der SchlĂŒssel Ă€ndert sich, was den Servern signalisiert, dass sie mit dem Herunterladen des neuen Codes beginnen mĂŒssen. 3. Die Server laden die Tarball-Dateien mit dem Anwendungscode herunter.
âAtomare Bereitstellungen
Eine weitere Lösung, die uns geholfen hat, zu einem mehrstufigen Bereitstellungssystem zu gelangen, war die atomare Bereitstellung.
Vor der EinfĂŒhrung atomarer Bereitstellungen konnte jede Bereitstellung eine Vielzahl von Fehlermeldungen verursachen. Der Grund dafĂŒr war, dass der Prozess des Kopierens neuer Dateien auf Produktionsserver nicht atomar war. Dies fĂŒhrte zu einer kurzen Zeitspanne, in der der Code, der neue Funktionen aufrief, zugĂ€nglich war, bevor die Funktionen selbst verfĂŒgbar waren. Wenn solcher Code ausgefĂŒhrt wurde, kam es 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 durch die EinfĂŒhrung des Konzepts von âheiĂenâ (hot) und âkaltenâ (cold) Verzeichnissen. Der Code im âheiĂenâ Verzeichnis ist fĂŒr die Verarbeitung des Produktionsverkehrs verantwortlich. In den âkaltenâ Verzeichnissen wird der Code wĂ€hrend des Systembetriebs lediglich fĂŒr die Nutzung vorbereitet. Bei der Bereitstellung wird der neue Code in ein ungenutztes âkaltesâ Verzeichnis kopiert. Dann, wenn auf dem Server keine aktiven Prozesse mehr laufen, erfolgt ein sofortiger Verzeichniswechsel.

1. Entpacken des Anwendungscodes in ein 'kaltes' Verzeichnis. 2. Umschalten des Systems auf das 'kalte' Verzeichnis, das zu einem 'heiĂen' wird (atomare Operation)
Zusammenfassung: Verschiebung des Fokus auf ZuverlÀssigkeit
Im Jahr 2018 erreichte das Projekt ein solches AusmaĂ, dass eine sehr schnelle Bereitstellung der StabilitĂ€t des Produkts schadete. Wir hatten ein Ă€uĂerst fortschrittliches Bereitstellungssystem, in das wir viel MĂŒhe und Zeit investiert hatten. Wir mussten nur die Prozesse der Bereitstellungsorganisation neu strukturieren und verbessern. Wir sind zu einem ausreichend groĂen Unternehmen geworden, dessen Entwicklungen weltweit fĂŒr die Organisation einer unterbrechungsfreien Kommunikation und zur Lösung wichtiger Aufgaben verwendet wurden. Daher stand die ZuverlĂ€ssigkeit im Mittelpunkt unserer Aufmerksamkeit.
Wir mussten den Prozess fĂŒr die Bereitstellung neuer Slack-Versionen sicherer gestalten. Diese Notwendigkeit fĂŒhrte uns zur Verbesserung unseres Bereitstellungssystems. Wie bereits oben erwĂ€hnt, haben wir dieses verbesserte System diskutiert. Innerhalb des Systems setzen wir weiterhin auf Technologien fĂŒr schnelle und atomare Bereitstellungen. Was sich verĂ€ndert hat, ist, wie die Bereitstellung selbst erfolgt. Unser neues System ist darauf ausgelegt, die Bereitstellung neuer Codes schrittweise auf verschiedenen Ebenen und in unterschiedlichen Umgebungen durchzufĂŒhren. Jetzt verwenden wir fortschrittlichere Tools und Monitoring-Mittel als zuvor. Dies ermöglicht es uns, Fehler frĂŒhzeitig zu erkennen und zu beheben, bevor sie die Endnutzer erreichen.
Doch wir haben nicht vor, uns auf unseren Erfolgen auszuruhen. Wir verbessern dieses System stÀndig, indem wir fortschrittlichere Support-Tools und Automatisierungstechniken einsetzen.
Sehr geehrte Leser! Wie funktioniert der Prozess der Bereitstellung neuer Projekt-Versionen in Ihrem Arbeitsumfeld?
Quelle: habr.com
