Türchen 6: Magento 2 Deployment mit Capistrano

Dec
6
2017

Einen schönen Nikolaustag, euch allen! Ich hoffe der Nikolaus, oder auch Nikolo – wie er in Österreich auch genannt wird – bringt euch heute eine Kleinigkeit. All jenen, die gestern nicht der Krampus geholt hat, darf ich heute meinen Beitrag zum Adventskalender näher bringen: Magento 2 Deployment mit Capistrano.

Wer kennt das nicht: Nach Tage/Wochen/Monaten harter Arbeit in den lokalen Entwicklungssystemen ist es an der Zeit, die Ergebnisse in einem Staging- und später Live-System bereitzustellen. Nun stellt sich die Frage: Wie bekommen wir unser wunderschönes Magento 2 Projekt in eine andere Umgebung? Möglichst automatisch d.h. ohne die selben Befehle immer und immer wieder manuell auszuführen?

Folgende Schritte sind dazu notwendig:

  • Der Source Code muss irgendwie in die neue Umgebung
  • Maintenance Mode aktivieren/Wartungsseite setzen
  • Production Mode aktivieren (deploy:mode:set production)
  • Module aktivieren
  • Code Generation anwerfen (setup:di:compile)
  • Setup Skripte ausführen
  • Statische Files deployen (setup:static-content:deploy)
  • Cache leeren
  • Maintenance Mode deaktivieren/Wartungsseite entfernen

Idealerweise führt man diese Schritte nicht immer im selben Verzeichnis aus, sondern baut sog. Releases.

Nun gibt es dafür mehrere Möglichkeiten:

  • Alles via SFTP hochladen und die Befehle dann nacheinander händisch via SSH ausführen (ist eigentlich keine Möglichkeit)
  • Ein fancy rsync Script schreiben (geht, geht aber besser)
  • Ein modernes Deployment Tool verwenden

Die Auswahl an Build & Deployment Tools ist mittlerweile umfangreich, die bekanntesten sind wohl: phing, deployer,MageDeploy, Jenkins, usw.

Ich möchte in diesem Blogpost auf das Deployment mit Capistrano und dem Magento 2 Capistrano Plugin von David Alger näher eingehen, weil ich es ausprobiert und bei mehreren Projekten im Einsatz habe, und ich es sehr solide finde.

Capistrano

Capistrano ist eine in Ruby geschriebene Open Source Software. Besonders zur Verteilung von Software auf mehrere Server ist Capistrano gut geeignet, mit einem einzigen Server funktioniert es natürlich auch 😉

Voraussetzung ist also, das Ruby auf der jeweiligen Maschine (das kann das eigene Notebook/MacBook oder auch ein Docker Container sein) installiert ist. Danach kann Capistrano als Ruby Gem installiert werden:

Capistrano wird üblicherweise via Command Line (bash) ausgeführt.

Die Konfiguration ist recht einfach: Konfigurationen können global oder umgebungsspezifisch gesetzt werden:

  • global
    • config/deploy.rb
  • umgebungspezifisch
    • config/deploy/<stage_name>.rb
    • z.B: config/deploy/staging.rb

Auf dem Server sieht die Ordnerstruktur folgendermaßen aus:

Deploy flow

Der Standard-Ablauf von Capistrano v3, wenn man z.B. cap production deploy ausführt, ist folgender:

Ausführen

Damit dann alle Tasks entsprechend abgearbeitet werden, kann man das Deployment folgendermaßen anstoßen:

bzw:

…und ab geht die Post!

Magento 2 Plugin für Capistrano

Die Standard Capistrano Tasks liefern unser Magento Setup aus, allerdings werden keine Magento 2 spezifischen Aktionen wie zB Deploy Mode setzen, Setup und Upgrade Scripts ausführen, etc. ausgeführt. Dazu bietet das Magento 2 Plugin für Capistrano super Unterstützung, in dem es Magento 2 spezifische Tasks definiert:

Ein Deployment (hier gekürzt – nur die Tasks) mit Capistrano Magento 2 Plugin, nach dem Aufruf von bundle exec cap staging deploy sieht dann zB so aus:

That’s it!

Damit die Magento 2 Tasks so ausgeführt werden, ist nur diese minimale Konfiguration notwendig, damit es losgehen kann:

config/deploy.rb

config/deploy/staging.rb

So einfach und schnell kann man also mit dem Magento 2 Plugin für Capistrano losstarten.

Debuggen

Manchmal finde ich die Capistrano Fehlermeldungen auf den ersten Blick nicht sehr aussagekräftig.

Hier hilft der —trace Befehl am Ende, um einen genaueren Einblick zu bekommen, wo das Problem liegt:

Finetuning & Erweiterung

Wie die obenstehende Übersicht der Tasks zeigt, enthält das Magento 2 Plugin für Capistrano noch weitere Befehle. Außerdem ist auch das Erstellen eigener Tasks sehr einfach, die danach ebenfalls via Hooks ausgeführt werden können.

Die Reihenfolge kann recht einfach über die config files (deploy.rb bzw. staging.rb) definiert werden:

Alternativen

Wie eingangs schon erwähnt, finde ich das Magento 2 Deployment via Capistrano sehr solide.

Wem das nicht zusagt, dem sei folgende Neuerung seit Magento 2.2 ans Herz gelegt: Neu seit Magento 2.2 ist das Pipeline Deployment, mit dem man mit Zero Downtime deployen kann. Ich habe es selbst noch nicht ausprobiert, freue mich aber über Erfahrungsberichte dazu.

Ich wünsche euch viele erfolgreiche Deployments 🙂

Kommentieren

Your email address will not be published. Required fields are marked *