Automatisches Deployment mit git

Bei der Entwicklung von Web-Projekten setzten wir bei uns in der Agentur Git zur Versions-Verwaltung ein. Dabei setzten wir auf den webbasierten Dienst Gitlab. Dabei erhält man zusätzlich zur Versionskontrolle auch weitere Management-, Planungs-, Issue-Tracking- und Bug-Tracking-Funktionalitäten, z.B. Meilensteine, Aktivitäten, ToDos, Merge-Requests und noch vieles mehr.

Außerdem können damit Entwicklungs-, Test-, Demo- und Produktiv-System leicht verwaltet werden. Durch sogenannte „Webhooks“ werden alle Systeme synchron gehalten und Änderungen automatisch auf die jeweiligen Systeme verteilt – auch Git Continuous Integration genannt (ausgenommen dem Produktiv-System, hier ist zur Sicherheit ein manueller Aufruf nötig). In diesem Blogbeitrag werde ich eine Anleitung geben, um den entwickelten Source-Code nach einem „commit“ und anschließendem „push“ automatisch auf einem Webserver zu verteilen. Lokal entwickelter Code wird nach einem „git push“ automatisch am Web-Server verteilt, und ist sofort verfügbar. Der Ablauf ist wie folgt:

  • am Server wird das Git-Repository geklont
  • bei Gitlab wird ein sogenannter Webhook installiert, welcher eine beliebige Website aufruft, wenn ein „push“ auf den Server ausgeführt wird
  • wird nun ein „push“ (egal von welchem Client) ausgeführt, wird die Website aufgerufen
  • diese Website bzw. das PHP-Skript führt im Prinzip ein „git pull“ aus, damit nun alle Änderungen auch auf den Webserver übertragen werden

Um die Anleitung zu vereinfachen gehen wir davon aus, dass bereits ein Gitlab-Account samt Repository besteht. Analog kann diese Anleitung auch leicht angepasst für githubbitbucket etc. verwendet werden. Weiters wird ein SSH-Zugriff auf den Webserver benötigt. Folgende Schritte sind dazu notwendig:

1. Deploy Key

Damit der Webserver auf gitlab zugreifen darf, muss ein „Deploy Key“ erstellt werden:

  • per SSH auf dem Webserver einloggen
  • zum Apache Benutzer wechseln (oder zum jeweiligen Document-Root-Benutzer, wichtig z.B. bei WHM/Cpanel)
  • folgende Befehle ausführen (###Benutzer#### mit ihrem Git-Benutzer ersetzen). Alle Eingaben mit Enter bestätigen und anschließend die Konsolenausgabe kopieren. 
ssh-keygen -t rsa -C "###User-Account###cat ~/.ssh/id_rsa.pub
  • zu Gitlab wechseln
  • Projekt und danach Einstellungen und weiter zu „Deploy Keys“
  • einen beliebigen Titel und bei Key den soeben generierten und angezeigten Schlüssel eingeben und „Add key“ drücken

2. Webhook erstellen

Erstellen des Webhooks zum Aufruf des PHP-Deploy-Skripts:

  • auf GitLab in die Projekteinstellungen zu den „Webhooks“ wechseln
  • die URL eingeben, z.B. „test.varioous.at/deploy.php
  • einen htaccess-Passwortschutz verwenden und zusätzlich den Benutzernamen und das Passwort eingeben, z.B. „test.varioous.at/deploy.php“ („webhook“ mit dem Benutzernamen, und „passwort“ mit dem Passwort ersetzen).
  • zusätzlich empfiehlt es sich aus Sicherheitsgründen einen Secret Token einzugeben
  • bei Trigger „Push events“ auswählen
  • auf „Add Webhook“ klicken

3. Deploy-Skript

  • am Server das Deploy-Skript „deploy.php“ erstellen. Der Inhalt der deploy.php ist am Ende dieses Artikels. Den Token mit dem Secret Token ersetzen, sonst könnte jemand Schadcode auf ihrem Server ausführen
  • am einfachsten das Skript auch in das Projekt einchecken

4. Web-Server konfigurieren

Am Server das Projekt initial klonen:

  • in das „public_html“ oder in das jeweilige Document-Root Verzeichnis der Website gehen
  • zum richtigen User  wechseln (Apache)
  • folgenden Befehl ausführen:
git clone ### SSH-Path ### .
  • nun sind alle Daten auch am Server vorhanden

Wenn nun lokal ein push ausgeführt wird, dann wird automatisch der Webhook aufgerufen, welcher wiederum die Änderungen auf dem Server holt. Dieser Vorgang kann nun theoretisch auch mit weiteren System (Demo, Produktiv, etc.) durchgeführt werden.

Weitere Tips:

  • wenn ein Passwortschutz verwendet wird, stimmen die Pfade nicht überein, was zu einer Apache-Fehlermeldung führt. Dies kann über die Abfrage in der .htaccess-Datei mittels Apache Environment Variable gelöst werden
  • die Versionierung der Datenbank kann mittels doctrine gelöst werden
  • je nach gewünschten Zielsystem einen branch anlegen
  • ein guter lokaler Git-Client ist SourceTree
  • zum Testen kann vorübergehen im deploy-Skript der Token-Schutz deaktiviert und das Skript über einen Browser aufrufen werden
  • im Deploy-Skript können auch weitere nützliche Dinge automatisiert werden: z.B. bei typo3 die gecachten Skript-Files löschen oder andere unterschiedliche Dinge zwischen Remote und Lokal steuern

Quellen:

Deploy-Skript:

// Check that we have a token, it's not empty and it matches our stored token$gitlab_token = $_SERVER["HTTP_X_GITLAB_TOKEN"];define('TOKEN', 'XXXXXXXXXXXXXXXX');if (!isset($gitlab_token) || $gitlab_token != TOKEN) {    exit();}//all git commands to execute$commands = array(    '/usr/local/git/bin/git pull',    '/usr/local/git/bin/git status',    '/usr/local/git/bin/git submodule sync',    '/usr/local/git/bin/git submodule update',    '/usr/local/git/bin/git submodule status',);// Run the commandsforeach ($commands AS $command) {    shell_exec($command);}

Wir entwickeln digitale Lösungen mit Leidenschaft

Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.

Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da:

Passend zu diesem Thema:

OpenProject Ticket System – Version 1.1

OpenProject Ticket System – Version 1.1

Wir haben ein Tool für OpenProject entwickelt, mit welchem man OpenProject um ein E-Mail-Ticket-System erweitert. Von diesem OpenProject Tool ist nun …

DDEV-Performance unter Windows verbessern

DDEV-Performance unter Windows verbessern

Bei der Entwicklung unserer Web-Projekte nutzer wir bei varioous DDEV. Einige Entwickler arbeiten bei uns auch mit Windows, wo bei uns bisher die Perf…

Cookie Richtlinie: Aktive Einwilligung der Nutzer notwendig

Cookie Richtlinie: Aktive Einwilligung der Nutzer notwendig

Bereits im Sommer gab es eine Entscheidung des EuGh zur Einwilligungspflicht zu Cookies. Per 01.10.2019 gibt es eine neue Änderung: die Einwilligung m…