Git / GitHub è una buona soluzione di distribuzione WordPress?


67

Attualmente sto sviluppando il mio WordPress localmente, eseguendo il commit del mio codice su GitHub con Git e quindi SSHing sul mio server e facendo un "git pull" per aggiornare il mio codice. È una buona opzione per la distribuzione del codice su un sito WordPress (ovviamente ho accesso a livello di root al mio server in questo caso.) Conosco cose come Capistrano, ma sarebbe eccessivo per la distribuzione su un sito WordPress? Come posso ottenere il massimo da Git / GitHub in questo caso?


Uso deployhq.com e mi piacciono molto le funzionalità che offrono. È un servizio a pagamento ma trovo che il prezzo sia ragionevole. Se ti capita di ospitare con WP Engine (lo faccio) di recente hanno lanciato una funzione push git: git.wpengine.com .
dwenaus,

Risposte:


60

Uso git per questo e trovo che funzioni davvero bene. Alcuni suggerimenti:

  • Aggiungi la tua directory di upload (wp-content / uploads) al tuo .gitignorefile.
  • Esegui un server Web e un server database sul tuo sistema di sviluppo in modo da poter testare le modifiche localmente prima di inviarle alla produzione.
  • Mantieni coerenti le impostazioni di connessione al database tra dev e prod o aggiungi wp-config.php al tuo .gitignorefile per impedire alle tue impostazioni di wordpress di sviluppo di sovrascrivere quelle di produzione.
  • Evita di aggiornare i plug-in sul tuo sistema di produzione utilizzando l'interfaccia di amministrazione di Wordpress: nella migliore delle ipotesi, la tua copia git sovrascriverà tutti i plug-in che aggiorni non appena esegui il push / checkout, nel peggiore dei casi otterrai conflitti. Effettua i tuoi aggiornamenti utilizzando l'interfaccia di amministrazione sul tuo sistema di sviluppo, esegui il commit, il push e il checkout in produzione.
  • Prendi in considerazione l'aggiunta di un post-receivehook git per verificare automaticamente i tuoi aggiornamenti nella directory che usi per pubblicare wordpress tramite il tuo server web (ad es /var/www.). Questo ti consente di controllare solo i file stessi, evitando che metadati git si trovino nella radice dei documenti del tuo server web e significa anche che puoi aggiungere eventuali modifiche alle autorizzazioni nell'hook post-ricezione in modo che le tue autorizzazioni rimangano sempre coerenti. Di seguito è riportato un esempio:

    #!/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

Il backtick appare dopo unset GIT_INDEX_FILEun refuso?
Weston Ruter,

James ha praticamente riassunto il mio worfklow, tranne per il fatto che ho aggiunto i file dei temi al repository git solo dopo aver stabilito il sito di staging / test / produzione. Inoltre consiglio vivamente di utilizzare un hook post-ricezione sul server remoto, salvare l'accesso e fare un git pull ecc.
davemac

Questo, insieme agli alias SSH, significa che posso passare al repository a tema live usando 'git push live' ecc.
davemac,

Non ho familiarità con il processo di aggiornamento del plug-in in wordpress, ma cosa succede se l'aggiornamento del plug-in apporta modifiche al database? In che modo tali modifiche locali verranno inviate al server di produzione?
Utente

@Utente che varia da plugin a plugin. Il wordpress principale esegue i controlli della versione dello schema, quindi se aggiorni Wordpress senza utilizzare il programma di aggiornamento incorporato, eseguirà gli aggiornamenti del database separatamente. Il mio consiglio sarebbe se stai usando dei plugin che scrivono nel DB, che controlli l'area di amministrazione di Wordpress, poiché gli aggiornamenti dello schema sono generalmente gestiti lì indipendentemente da come aggiorni il codice del plugin.
James Hebden,

22

Consiglio vivamente di configurare Capistrano: la prima volta è un po 'di lavoro iniziale, ma dopo puoi usarlo facilmente per le nuove configurazioni.

I principali vantaggi sono

  • essere in grado di distribuire dal tuo desktop. Potrebbe non sembrare molto, ma entrare nel tuo server remoto e fare un pull git è ancora un dolore nel culo.
  • facile rollback a una versione precedente, se necessario
  • in grado di fare cose interessanti come l'installazione di installazione in ambienti di staging / produzione.

Sto aggiungendo un set di script capistrano per mostrarti come ho impostato le cose.

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 git@github.com: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"

e infine, un file di ambiente di esempio (se si utilizza la gemma multistadio, è possibile avere uno di questi per ogni fase del proprio ambiente, ad esempio locale, stadiazione, produzione)

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

Questi file potrebbero non funzionare senza modifiche e avrai bisogno di alcune conoscenze di base su Capistrano, ma speriamo che possano aiutare alcune persone.

Questo è stato il primo tutorial che ho usato per iniziare con Capistrano e WordPress: http://theme.fm/2011/08/tutorial-deploying-wordpress-with-capistrano-2082/


2
Se usi git post-ricezione git, annullano la necessità di collegarsi al server remoto e fare un pull git
davemac

git post-receivegancio è la strada da percorrere!
Brock Hensley,

3
@dirt il problema con l'hook post-ricezione è che, a meno che tu non abbia una buona infrastruttura CI, una fusione errata può far crollare l'intero sito. La probabilità di ciò aumenta se stai lavorando a un progetto con più sviluppatori che hanno accesso commesso al tuo repository. Ecco perché, personalmente, preferisco distribuire via capistrano, ma posso vedere perché gli altri potrebbero non preoccuparsene così tanto.
anu,

Usi

9

In realtà ho fatto una presentazione WordCamp su questo argomento. Piuttosto che ripetermi, ecco uno screencast di questo ed ecco uno script di distribuzione molto semplice per accompagnare ciò di cui ho discusso.

In breve, utilizzo GitHub per ospitare il repository e utilizzo un webhook per distribuire le modifiche in base al riferimento git. Ciò ti consente di utilizzare il modello di ramificazione git di Vincent Driessen e ti apre ad avere webhead illimitati, server di gestione temporanea, server di test, ecc., Tutti con distribuzione automatizzata. Copro anche mantenendo wp-config.php sotto controllo di versione mantenendo versioni separate di dev / production (rinominando i file e il collegamento simbolico).


4

So che questa domanda è un po 'più vecchia, tuttavia, poiché non ho visto questa come risposta qui, mi piacerebbe condividere ciò che faccio normalmente per le installazioni e le distribuzioni basate su git a sito singolo e funziona davvero bene, anche con il lavoro da più dispositivi, posizioni e con più sviluppatori (tutti con i propri repository locali in cui operano in quanto è comune per git).

Posso consigliare caldamente la seguente configurazione:

È anche delineato (se hai bisogno di una seconda risorsa per avvolgerti la testa):

Funziona sostanzialmente (con almeno tre repository) di:

  1. mettere il sito web sul live-host sotto git,
  2. creare un nuovo repository bare git sull'host live.
  3. E quindi passare dal repository nudo al repository git di sviluppo locale.

Quando il lavoro è finito, spingi contro il repository nudo remoto da cui hai clonato. Il repository bare ha hook da sincronizzare con il repository live (nei codici sopra chiamati prime ).

Come impostazioni specifiche di Wordpress nel repository ho questo .gitignore:

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

Il resto incl. il plugin e la configurazione del tema che tengo sotto controllo versione / configurazione. Questo mi permette di tracciare facilmente le modifiche e rivedere il codice prima di usarlo dal vivo. Posso anche unirmi più facilmente agli alberi remoti con le mie modifiche. Ciò è particolarmente utile contro il core di Wordpress che è disponibile su Github .

Funziona abbastanza bene per la maggior parte delle mie esigenze di Wordpress. Il repository nudo ti impedisce di inviare modifiche contrastanti. Si sincronizza anche con una copia remota prima di aggiornare il sito live. Ciò significa che l'aggiornamento del sito live è normalmente piuttosto veloce. A causa degli hook, puoi anche chiamare gli hook di aggiornamento di Wordpress in seguito, se lo desideri.

Se non ho sperimentato quanto questo può essere migliorato con gli hook di Github, ma normalmente non ne ho bisogno in quanto il codice è sotto il controllo della versione locale, non Github.

Per configurare un sistema del genere per la prima volta, dovresti dedicare del tempo per valutare se hai tutti gli strumenti disponibili sul tuo host remoto:

  • Accesso SSH
  • IDIOTA
  • Una directory privata in cui puoi inserire file e sottodirectory (ad es. Per il tuo repository bare git)

Il tempo di installazione per la prima volta dovrebbe essere possibile entro due ore incl. l'intero ambiente e tu prima pubblichi push.

A seconda del tuo host, potresti anche voler proteggere la .gitdirectory dall'accesso al web. Ecco un esempio di .htaccesscodice che lo fa anche con Wordpress inserito in una sottodirectory, che lascia spazio nel repository non pubblicato online (utile):

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]

In breve, tutto ciò che non è all'interno dell'elenco pubblico non è online. All'interno della directory pubblica può essere ad esempio il codebase di wordpress, per quel che .htaccessvi serve allora:

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

Ciò impedisce l'accesso diretto al pubblico . Parte di questo .htaccess -foo è possibile trovare delineato qui: Le richieste a .htaccess devono restituire 404 anziché 403 . Per le variabili di ambiente è necessario verificare se funziona nel proprio ambiente. Inoltre, devi decidere se metterlo sotto il controllo della versione o meno.

Se hai più controllo sull'hosting, puoi fare più cose qui (e in modo diverso / più ottimizzato), gli esempi sopra sono mirati per tipici ambienti di hosting condiviso (che offrono GIT, alcuni utenti dicono che puoi installarlo facilmente come bene, di solito chiedo ai miei hoster di fornirli perché preferisco che si prendano cura di questo è quello per cui li pago).

Sul lato negativo, questo ha alcuni dei problemi comuni delineati anche nelle altre risposte. Una cosa di cui non sono orgoglioso, ma ciò che funziona è dare all'host di sviluppo una modifica al suo file host per fare in modo che il server del database faccia riferimento alla copia di sviluppo. Quindi puoi mantenere una configurazione del database. Esp non molto interessante. a causa delle credenziali.

Backup automatici

Tuttavia, di solito non mi interessa molto qui, ma invece eseguono backup giornalieri sui sistemi remoti che sono incrementali che a loro volta vengono archiviati in un'altra posizione remota. È facile ed economico e consente di ripristinare sia l'installazione di Wordpress sia i caricamenti di file, il database e il repository git. Anche per i miei comandi di backup potrei non essere perfettamente a posto, ma quelli funzionano per me:

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

Quello che suggerisco qui è di mantenere i processi intorno all'installazione di Wordpress fuori da Wordpress. Devono essere eseguiti su un sistema specifico, quindi normalmente non li hai all'interno dell'applicazione (ad esempio, l'applicazione può andare in crash ma è necessario che questi continuino a funzionare).

Abilitato per il lavoro di squadra

Un altro vantaggio è che il tuo sito è già abilitato per il lavoro di gruppo. Grazie al repository nudo aggiuntivo non puoi fare molto male e puoi persino condividere filiali remote a parte un master o una filiale live con i tuoi colleghi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.