SkillGridInformatik durch Machen lernen

Deploy: Wie Code zu echten Menschen kommt

Deployen heißt, deinen Code vom Laptop auf eine Maschine zu bringen, die andere Menschen erreichen können. Und dort wird jede Annahme sichtbar, die dein Laptop still für dich getroffen hat.

15 Min. · 48 XP

Dein Projekt läuft. Du hast es deinen Freunden auf deinem Laptop gezeigt, und es lief. Also legst du es auf einen Server, verschickst den Link — und es bricht sofort. Derselbe Code, dieselben Dateien, alles gleich. Geändert hat sich nur, wo es läuft. Dieser Moment hat einen Namen, und der Name ist ein Witz, den Leute erzählen, weil er allen passiert: „Bei mir auf dem Rechner lief es aber.“

Es brach, weil dein Laptop nie nur deinen Code ausgeführt hat. Er hat auch hundert Dinge geliefert, von denen dein Code still abhängt: auf welchem Port er lauschen soll, wo die Datenbank liegt, welche API-Schlüssel zu benutzen sind, welche Version der Sprache installiert ist, welche Dateien zufällig in diesem Ordner liegen. Nichts davon steht in deinem Code, also ist nichts davon mit deinem Code mitgereist. Die Orte, an denen dein Code läuft, heißen Umgebungen. Üblich sind drei: dein Laptop, auf dem du baust und auf dem kaputtgehen in Ordnung ist; Staging, eine Kopie des echten Aufbaus, auf der das Team prüft, bevor Nutzer etwas sehen; und Produktion, das Echte mit echten Menschen und echtem Geld. Dasselbe Programm läuft in allen drei, und die Werte sind in jeder anders.

env:         laptop     staging    production
-----------  ---------  ---------  -----------
PORT         3000       8080       80
API_KEY      test       test       live
LOG_LEVEL    debug      info       warn

Bevor Code auf einem Server laufen kann, muss er oft erst in etwas verwandelt werden, das der Server ausführen kann: Das ist der Build. TypeScript zu JavaScript kompilieren, viele Dateien zu einer bündeln, Bilder verkleinern, einen fertigen Ordner erzeugen, der gestartet werden kann. Der Unterschied ist wichtig, weil das zwei verschiedene Schritte mit zwei verschiedenen Arten des Scheiterns sind. Ein Build-Fehler passiert auf deiner Maschine, vor jedem Deploy, und ist billig: Noch ist nichts bei Nutzern angekommen. Ein Laufzeitfehler passiert auf dem Server, während Nutzer zusehen. Du willst, dass möglichst viele Fehler Build-Fehler sind.

src/cart.ts       ---> dist/app.js
package.json      ---> node_modules/

ts ---> js

$ npm start
PORT=80 listening

Die ehrliche Version von „es läuft auf meiner Maschine“ ist also eine Checkliste, und sie ist kurz. Ist die Konfiguration hier anders — Port, Datenbank, Schlüssel? Fehlt eine Abhängigkeit oder hat sie eine andere Version? Ist die Datei, die der Code erwartet, auf dieser Maschine wirklich da, mit derselben Groß- und Kleinschreibung? Darf diese Maschine Netzwerk, Ordner und Port überhaupt benutzen? Und — der Punkt, den alle vergessen — funktioniert es auch jetzt noch, zu dieser Stunde, unter dieser Last? Keine dieser Fragen handelt davon, wie klug dein Code ist. Sie handeln von der Welt, in der er gelandet ist.

YouServerUsersdeploy v41, the new cart pageserve v41the cart total is wrong for every customerreports start arriving at 09:14roll back to v40serve v40, the old cart page againthe bug is still there, but nobody is hitting it any more

Jeder Deploy ist auch eine kleine Wette. Entscheide also vor dem Deploy, wie du zurückkommst. Dieser Plan hat einen Namen: ein Rollback. Er bedeutet, zur vorherigen Version zurückzugehen, von der man weiß, dass sie lief — meist mit einem Befehl, und das sollte in Sekunden gehen, nicht in Stunden. Der Sinn eines Rollbacks ist nicht, etwas zu reparieren: Er ist, den Schaden zu stoppen, während du herausfindest, was schiefging. Beachte, was er voraussetzt. Die vorherige Version muss noch existieren und noch laufen. Die Daten müssen die Reise rückwärts überstehen, und das ist der schwierige Teil: Hat die neue Version schon eine neue Art von Datensatz geschrieben, muss die alte Version ihn tolerieren. Und du musst wissen, dass etwas kaputt ist — also direkt nach dem Deploy hinschauen statt anzunehmen.

Praxis

  1. Du richtest dein Projekt so ein, dass es an drei Orten läuft. Sortiere jeden Wert: Ist das etwas, das man pro Umgebung konfiguriert, oder ein Secret, das aus dem Repository herausbleiben muss?

    Hinweise
    • Ein Wert, der auf jeder Maschine gleich ist, ist keine Konfiguration, sondern einfach Teil des Programms.
    • Frag bei jeder Einstellung: Wäre es mir recht, wenn sie in einem öffentlichen Repository landet?

    15 XP

  2. Du hast ein Update ausgeliefert, und jetzt ist die Warenkorbsumme bei jedem Kunden falsch. Was ist zuerst richtig?

    Hinweise
    • Rollback ist nicht dasselbe wie Reparieren: Es geht darum, wen es trifft, während du reparierst.
    • Die alte Version ist nur dann einen Befehl entfernt, wenn du sie aufgehoben hast.

    16 XP

  3. Bring die Schritte eines sorgfältig gemachten Deploys in die richtige Reihenfolge.

    Hinweise
    • Eine Änderung, die nie aufgezeichnet wurde, kann man nicht zurücknehmen, und einer, die nie getestet wurde, kann man nicht trauen.
    • Zeig es einem Kunden, bevor du es allen zeigst.

    16 XP