Ist Git / GitHub eine gute WordPress-Bereitstellungslösung?

67

Momentan entwickle ich mein WordPress lokal, übergebe meinen Code mit GitHub und Git und stelle dann SSH auf meinen Server und aktualisiere meinen Code mit "git pull". Ist dies eine gute Option für die Code-Bereitstellung auf einer WordPress-Site (in diesem Fall habe ich natürlich Zugriff auf meinen Server auf Root-Ebene.) Ich kenne Dinge wie Capistrano, aber wäre das ein Übermaß für die Bereitstellung auf einer WordPress-Site? Wie kann ich Git / GitHub in diesem Fall optimal nutzen?

Matt
quelle
Ich benutze deployhq.com und mag die Funktionen, die sie anbieten. Es ist eine bezahlte Dienstleistung, aber ich finde den Preis angemessen. Wenn Sie zufällig mit WP Engine hosten, haben sie kürzlich eine Git-Push-Funktion eingeführt: git.wpengine.com .
Dwenaus

Antworten:

60

Ich benutze Git dafür und finde, dass es wirklich gut funktioniert. Ein paar Vorschläge:

  • Fügen Sie Ihr Upload-Verzeichnis (wp-content / uploads) zu Ihrer .gitignoreDatei hinzu.
  • Führen Sie auf Ihrem Entwicklungssystem einen Webserver und einen Datenbankserver aus, damit Sie Änderungen lokal testen können, bevor Sie sie in die Produktion übertragen.
  • Behalten Sie Ihre Datenbankverbindungseinstellungen zwischen dev und prod bei, oder fügen Sie wp-config.php zu Ihrer .gitignoreDatei hinzu, um zu verhindern, dass Ihre WordPress-Entwicklungseinstellungen Ihre Produktionseinstellungen überschreiben.
  • Vermeiden Sie das Aktualisieren von Plugins auf Ihrem Produktionssystem über die Administrationsoberfläche von Wordpress. Im besten Fall überschreibt Ihre Git-Kopie alle von Ihnen aktualisierten Plugins, sobald Sie auf die Website klicken oder auschecken. Im schlimmsten Fall treten Konflikte auf. Führen Sie Ihre Aktualisierungen über die Admin-Oberfläche Ihres Entwicklungssystems durch, übertragen Sie sie, übertragen Sie sie und checken Sie sie in der Produktion aus.
  • Erwägen Sie, einen Git- post-receiveHook hinzuzufügen, um Ihre Updates automatisch in das Verzeichnis zu checken, in dem Sie WordPress über Ihren Webserver veröffentlichen (z /var/www. B. ). Auf diese Weise können Sie nur die Dateien selbst auschecken und verhindern, dass Git-Metadaten in den Dokumentenstamm Ihres Webservers gelangen. Außerdem können Sie dem Hook nach dem Empfang Berechtigungsänderungen hinzufügen, damit Ihre Berechtigungen jedes Mal konsistent bleiben. Ein Beispiel ist unten enthalten:

    #!/bin/sh
    unset GIT_INDEX_FILE
    # the directory your web server serves wordpress from 
    export GIT_WORK_TREE=/var/www/example.com/
    # the local directory where your remote git repository sites
    export GIT_DIR=/home/git/repos/example.com.git/
    # below user is for debain - you want the user and group your webserver uses
    sudo git checkout -f
    sudo chown -R www-data:www-data $GIT_WORK_TREE
    sudo chmod -R 755 $GIT_WORK_TREE
    sudo chmod 600 $GIT_WORK_TREE/wp-config.php
    sudo chmod -R 775 $GIT_WORK_TREE/wp-content
    
James Hebden
quelle
Erscheint das Backtick nach unset GIT_INDEX_FILEeinem Tippfehler?
Weston Ruter
James hat so ziemlich mein Worfklow zusammengefasst, außer dass ich die Themendateien erst zum Git-Repo hinzufüge, wenn ich die Staging- / Test- / Produktions-Site eingerichtet habe. Außerdem empfehle ich die Verwendung eines Post-Receive-Hooks auf dem Remote-Server, spart das Anmelden und das Ausführen eines Git-
Pulls
Zusammen mit SSH-Aliasen kann ich also mit "Git Push Live" usw. zum Live-Theme-Repo
wechseln
Ich bin nicht mit dem Aktualisierungsprozess des Plugins in WordPress vertraut, aber was passiert, wenn das Plugin-Update Änderungen an der Datenbank vornimmt? Wie werden diese lokalen Änderungen auf den Produktionsserver übertragen?
Benutzer
@ Benutzer, der von Plugin zu Plugin variieren würde. Core WordPress führt Schema-Versionsprüfungen durch. Wenn Sie Wordpress ohne den eingebauten Updater aktualisieren, werden die DB-Updates separat durchgeführt. Mein Rat wäre, wenn Sie Plugins verwenden, die in die Datenbank schreiben, dass Sie den Admin-Bereich von Wordpress überprüfen, da Schema-Updates normalerweise dort behandelt werden, unabhängig davon, wie Sie den Plugin-Code aktualisieren.
James Hebden
22

Ich kann die Einrichtung von Capistrano nur wärmstens empfehlen - es ist beim ersten Mal ein bisschen Vorarbeit, aber danach können Sie es problemlos für neue Setups verwenden.

Die Hauptvorteile sind

  • in der Lage sein, von Ihrem Desktop aus bereitzustellen. Es hört sich vielleicht nicht nach viel an, aber in den Remote-Server zu stöbern, und einen Trottel zu ziehen, ist immer noch ein Schmerz im Arsch.
  • Einfacher Rollback auf eine frühere Version, falls erforderlich
  • in der Lage, coole Dinge wie Setup-Bereitstellung auf Staging / Produktionsumgebungen zu tun.

Ich füge eine Reihe von Capistrano-Skripten hinzu, um Ihnen zu zeigen, wie ich die Dinge einstelle.

Capfile

require 'railsless-deploy'
load 'config/deploy'`

deploy.rb

set :stages, %w(production staging local)
set :default_stage, "staging"
require 'capistrano/ext/multistage'

set :application, "" # your application name - used to set directory name

set :scm, :git
set :repository, "" # use the ssh repo access line you get from the provider eg [email protected]:name/repo.git
set :deploy_to, "/var/www/#{application}" #this is the root site folder on the remote server
set :deploy_via, :remote_cache # get directly from repo
set :copy_exclude, [".git", ".DS_Store", ".gitignore", ".gitmodules", "wp-config.php"]

# makes capistrano ask for sudo password or other remote inputs
default_run_options[:pty] = true

namespace :tasks do
    task :fix_links  do
        run "ln -nfs #{shared_path}/uploads #{release_path}/wp-content/uploads"
        run "ln -nfs #{shared_path}/wp-config.php #{release_path}/wp-config.php"
      run "ln -nfs #{shared_path}/blogs.dir #{release_path}/wp-content/blogs.dir"
      run "ln -nfs #{shared_path}/.htaccess #{release_path}/.htaccess"
      run "sudo chown -R www-data.www-data #{release_path}/"
    end
end

after "deploy", "tasks:fix_links"

und schließlich eine Beispiel-Umgebungsdatei (wenn Sie das mehrstufige Juwel verwenden, können Sie für jede Phase Ihrer Umgebung eine davon haben, z. B. lokal, inszeniert, produziert)

config / local.rb

server "", :app  #hostname
set :branch, 'develop' #choose branch to deploy
set :use_sudo, false #don't use sudo

set :deploy_to, "/var/www/#{application}" #overwrite default path to deploy to

Diese Dateien funktionieren möglicherweise nicht ohne Anpassungen, und Sie benötigen einige grundlegende Capistrano-Kenntnisse, helfen aber hoffentlich einigen Menschen.

Dies war das erste Tutorial, mit dem ich Capistrano und WordPress zum Laufen gebracht habe: http://theme.fm/2011/08/tutorial-deploying-wordpress-with-capistrano-2082/

anu
quelle
2
Wenn Sie Git-Post-Receive-Hooks verwenden, müssen Sie sich nicht mehr beim Remote-Server
anmelden
git post-receiveHaken ist der Weg zu gehen!
Brock Hensley
3
@dirt Das Problem mit dem Post-Receive-Hook ist, dass eine inkorrekte Zusammenführung die gesamte Site zum Erliegen bringen kann, es sei denn, Sie verfügen über eine anständige CI-Infrastruktur. Die Wahrscheinlichkeit dafür steigt, wenn Sie an einem Projekt mit mehreren Entwicklern arbeiten, die Zugriff auf Ihr Repo haben. Das ist der Grund, warum ich persönlich stattdessen gerne über capistrano einsetze, aber ich kann sehen, warum sich andere möglicherweise nicht so sehr darum kümmern.
Anu
Sie verwenden ein nacktes Git-Repo, damit das Merge-Problem nicht relevant ist
davemac
9

Ich habe tatsächlich eine WordCamp-Präsentation zu diesem Thema gemacht. Anstatt mich zu wiederholen, hier ist ein Screencast davon und hier ist ein sehr einfaches Bereitstellungsskript , um das zu begleiten, was ich besprochen habe.

Kurz gesagt, ich verwende GitHub, um das Repo zu hosten, und verwende einen Webhook, um Änderungen basierend auf der Git-Referenz zu implementieren. Dies ermöglicht Ihnen die Verwendung des Git-Verzweigungsmodells von Vincent Driessen und eröffnet Ihnen unbegrenzte Möglichkeiten für Webheads, Staging-Server, Testserver usw. mit automatisierter Bereitstellung. Ich beschreibe auch, wp-config.php unter Versionskontrolle zu halten und gleichzeitig separate Entwicklungs- / Produktionsversionen zu verwalten (durch Umbenennen der Dateien und Symlinking).

Matthew Boynes
quelle
4

Ich weiß, dass diese Frage etwas älter ist, aber da ich sie hier nicht als Antwort gesehen habe, möchte ich Ihnen mitteilen, was ich normalerweise für Single-Site-Git-basierte Setups und Bereitstellungen mache und es funktioniert wirklich gut, auch mit mehreren Geräte, Standorte und mit mehreren Entwicklern (alle haben ihre eigenen lokalen Repos, in denen sie arbeiten, wie es für Git üblich ist).

Ich kann das folgende Setup wärmstens empfehlen:

Es wird auch in beschrieben (wenn Sie eine zweite Ressource benötigen, um Ihren Kopf darum zu wickeln):

Es funktioniert im Grunde (mit mindestens drei Repos) durch:

  1. die Website auf dem Live-Host unter git setzen,
  2. Erstellen Sie ein neues Bare-Git-Repository auf dem Live-Host.
  3. Und dann verzweigen Sie vom nackten Repository zu Ihren lokalen Entwicklungs-Git-Repos.

Wenn die Arbeit erledigt ist, drücken Sie gegen das Remote-Bare-Repo, von dem Sie geklont haben. Das Bare Repo hat Hooks, die mit dem Live-Repo synchronisiert werden können (in den oben genannten Codes Prime ).

Als Wordpress-spezifische Einstellungen im Repo habe ich folgendes .gitignore:

# uploads are data, excluded from source tree
wp-content/uploads/

Der Rest inkl. Die Plugin und Theme Konfiguration behalte ich unter Versions- / Konfigurationskontrolle. Auf diese Weise kann ich Änderungen einfach nachverfolgen und den Code überprüfen, bevor ich ihn live verwende. Ich kann mit meinen eigenen Änderungen auch einfacher gegen entfernte Bäume zusammenführen. Das ist besonders nützlich für den Wordpress-Kern, der auf Github verfügbar ist .

Dies funktioniert ziemlich gut für die meisten meiner Wordpress-Bedürfnisse. Das Bare Repo verhindert, dass Sie widersprüchliche Änderungen vornehmen. Es wird auch zuerst mit einer Remote-Kopie synchronisiert, bevor die Live-Site aktualisiert wird. Das bedeutet, dass die Aktualisierung der Live-Site normalerweise ziemlich schnell ist. Aufgrund der Hooks können Sie Wordpress-Update-Hooks auch nachträglich aufrufen.

Wenn Sie nicht experimentiert haben, wie viel dies mit Github-Hooks verbessert werden kann, brauche ich sie normalerweise nicht, da der Code der lokalen Versionskontrolle unterliegt, nicht Github.

Um ein solches System zum ersten Mal einzurichten, sollten Sie sich etwas Zeit nehmen, um zu prüfen, ob auf Ihrem Remote-Host alle Tools verfügbar sind:

  • SSH-Zugang
  • GIT
  • Ein privates Verzeichnis, in das Sie Dateien und Unterverzeichnisse ablegen können (zB für Ihr nacktes Git Repo)

Die erstmalige Inbetriebnahme sollte innerhalb von ein bis zwei Stunden inkl. die ganze Umgebung und Sie veröffentlichen zunächst Push.

Abhängig von Ihrem Host möchten Sie möglicherweise auch das .gitVerzeichnis vor dem Webzugriff schützen. Hier ist ein Beispielcode .htaccess, mit dem Wordpress sogar in einem Unterverzeichnis platziert wird, wodurch Platz im Repository bleibt, der nicht online veröffentlicht wurde (nützlich):

Options -Indexes

# fix trailing slash for .git / make it disappear + .gitignore and similar files.
RedirectMatch 404 ^/\.git(.*)$

# mask 403 on .ht* as 404
<Files ~ "^\.ht">
  Order Deny,Allow
  Allow from all
  Satisfy All
  Redirect 404 /
</Files>

RewriteEngine On
RewriteBase /

# map everything into public and set environment var
# to tag the request being valid
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule ^(.*)$ /public/$1 [E=sitealias:set,L]

Kurz gesagt, alles, was sich nicht im öffentlichen Verzeichnis befindet, ist nicht online. Innerhalb des öffentlichen Verzeichnisses kann sich beispielsweise die WordPress-Codebasis befinden, für die .htaccessSie dann dort benötigen:

RewriteEngine On
# mask as 404 if directly accessed
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule .* - [L,R=404]

Dies verhindert den direkten Zugang zur Öffentlichkeit . Einen Teil dieses .htaccess -foo finden Sie hier: Anforderungen an .htaccess sollten 404 anstelle von 403 zurückgeben . Für die Umgebungsvariablen müssen Sie testen, ob dies in Ihrer Umgebung funktioniert. Außerdem müssen Sie entscheiden, ob Sie dies unter Versionskontrolle stellen oder nicht.

Wenn Sie mehr Kontrolle über das Hosting haben, können Sie hier mehr Dinge tun (und anders / mehr optimiert). Die obigen Beispiele richten sich an typische Shared-Hosting-Umgebungen (die GIT bieten, einige Benutzer sagen, Sie können es einfach als Ihre eigene installieren Nun, normalerweise bitte ich meine Hoster, solche bereitzustellen, weil ich es bevorzuge, wenn sie darauf achten, dass ich sie dafür bezahle.

Negativ zu vermerken ist, dass einige der häufigsten Probleme auch in den anderen Antworten umrissen sind. Eine Sache, auf die ich nicht stolz bin, ist, dem Entwicklungshost eine Änderung an seiner Hostdatei zu geben, damit der Datenbankserver auf die Entwicklungskopie verweist. So können Sie eine Datenbankkonfiguration beibehalten. Nicht wirklich cool esp. wegen der Anmeldeinformationen.

Automatische Backups

Normalerweise kümmert es mich hier nicht sonderlich, sondern es werden tägliche Backups auf den entfernten Systemen ausgeführt, die inkrementell an einem anderen entfernten Ort gespeichert werden. Das ist einfach und billig und erlaubt Ihnen, sowohl die Wordpress-Installation als auch die Datei-Uploads, die Datenbank und das Git-Repo wiederherzustellen . Auch für meine Backup-Befehle bin ich vielleicht nicht ganz in Ordnung, aber diese funktionieren für mich:

mysql: mysqldump --host=%s -u %s --password=%s %s| gzip > %s
git  : git gc
       git bundle
files: tar --force-local -czf %s %s

Was ich hier vorschlage, ist, dass Sie die Prozesse rund um Ihre Wordpress-Installation von Wordpress fernhalten. Sie müssen auf einem bestimmten System ausgeführt werden, sodass Sie sie normalerweise nicht in der Anwendung haben (z. B. kann die Anwendung ausfallen , diese müssen jedoch weiterhin funktionieren).

Aktiviert für Teamwork

Ein weiterer Vorteil ist, dass Ihre Website bereits für Teamarbeit aktiviert ist. Dank des zusätzlichen Bare Repo können Sie nicht viel falsch machen und Sie können sogar entfernte Zweige mit Ihren Kollegen teilen, abgesehen von einem Master- oder Live-Zweig.

hakre
quelle