Laravel mit Bitbucket Pipelines deployen cover image

Laravel mit Bitbucket Pipelines deployen

Michal Jacko • 22. October, 2019

web-development laravel

Wichtig:
Sei dir sicher, dass dein Projekt (Migrations!) funktioniert wie erwartet (Tests!), denn für Storage und Datenbank wird während dem Deployment kein Backup erstellt!
Das Deployment sollte nie auf Production allein erfolgen, immer zuvor auf Staging testen!

In älteren Blogeinträgen bin ich darauf eingegangen, wie simples Deployen einer Laravel-Anwendung mit Git-Hilfsmitteln funktionieren kann.

Manchmal möchte man aber auch noch die Tests ausführen lassen und CSS oder JS bauen lassen. Dann ist man also ganz schnell beim Thema CI (Continuous Integration) und CD (Continuous Deployment).

Das Ziel sollte immer sein, vollautomatisch einen gesunden Zustand des aktuellen Codes zu deployen. Dies sollte nicht manuell geschehen. Denn das wäre sehr fehleranfällig und müßig.

Neuerdings bieten Code-Hosting Anbieter wie Github und Bitbucket automatische Ausführung von Code an, getriggert durch Git-Events. Darauf basiert der folgende Ansatz, Laravel Anwendungen über Bitbucket Pipelines und Laravel Envoyer auf ein Hosting wie Uberspace zu pushen, ausgelöst durch einen Merge auf den Master-Branch in Git.

Um das nicht jedesmal neu einzurichten, hab ich dafür ein kleines Composer Plugin geschrieben, welches auf Github zufinden ist: erdmenchen/laravel-bitbucket-deploy

Das Script und die Pipeline sind so eingerichtet, dass bei einem Commit auf Develop oder Master folgende Aktionen ausgeführt werden:

  • Aktuellen Code-Stand in Docker-VM auschecken
  • PHP Dependenies über Composer installieren
  • Node.js Dependencies über NPM installieren
  • PHP-Unit-Tests ausführen
  • Assets (JS/CSS) bauen
  • Deployment auf jeweiliges Ziel (Staging/Production)
  • Manifest-Datei schreiben
  • Symlinks aktualisieren
  • Migrations ausführen
  • Optimierungen

Was brauchts im Repository

Um das Plugin zu installieren einfach über Composer aufrufen:

$ composer require erdmenchen/laravel-bitbucket-deploy

Nachdem die Installation abgeschlossen ist, müssen noch die benötigten Assets veröffentlicht werden:

$ php artisan vendor:publish

Was brauchts auf Bitbucket

  1. Pipelines aktivieren
  2. Repo-Variablen hinzufügen: DEPLOY_HOST und DEPLOY_USER
  3. Neuen SSH-Key erstellen, den Ziel-Host als known host eintragen und den Public Key auf dem Hosting in authorized_keys eintragen.
  4. Deployment Umgebungen einrichten und die Variable DEPLOY_PATH setzen:
    • Staging
    • Production

Was brauchts auf dem Hosting

Das Envoyer Script erwartet folgende Ordner-Struktur auf dem Hosting im konfigurierten Ziel-Ordner (DEPLOY_PATH):

  • .env (Laravel Config-Datei für jeweilige Umgebung)
  • releases (jedes Deployment wird hier in individuellen Unterordnern abgelegt)
  • storage (Laravel Storage Ordner)

Während dem Build werden die .env Datei und der Storage Ordner als Symlinks eingebunden. Zu guter Letzt wird ein current Symlink erstellt (oder aktualisiert), der zum aktuellen Build im Ordner releases zeigt.

Um den Webserver immer auf den aktuellen Stand zu verweisen, sollte die Domain über einen Symlink auf den current Verweis zeigen.

Github Actions

Bei Bedarf und Zeit werde ich den gleichen Funktionsumfang versuchen über Github Actions abzubilden.