Website Deployment: Let Us Count The Ways!

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Deployment bedeutet, eine Website von einer lokalen Umgebung auf Live-Server zu verschieben. Was wie eine einfache Sache erscheint, kann tatsächlich ziemlich komplex sein. Es gibt absolut unzählige Wege, dies zu tun. Sie reichen von benutzerfreundlicher Software und Diensten über komplexere Kommandozeilenwerkzeuge bis hin zu vollwertigen Systemen mit vielen beweglichen Teilen.

Ich bin kein Experte auf diesem Gebiet, aber ich habe im Laufe der Zeit einige verschiedene Deployment-Systeme eingerichtet und auch mit einer Reihe von verschiedenen gearbeitet. Ich dachte, wir könnten versuchen, so viel wie möglich hier zusammenzufassen und aufzuschlüsseln.

Direktes Arbeiten

Wenn Sie Dateien direkt auf Ihrem Server bearbeiten, entfällt im Wesentlichen jeder Deployment-Schritt. Dies können Sie mit einem FTP-fähigen Editor wie Coda oder Adobe Dreamweaver tun. Genug Leute machen das, dass beliebte Hoster wie Media Temple sogar Dokumentationen dazu haben, wie man es einrichtet.

Sie können sogar etwas wie WebDAV verwenden, um Ihren Remote-Server wie eine Festplatte zu mounten auf Ihrem lokalen Computer und Ihren bevorzugten lokalen Editor zu verwenden. Transmit hat eine "Disks"-Funktion, die dies sehr einfach macht.

Der Reiz liegt darin, dass man Ergebnisse so schnell live sehen kann. Allerdings wird dies generell missbilligt. Weil

  • Es ist gefährlich, Fehler werden sofort bemerkt
  • Es gibt keine Tests
  • Es gibt keine Aufzeichnung von Änderungen – was/wer/wann
  • Man kann Änderungen nicht rückgängig machen
  • In Teams kann man die Arbeit anderer überschreiben
  • Man kann keine großen, langfristigen Projekte ohne zusätzliche Einrichtung bearbeiten

Manuelles FTP verwenden

Eine sehr selbstgebastelte Deployment-Technik ist, einfach lokal zu arbeiten und die Dateien mit FTP-Software (wie Transmit) auf den Live-Server zu verschieben, wenn Sie bereit sind.

Das funktioniert zwar, kann aber mühsam sein. *Welche Dateien habe ich geändert? Ach, egal, ich schiebe einfach alles. Mann, das ist langsam.*

Das hat immer noch viele der gleichen Nachteile wie oben. Man riskiert immer noch, die Arbeit anderer zu überschreiben, man kann Änderungen nicht einfach rückgängig machen, etc.

FTP auf diese Weise zu verwenden bedeutet nicht automatisch, dass man keine Versionskontrolle nutzt, aber es ist wahrscheinlich. Wenn man es täte, würde man das völlig unabhängig verwalten und es würde sich extra mühsam anfühlen. Und immer noch nichts, was Sie daran hindert, einen Fehler zu machen (z.B. Dateien hochladen, bevor Sie aus dem Repo gezogen haben). Wenn Sie Versionskontrolle verwenden, suchen Sie wahrscheinlich bereits nach einem Weg, dies mit dem Deployment zu verknüpfen.

Das Thema Versionskontrolle

Versionskontrolle ist wichtig und spielt bei jeder anderen Deployment-Methode, über die wir sprechen werden, eine Rolle. Aber für sich genommen übernimmt die Versionskontrolle das Deployment nicht automatisch für Sie. Ohne zu sehr ins Detail zu gehen, Projekte werden in Repositories (oder „Repos“) gespeichert. Sie können mehrere Mitwirkende haben. Dateien werden synchron gehalten. Es ist die Aufgabe der Mitwirkenden, sicherzustellen, dass sie den neuesten Code haben und dass ihr neuer Code passt. Es gibt eine Aufzeichnung aller Änderungen.

Git ist wahrscheinlich das gängigste Tool zur Versionskontrolle, aber seien Sie sich bewusst, dass Subversion („SVN“) und Mercurial ähnlich sind und die gleiche Funktion erfüllen.

Versionskontrolle auf dem Server installieren, von dort ziehen

Versionskontrollsoftware ist eben genau das, Software. Sie ist wahrscheinlich nicht standardmäßig auf Servern enthalten, die Sie kaufen (selbst auf den „voll ausgestatteten“ Servern, die oft Dinge wie PHP automatisch mitbringen). Aber es ist auch wahrscheinlich, dass Sie sie auf diesen Servern installieren *können*.

Dann, genauso wie Sie von Ihrem lokalen Rechner aus git push und git pull ausführen können, können Sie sich per SSH auf den Server einloggen und von dort git pull ausführen, was die neuesten Dateien aus diesem Repo auf den Live-Server bringt.

Das ist im Grunde schon einfaches Deployment.

Jeremy Harris hat einen Artikel, der dies etwas erweitert und zeigt, wie Sie von Ihrem lokalen Rechner aus pushen und das .git-Verzeichnis aus dem Web-Root fernhalten. Joe Maller hat einen Artikel über die Verwendung eines „Hub“-Bereichs auf dem Server.

Cron Job

Ein Cron Job ist eine zeitgesteuerte/automatisierte Aufgabe auf einem Server. *Führe X alle 2 Minuten aus.* Ich habe Leute gesehen, die einen Cron Job ausführen, der alle paar Minuten Git-Pulls durchführt, und das ist ihre Deployment-Strategie.

Post-Receive Hooks / Webhooks

GitHub hat eine Funktion namens Post-Receive Hooks, bei der sie bei jedem Push auf ein Repo eine URL Ihrer Wahl POSTen. Sie könnten diese POST-Anfrage verwenden, um ein Skript auszuführen, das die für das Deployment benötigten Befehle ausführt, z. B. git pull.

NetTuts hat einen Artikel „The Perfect Workflow“, der erklärt, wie dies eingerichtet werden kann. Sie verwenden eine PHP-Datei, die den SSH-Befehl ausführt, was meiner Erfahrung nach von vielen Hostern ohne die Möglichkeit, dies zu erlauben, gesperrt wird.

Bitbucket, ein weiterer Versionskontroll-Host, bietet ebenfalls POST Service Management an.

Drittanbieter-Deployment-Webdienste

Es gibt einige Web-Apps, die ihr Geschäft damit machen, beim Deployment zu helfen.

Beanstalk gibt es schon eine ganze Weile. Sie hosten Ihr Git- oder SVN-Repository selbst. Sie geben ihnen die FTP-Details Ihres Servers an (FTP ist nicht von Natur aus schlecht, es kommt auf die Verwendung an) und sie deployen darüber. Der wohl bemerkenswerteste Nachteil von Beanstalk ist, dass Sie GitHub nicht verwenden können – Sie erhalten also nicht die sozialen Funktionen, die Issue-Verfolgung usw.
FTPloy ist ein neuerer Dienst, der speziell GitHub und Bitbucket unterstützt, aber nur Git.
Deploy ist ein weiterer neuerer Dienst, der GitHub und Bitbucket unterstützt, aber auch Codebase, und mit SVN und Mercurial sowie Git funktioniert.
Springloops macht Deployments, hostet aber Ihre Repos selbst wie Beanstalk. Sie haben auch ihre eigenen Kollaborationstools.
Wercker übernimmt das Deployment auf Cloud-Hoster wie Amazon Web Services (AWS) und Heroku. Sie haben Kommandozeilenwerkzeuge, soziale Funktionen und native mobile Apps, falls Ihnen diese Dinge wichtig sind.

Atlassian entwickelt BitBucket (Versionskontrolle) und Jira (Issue-Management), daher macht es Sinn, dass sie Bamboo entwickeln, das Deployments durchführt und die Produkte irgendwie miteinander verbindet.

Kommandozeilen-Interface (CLI) Tools

Eine schicke Art zu sagen: Werkzeuge, die durch Eingabe von Befehlen in das Terminal funktionieren. Sie haben typischerweise Konfigurationen, die Sie entweder in den Befehlen selbst übergeben, eine Konfigurationsdatei verwenden oder beides.

Capistrano

Capistrano ist nicht ausschließlich für Deployments gedacht. Es dient der Ausführung von Befehlen auf Servern. Deployment ist jedoch ein sehr häufiger Anwendungsfall dafür, und es entstand aus diesem Ursprung.

Capistrano wurde ursprünglich entwickelt, um die Bereitstellung von Webanwendungen in verteilten Umgebungen zu vereinfachen und zu automatisieren. Ursprünglich enthielt es eine Reihe von Aufgaben zur Bereitstellung von Rails-Anwendungen.

Es ist in Ruby geschrieben, kann aber für alles verwendet werden.

Wenn eine Website komplexer wird, reicht es wahrscheinlich nicht mehr aus, einfach Code aus einem zentralen Repo zu ziehen. Es können zum Beispiel mehrere Server beteiligt sein. Oder das Ziehen dieser Dateien kann einige Zeit dauern, und diese Zwischenzeit könnte Ihre App beeinträchtigen. Mit Capistrano können Sie es so konfigurieren, dass der Server vorbereitet, neue Dateien an einen neuen Ort gezogen, der Symlink aktualisiert, Berechtigungen bereinigt, Dienste neu gestartet und das alles auf mehreren Servern erledigt wird. Dieses Bild demonstriert das.

Es gab eine Web-Oberfläche dafür, aber sie scheint etwas veraltet zu sein.

RailsCasts bietet eine Reihe von Screencasts, um Capistrano kennenzulernen.

rsync

rsync beschäftigt sich ausschließlich mit Dateiübertragungen.

rsync ist ein Dateiübertragungsprogramm für Unix-Systeme. rsync verwendet den „rsync-Algorithmus“, der eine sehr schnelle Methode bietet, um entfernte Dateien zu synchronisieren. Dies geschieht, indem nur die Unterschiede in den Dateien über die Verbindung gesendet werden, ohne dass beide Dateisätze vorab an einem Ende der Verbindung vorhanden sein müssen.

rsync ist ein Befehl, daher wird er oft von einem Task-Runner wie Make oder häufiger Rake (da es auch Ruby ist) ausgeführt.

git-ftp

Vielleicht spüren Sie ein wiederkehrendes Thema

Anstatt das gesamte Projekt zu übertragen, dachte ich: Warum nicht nur die geänderten Dateien übertragen, seit dem letzten Mal kann Git mir diese Dateien sagen.

git-ftp pusht Dateien auf Ihren Server, genau wie jeder FTP-Client, aber es weiß genau, welche Dateien gesendet werden müssen, weil es Git verwendet, das es weiß.

git ftp push -u <user> -p - ftp://host.example.com/public_html

Dandelion

Dandelion ist ähnlich wie git-ftp, funktioniert aber über Konfigurationsdateien, so dass Sie genauer bestimmen können, was passieren soll und den Befehl vereinfachen (dandelion deploy). Es kann auch nach AWS pushen.

Ansible

Ansible:

Ansible konfiguriert Betriebssysteme, stellt Anwendungen bereit, führt parallele Befehle aus und orchestriert IT-Prozesse wie Zero-Downtime-Rollouts. Es verwendet standardmäßig SSH, sodass keine spezielle Software installiert werden muss, um mit der Verwaltung von Remote-Maschinen zu beginnen. Module können in jeder Sprache geschrieben werden.

grunt-ftp-deploy

Was Build-Tools/Task-Runner angeht, ist Grunt auf dem Weg zur Königsklasse. Es basiert auf Node.js, das einen eigenen Paketmanager (NPM) hat, ähnlich wie Ruby Gems.

Eine solche Seite ist grunt-ftp-deploy, die Dateien von Ihrem lokalen Rechner über FTP auf einen Server verschiebt. Sie konfigurieren die Aufgabe und führen sie dann einfach aus, wie immer Sie Grunt-Aufgaben ausführen möchten. Es ist eine ziemlich „dumme“ Aufgabe, da sie nicht einmal versucht, nur das zu verschieben, was sich geändert hat, oder Versionskontrolle zu referenzieren. Sie verschiebt einfach alles.

Statische Seiten

Eine „statische“ Website ist eine Website, die keine Dienste, Datenbanken oder Ähnliches benötigt. Nur ein Webserver und eine Reihe von Ressourcen-Dateien (z.B. .html, .css, .js, Bilder).

GitHub Pages

GitHub bietet einen Dienst namens GitHub Pages an, der statische Websites für Sie bereitstellt. Sie können sogar Ihren eigenen Domainnamen mit ihnen verwenden. Sie erstellen einfach einen Branch eines Repos namens gh-pages und es funktioniert irgendwie. Auf diese Weise ist das Deployment einfach nur das Pushen auf diesen Branch dieses Repos.

Es gibt einen Grunt-Task nur dafür.

Jekyll

Nur weil eine Website statisch ist, heißt das nicht, dass sie lahm/einfach/schlechte Architektur hat. Es gibt Build-Tools für statische Websites, mit denen Sie Vorlagen und Inhalte zusammenfügen und eine Website ausgeben können. Jekyll ist eines davon, das speziell für die Zusammenarbeit mit GitHub Pages entwickelt wurde.

Octopress

Octopress sitzt auf Jekyll auf und bietet Konfiguration, Vorlagen usw., damit Sie schneller starten können.

Weder Jekyll noch Octopress helfen unbedingt beim Deployment, sie sind nur sehr eng mit GitHub Pages verwandt, das eine Form des Deployments ist.

Amazon S3

Amazon bietet Webdienste an, mit denen Sie tatsächlich Server betreiben können, aber es gibt auch S3, das reine Dateispeicherung ist. Sie können tatsächlich eine statische Website auf S3 hosten und sogar Ihre eigene Domain verwenden.

Es gibt sogar eine Reihe von Kommandozeilenwerkzeugen namens s3cmd, die Sie konfigurieren und Befehle ausführen können, um statische Websites bereitzustellen (d.h. s3cmd sync).

Platform as a Service (PaaS)

Hoffentlich ist jetzt klar, dass selbst das Deployment kompliziert sein kann. Der gesamte Web-Plattform-Stack kann *extrem* kompliziert sein. Es ist kein Wunder, dass Unternehmen auf den Plan getreten sind und nun Dienste anbieten, um ihn zu vereinfachen. Diese Unternehmen bieten Hosting, Serververwaltung, Datenbanken und all diesen Kram an. Einfaches Deployment ist normalerweise Teil des Pakets.

Heroku spezialisiert sich auf Rails-Apps. Sie zahlen mehr, wenn Sie skalieren und zusätzliche Dienste hinzufügen. Deployment wird so einfach wie git push heroku master.
Engine Yard ist ähnlich, bietet aber auch Node.js und PHP an. Sie haben auch Kommandozeilenwerkzeuge für das Deployment.
AppFog (früher PHP Fog, jetzt Teil von Savvis Cloud) unterstützt fast jede Sprache.
Pagoda Box ist für PHP.
Fortrabbit ist für PHP.
NodeJitsu ist für Node.js.

Es gibt jede Menge PaaS auf Enterprise-Niveau. Sehen Sie sich SalesForce, RedHat und IBM für die Spitze des Eisbergs an.

In einer anderen Richtung: Mixture.io kümmert sich um Hosting/Deployment direkt aus seinem Desktop-Entwicklungstool heraus.

Continuous Integration Server

Von Wikipedia

Kontinuierliche Integration (CI) ist in der Softwaretechnik die Praxis, alle Entwickler-Arbeitskopien mehrmals am Tag mit einer gemeinsamen Hauptlinie zusammenzuführen.

Die Idee ist, dass einzelne Entwickler keinen Branch so lange ausgecheckt haben, dass er sich stark vom Haupt-Repo unterscheidet und das Zusammenführen der beiden schwierig wird.

Die Ausweitung dieses Konzepts auf den Server bedeutet, diesen Code auf tatsächlichen Servern auszuführen, um sicherzustellen, dass alles in Ordnung ist. Führen Sie den Build aus – besteht er? Führen Sie Ihre Tests aus – bestehen sie? Dies oft zu tun bedeutet, Probleme frühzeitig zu erkennen und riesige, tiefe Probleme entwickeln sich nie.

Dies steht in Beziehung zum Deployment, da Leute es verwenden, um Code automatisch bereitzustellen, wenn alle Schritte erfolgreich sind. Zum Beispiel:

  1. Neuen Code in das Repo committen/pushen
  2. CI-Tool führt alle von Ihnen konfigurierten Builds/Tests aus
  3. Wenn alles passt, wird es bereitgestellt
  4. Wenn etwas nicht passt, werden Sie benachrichtigt und es erfolgt kein Deployment

Ich verstehe das eigentlich kaum, also korrigieren Sie mich bitte in den Kommentaren, wenn ich alles falsch mache. Es gibt eine Reihe verschiedener, daher werde ich sie auflisten, anstatt zu versuchen, etwas zu erklären, das ich nicht gut kann.

CMS-spezifisch

CMS haben heutzutage so riesige Communities, dass es nicht überraschend ist, dass Tools auftauchen, die spezifisch für sie sind und nicht nur für ihre übergeordnete Sprache.

WordPress

  • WP-Stack ist eine Boilerplate für WordPress-Sites, die Git und Capistrano voraussetzt.
  • WordPress-Starter ist ähnlich, enthält aber S3-Backups.
  • Wir haben nicht viel über Datenbank-Deployment gesprochen. Ich bin mir nicht sicher, ob es viel darüber zu sagen gibt. Ich war immer überrascht, wie umständlich das Verschieben von Datenbanken ist. WP Migrate DB Pro ist ein gutes, spezifisches Tool für WordPress, um sie synchron zu halten.

Drupal

Drupal hat eine Kommandozeilenschnittstelle namens Drush, die ein Deployment-Skript namens Drush Deploy hat.

War's das?

Nein, wahrscheinlich nicht. Ich habe nicht einmal Dinge wie Puppet und Salt Stack erwähnt, die ich nicht einmal wirklich verstehe.

Fühlen Sie sich frei, in den Kommentaren mit zusätzlichen Informationen, Dingen, die ich falsch gemacht habe, Dingen, die ich übersehen habe, oder wie Sie das Deployment handhaben, beizutragen.