Git/GitHub è una buona soluzione per il deployment di WordPress?

25 gen 2013, 05:39:09
Visualizzazioni: 37.5K
Voti: 69

Attualmente sto sviluppando WordPress in locale, committando il mio codice su GitHub con Git e poi accedendo al mio server via SSH per eseguire un "git pull" per aggiornare il codice. È questa una buona opzione per il deployment del codice su un sito WordPress (ovviamente in questo caso ho accesso root al mio server)? Conosco strumenti come Capistrano, ma sarebbe eccessivo utilizzarlo per il deployment di un sito WordPress? Come posso sfruttare al meglio Git/GitHub in questo caso?

2
Commenti

Io uso http://www.deployhq.com/ e mi piacciono molto le funzionalità che offrono. È un servizio a pagamento ma trovo che il prezzo sia ragionevole. Se per caso usi WP Engine come hosting (come me) hanno recentemente introdotto una funzionalità di git push: http://git.wpengine.com/.

dwenaus dwenaus
5 feb 2013 11:46:10

Come gestisci questo caso d'uso? Hai fatto alcune personalizzazioni su WordPress, nella cartella dei temi di WordPress, e hai modificato alcune impostazioni in un plugin (quel plugin memorizza le impostazioni nel database). In questo modo, abbiamo installato molti plugin simili e modificato le impostazioni in localhost, ora senza ripetere le modifiche alle impostazioni del plugin come posso configurarle sul server di hosting. La sfida più grande è che il tuo server di hosting ha 1000 post del blog già online. Senza perdere questi contenuti, come farai a distribuire la tua installazione WordPress da localhost al server live.

indianwebdevil indianwebdevil
14 giu 2022 19:58:38
Tutte le risposte alla domanda 4
6
64

Io utilizzo git per questo e lo trovo davvero efficace. Alcuni suggerimenti:

  • Aggiungi la directory degli upload (wp-content/uploads) al tuo file .gitignore.
  • Configura un server web e un database sul tuo sistema di sviluppo per testare le modifiche localmente prima di trasferirle in produzione.
  • Mantieni le impostazioni di connessione al database coerenti tra sviluppo e produzione, oppure aggiungi wp-config.php al tuo file .gitignore per evitare che le impostazioni di sviluppo sovrascrivano quelle di produzione.
  • Evita di aggiornare i plugin sul sistema di produzione tramite l'interfaccia di amministrazione di WordPress - nel migliore dei casi, la tua copia git sovrascriverà i plugin aggiornati non appena eseguirai un push/checkout, nel peggiore otterrai dei conflitti. Esegui gli aggiornamenti tramite l'interfaccia di amministrazione sul sistema di sviluppo, esegui il commit, push e checkout in produzione.
  • Considera l'aggiunta di un hook git post-receive per eseguire automaticamente il checkout degli aggiornamenti nella directory utilizzata per pubblicare WordPress tramite il tuo server web (ad esempio /var/www). Questo permette di eseguire il checkout solo dei file, evitando che i metadati git finiscano nella root del documento del tuo server web, e consente anche di aggiungere eventuali modifiche ai permessi nello script post-receive per mantenerli coerenti ad ogni aggiornamento. Di seguito un esempio:

    #!/bin/sh
    unset GIT_INDEX_FILE
    # la directory da cui il tuo server web serve WordPress
    export GIT_WORK_TREE=/var/www/example.com/
    # la directory locale in cui risiede il tuo repository git remoto
    export GIT_DIR=/home/git/repos/example.com.git/
    # l'utente qui sotto è per Debian - usa l'utente e gruppo del tuo server web
    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
    
26 gen 2013 13:20:11
Commenti

Il backtick che appare dopo unset GIT_INDEX_FILE è un errore di battitura?

Weston Ruter Weston Ruter
30 gen 2013 00:44:37

James ha praticamente riassunto il mio flusso di lavoro, tranne per il fatto che aggiungo i file del tema al repository git solo dopo aver configurato il sito di staging/test/produzione.

Inoltre, consiglio vivamente di utilizzare un hook post-receive sul server remoto, evita di dover fare il login e eseguire un git pull, ecc.

davemac davemac
4 feb 2013 09:54:51

Questo, insieme agli alias SSH, significa che posso effettuare il push sul repository del tema live usando 'git push live' ecc.

davemac davemac
4 feb 2013 10:00:56

Non conosco bene il processo di aggiornamento dei plugin in WordPress, ma cosa succede se l'aggiornamento di un plugin apporta modifiche al database? Come verranno propagate quelle modifiche locali al server di produzione?

User User
13 giu 2014 08:21:28

@User questo varia da plugin a plugin. Il core di WordPress effettua controlli sulla versione dello schema, quindi se aggiorni WordPress senza utilizzare l'utility di aggiornamento integrata, applicherà gli aggiornamenti al database separatamente. Il mio consiglio è che se stai utilizzando plugin che scrivono sul database, controlli l'area di amministrazione di WordPress, poiché gli aggiornamenti dello schema vengono generalmente gestiti lì indipendentemente da come aggiorni il codice del plugin.

User User
13 giu 2014 09:30:29

Anche io sto imparando questo e ho incluso nel repository solo il tema attivo e i plugin personalizzati. La domanda su cosa succede quando un plugin sul sito si aggiorna, ma poi lo sovrascrivi con un pull è il motivo per cui .gitignore tutti i plugin tranne quelli personalizzati. Inoltre .gitignore anche la cartella degli upload, perché i file multimediali sulla mia macchina di sviluppo non sono necessariamente gli stessi del server di produzione. Un problema più grande che voglio sollevare è che GIT non dovrebbe essere la stessa cosa di un backup-restore. Sono due operazioni molto diverse. Git non dovrebbe essere la tua soluzione di backup-restore.

TARKUS TARKUS
28 feb 2021 21:30:41
Mostra i restanti 1 commenti
4
22

Consiglio vivamente di impostare Capistrano - richiede un po' di lavoro iniziale la prima volta, ma successivamente potrai utilizzarlo facilmente per nuove configurazioni.

I principali vantaggi sono:

  • la possibilità di effettuare il deploy direttamente dal tuo computer. Potrebbe non sembrare molto, ma connettersi via SSH al server remoto e fare un git pull è comunque una seccatura.
  • facile rollback a una versione precedente se necessario
  • la capacità di fare cose interessanti come configurare il deploy per ambienti di staging/produzione.

Aggiungo una serie di script Capistrano per mostrarti come ho impostato il tutto.

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, "" # nome della tua applicazione - usato per impostare il nome della directory

set :scm, :git
set :repository, "" # usa la linea di accesso SSH al repository che ottieni dal provider es. git@github.com:nome/repo.git
set :deploy_to, "/var/www/#{application}" # questa è la cartella root del sito sul server remoto
set :deploy_via, :remote_cache # ottieni direttamente dal repository
set :copy_exclude, [".git", ".DS_Store", ".gitignore", ".gitmodules", "wp-config.php"]

# fa sì che Capistrano chieda la password sudo o altri input remoti
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"

Infine, un file di ambiente di esempio (se usi la gemma multistage, puoi averne uno per ogni fase del tuo ambiente, es. locale, staging, produzione)

config/local.rb

server "", :app  # hostname
set :branch, 'develop' # scegli il branch da deployare
set :use_sudo, false # non usare sudo

set :deploy_to, "/var/www/#{application}" # sovrascrivi il percorso predefinito per il deploy

Questi file potrebbero non funzionare senza modifiche e avrai bisogno di una conoscenza base di Capistrano, ma spero possano essere d'aiuto ad 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/

26 gen 2013 14:05:48
Commenti

Se utilizzi gli hook post-receive di git, eliminano la necessità di accedere via ssh al server remoto e fare un git pull

davemac davemac
4 feb 2013 09:57:24

L'hook git post-receive è la strada da percorrere!

Brock Hensley Brock Hensley
14 mag 2013 04:07:35

@dirt il problema con l'hook post-receive è che, a meno che tu non abbia una buona infrastruttura CI in atto, un merge errato può far cadere l'intero sito. La probabilità di ciò aumenta se lavori su un progetto con più sviluppatori che hanno accesso in commit al tuo repository. Ecco perché, personalmente, preferisco fare il deploy tramite capistrano, ma posso capire perché altri potrebbero non preoccuparsene così tanto.

anu anu
14 mag 2013 09:53:52

Utilizzi un repository git nudo, quindi il problema di merge non è rilevante

davemac davemac
2 ago 2013 15:07:26
0

In realtà ho tenuto una presentazione su questo argomento durante un WordCamp. Piuttosto che ripetermi, ecco uno screencast della presentazione e ecco uno script di deployment molto semplice che accompagna ciò di cui ho parlato.

In breve, utilizzo GitHub per ospitare il repository e uso un webhook per distribuire le modifiche basate sul git ref. Questo ti permette di utilizzare il modello di branching git di Vincent Driessen e ti apre le porte a poter avere webhead illimitati, server di staging, server di testing, ecc., tutti con deployment automatizzato. Ho anche affrontato il tema di mantenere wp-config.php sotto controllo versione pur mantenendo versioni separate per sviluppo e produzione (rinominando i file e utilizzando symlink).

20 feb 2013 19:39:22
0

So che questa domanda è un po' datata, ma dato che non ho visto questa risposta qui, vorrei condividere quello che faccio normalmente per configurazioni e deployment basati su git per siti singoli, e funziona molto bene, anche lavorando da più dispositivi, luoghi e con più sviluppatori (ognuno con i propri repository locali in cui operano, come è comune con git).

Posso suggerire con grande entusiasmo la seguente configurazione:

È anche delineato in (se hai bisogno di una seconda risorsa per capirlo meglio):

Fondamentalmente funziona (con almeno tre repository) in questo modo:

  1. mettere il sito web sull'host live sotto git,
  2. creare un nuovo repository git bare sull'host live.
  3. E poi fare un fork dal repository bare al tuo repository git di sviluppo locale.

Quando il lavoro è fatto, fai un push verso il repository bare remoto da cui hai clonato. Il repository bare ha degli hook per sincronizzarsi con il repository live (nei codici sopra chiamato prime).

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

# le upload sono dati, esclusi dall'albero sorgente
wp-content/uploads/

Il resto, inclusa la configurazione di plugin e temi, lo tengo sotto controllo delle versioni/configurazione. Questo mi permette di tracciare facilmente i cambiamenti e revisionare il codice prima di usarlo in live. Posso anche unire più facilmente alberi remoti con i miei cambiamenti. Questo è particolarmente utile contro il core di Wordpress disponibile su Github.

Questo funziona molto bene per la maggior parte delle mie esigenze con Wordpress. Il repository bare ti impedisce di fare push di cambiamenti conflittuali. Sincronizza anche prima con una copia remota prima di aggiornare il sito live. Questo significa che aggiornare il sito live è normalmente molto veloce. Grazie agli hook puoi anche chiamare gli hook di aggiornamento di Wordpress dopo, se vuoi.

Non ho sperimentato quanto questo possa essere migliorato con gli hook di Github, ma normalmente non ne ho bisogno perché il codice è sotto controllo delle versioni locale, non su Github.

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

  • Accesso SSH
  • GIT
  • Una directory privata dove puoi mettere file e sotto-directory (es. per il tuo repository git bare)

Il tempo di configurazione per la prima volta dovrebbe essere possibile entro una o due ore, incluso l'ambiente completo e il tuo primo push di pubblicazione.

A seconda del tuo host, potresti anche voler proteggere la directory .git dall'accesso web. Ecco un esempio di codice .htaccess che lo fa anche con Wordpress posizionato in una sotto-directory, che lascia spazio nel repository non pubblicato online (utile):

Options -Indexes

# fix trailing slash per .git / farla scomparire + .gitignore e file simili.
RedirectMatch 404 ^/\.git(.*)$

# maschera 403 su .ht* come 404
<Files ~ "^\.ht">
  Order Deny,Allow
  Allow from all
  Satisfy All
  Redirect 404 /
</Files>

RewriteEngine On
RewriteBase /

# mappa tutto in public e imposta variabile d'ambiente
# per taggare la richiesta come valida
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule ^(.*)$ /public/$1 [E=sitealias:set,L]

In breve, tutto ciò che non è dentro la directory public non è online. Dentro la directory public può esserci il codice base di Wordpress per esempio, per il .htaccess lì dentro avrai bisogno di:

RewriteEngine On
# maschera come 404 se acceduto direttamente
RewriteCond %{ENV:REDIRECT_sitealias} !set
RewriteRule .* - [L,R=404]

Questo previene l'accesso diretto a public. Parte di questo .htaccess-foo lo puoi trovare delineato qui: Le richieste a .htaccess dovrebbero restituire 404 invece di 403. Per le variabili d'ambiente devi testare se funziona nel tuo ambiente. Inoltre devi decidere se metterlo sotto controllo delle versioni o no.

Se hai più controllo sull'hosting, puoi fare più cose qui (e in modo diverso / più ottimizzato), gli esempi sopra sono mirati per ambienti di hosting condivisi tipici (che offrono GIT, alcuni utenti dicono che puoi installarlo facilmente da solo, io normalmente chiedo ai miei hoster di fornirlo perché preferisco che se ne occupino loro, è 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 che funziona è dare all'host di sviluppo un cambiamento al suo file host per far puntare il server di database alla copia di sviluppo. Così puoi mantenere una configurazione del database. Non è proprio figo, specialmente per le credenziali.

Backup Automatici

Tuttavia normalmente non mi preoccupo molto qui ma invece ho backup giornalieri che girano sui sistemi remoti che sono incrementali e che a loro volta sono memorizzati in un'altra posizione remota. Questo è facile ed economico e ti permette di ripristinare sia l'installazione di Wordpress che i file uploadati, 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 è che tieni i processi intorno alla tua installazione di Wordpress fuori da Wordpress. Devono girare su un sistema specifico, quindi normalmente non li hai dentro l'applicazione (es. l'applicazione può andare giù ma hai bisogno che questi continuino a funzionare).

Abilitato per il Lavoro di Squadra

Un altro bel beneficio è che il tuo sito è già abilitato per il lavoro di squadra. Grazie al repository bare aggiuntivo non puoi sbagliare molto e puoi anche condividere branch remoti oltre a un master o live branch con i tuoi colleghi.

23 mag 2013 13:33:53