Entwicklung und Datenbanken

Deployment in cPanel mit der Datei .cpanel.yml automatisieren

Geprüft am 8 Min. Lesezeit Git Deployments

Die Git-Oberfläche von cPanel speichert nicht nur Ihre Repositorys: Sie kann Änderungen auch in Produktion bringen (das Deployment durchführen), indem sie die Aufgaben ausführt, die Sie in der Datei .cpanel.yml festlegen.

Ein vollständiges Praxisbeispiel Schritt für Schritt finden Sie unter automatisches Deployment von GitHub nach cPanel mit Laravel. Wenn Sie es nicht manuell einrichten möchten, erledigt Deploy+ das über den Kundenbereich.

Die Datei .cpanel.yml

Das ist eine Textdatei im YAML-Format mit der Liste der Befehle, die bei jedem Deployment ausgeführt werden: Dateien in den öffentlichen Ordner kopieren, Abhängigkeiten installieren, Caches leeren … alles, was Sie mit einem Befehl oder einem Skript tun können.

Legen Sie sie im Stammverzeichnis des Repositorys mit genau diesem Namen an (mit dem Punkt am Anfang) und committen Sie sie. Ihr Aufbau ist folgender:

---
deployment:
  tasks:
    - export DEPLOYPATH=/home/usuario/public_html/
    - /bin/cp index.html $DEPLOYPATH
    - /bin/cp style.css $DEPLOYPATH
  • Die ersten drei Zeilen sind fest: ---, deployment: und darunter tasks:.
  • Jede Aufgabe ist eine Zeile, die mit - (Bindestrich und Leerzeichen) beginnt, mit derselben Einrückung.
  • export DEPLOYPATH=... speichert den Zielordner in einer Variablen, damit Sie ihn nicht in jeder Zeile wiederholen müssen.
  • Die /bin/cp kopieren index.html und style.css aus dem Repository in den öffentlichen Ordner. So wird die Website mit den Änderungen aktualisiert.

Ersetzen Sie usuario durch Ihren cPanel-Benutzer. cp überschreibt Dateien, die am Ziel bereits mit diesem Namen existieren.

Die ganze Website mit rsync kopieren

Um nicht Datei für Datei vorzugehen, kopieren Sie den gesamten Inhalt des Repositorys außer dem, was nicht veröffentlicht werden soll:

---
deployment:
  tasks:
    - export DEPLOYPATH=/home/usuario/public_html/
    - /bin/rsync -a --exclude='.git' --exclude='.cpanel.yml' ./ $DEPLOYPATH

rsync löscht am Ziel keine Dateien, die nicht mehr im Repository sind. Mit --delete können Sie das erreichen, aber nur, wenn dieser Ordner ausschließlich Inhalte aus dem Repository enthält: Sonst würden auch hochgeladene Bilder, Caches oder die .htaccess gelöscht, wenn sie nicht im Repository liegen.

Aufgaben einer PHP-Anwendung

Sie können jedes Werkzeug mit seinem vollständigen Pfad ausführen. Zum Beispiel Abhängigkeiten mit Composer installieren und den Cache einer Laravel-Anwendung leeren:

---
deployment:
  tasks:
    - cd /home/usuario/repositories/proyecto && /usr/local/bin/php /opt/cpanel/composer/bin/composer install --no-dev --optimize-autoloader
    - cd /home/usuario/repositories/proyecto && /usr/local/bin/php artisan config:cache

Verwenden Sie immer absolute Pfade: Die Aufgaben laden Ihre Terminal-Konfiguration nicht. Wenn Sie nicht wissen, wo ein Programm liegt, führen Sie per SSH which php (oder das jeweilige Programm) aus.

Wenn es viele Aufgaben sind oder sie voneinander abhängen, legen Sie sie in ein Skript im Repository und rufen Sie in .cpanel.yml nur dieses Skript auf:

---
deployment:
  tasks:
    - /bin/bash /home/usuario/repositories/proyecto/deploy.sh

Beginnen Sie das Skript mit set -e, damit es beim ersten fehlgeschlagenen Befehl anhält.

Wann das Deployment ausgeführt wird

Push-Deployment: Sie pushen in das Repository von cPanel

Wenn Ihr lokales Repository das Repository von cPanel als Remote hat, führt cPanel bei git push automatisch die Aufgaben aus .cpanel.yml aus. Dafür muss das Repository in cPanel einen aktiven Zweig haben und darf keine nicht committeten Änderungen enthalten.

Um das Repository von cPanel als Remote hinzuzufügen, kopieren Sie die Clone URL, die unter Git™ Version Control > Manage angezeigt wird, und führen Sie auf Ihrem Computer aus:

git remote add cpanel ssh://usuario@tudominio.com/home/usuario/repositories/proyecto
git push cpanel main

Pull-Deployment: Der Code liegt bei GitHub, GitLab oder einem anderen Remote

Wenn das Repository in cPanel ein Klon eines GitHub-Repositorys ist, pushen Sie wie gewohnt zu GitHub und gehen Sie danach zu Git™ Version Control > Manage > Pull or Deploy:

  1. Update from Remote lädt die Änderungen herunter.
  2. Deploy HEAD Commit führt die Aufgaben aus .cpanel.yml aus.

Ein Push zu GitHub benachrichtigt cPanel nicht von selbst. Damit bei jedem Push automatisch deployt wird, verwenden Sie einen GitHub-Webhook, wie im Praxisbeispiel mit GitHub erklärt, oder einen Cron-Job wie im nächsten Abschnitt.

Das Deployment per API oder Cron-Job starten

Per SSH tut dieser Befehl dasselbe wie die Schaltfläche Deploy HEAD Commit:

/usr/local/cpanel/bin/uapi VersionControlDeployment create repository_root=/home/usuario/repositories/proyecto

Ersetzen Sie den Pfad durch den Ihres Repositorys. Wenn die Antwort status: 1 enthält, hat cPanel das Deployment gestartet; das Ergebnis jeder Aufgabe steht in der Datei unter log_path.

Um in regelmäßigen Abständen zu deployen, was bei GitHub liegt, legen Sie einen Cron-Job an, der zuerst die Änderungen herunterlädt und dann deployt:

cd /home/usuario/repositories/proyecto && /usr/bin/flock -n /home/usuario/.deploy.lock sh -c 'git pull -q && /usr/local/cpanel/bin/uapi VersionControlDeployment create repository_root=/home/usuario/repositories/proyecto' >/dev/null

flock -n verhindert, dass zwei gleichzeitig starten, wenn eine Ausführung länger dauert als vorgesehen. Wählen Sie keine zu hohe Frequenz: Alle 10 oder 15 Minuten reicht meist. Wenn Sie nur bei Änderungen deployen möchten, ist der Webhook die bessere Wahl.

Sehen, was bei einem Deployment passiert ist

Jedes Deployment hinterlässt ein Protokoll in ~/.cpanel/logs/ mit dem Namen vc_NUMERO_git_deploy.log. Dort erscheinen jeder Befehl, seine Ausgabe und sein Exit-Code: Task completed with exit code 0 bedeutet, dass es geklappt hat; jede andere Zahl zeigt den fehlgeschlagenen Befehl an.

ls -t ~/.cpanel/logs/*git_deploy.log | head -1 | xargs cat

Wenn ein Deployment beim Push nicht ausgeführt wird, prüfen Sie unter Git™ Version Control > Manage, ob das Repository einen aktiven Zweig hat und ob .cpanel.yml im Stammverzeichnis liegt und committet ist.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.