Deployment per Siti WordPress in Ambiente Dev, Stage e Production?
Ho bisogno di poter avere iterazioni dev/stage/production (su server separati) per un sito WordPress, solitamente uso git ma ovviamente questo non funziona con i siti WordPress a causa della dipendenza dal database per la configurazione principale di... beh, quasi tutto.
Quindi la mia domanda è: come lo fate voi? Ho fatto una rapida ricerca su Google e ho visto che ci sono alcuni plugin, è l'unico modo? Quali sono i migliori in termini di facilità d'uso, velocità, affidabilità, interfaccia utente ecc.?

Ho una configurazione di cui sono piuttosto orgoglioso e che funziona estremamente bene per il mio team.
Struttura Generale
Mantengo l'intera installazione sotto git. Tutte le modifiche, che si tratti di un aggiornamento di sistema, aggiunta/aggiornamento di un plugin, aggiunta/aggiornamento di un tema, seguono lo stesso flusso di lavoro. Le modifiche possono essere annullate in un attimo. Ho un server di deployment (un vecchio desktop P4) che esegue gitosis ma potresti altrettanto facilmente usare github o gitolite. In git, ho due branch "speciali", master
e develop
(spiegati più avanti). I miei server di produzione e staging sono basati su cloud.
Ambienti di Sviluppo
Ogni sviluppatore esegue il proprio server di sviluppo sulla propria macchina. In termini di database, raramente abbiamo avuto bisogno di dati live. Utilizziamo principalmente i dati di test del tema unit. Altrimenti, l'export e l'import coprono la maggior parte delle esigenze. Se il pezzo del DB fosse cruciale, potresti configurare la replica o impostare qualcosa per la sincronizzazione su richiesta. Quando ho inizialmente configurato questa struttura, pensavo che questo sarebbe stato cruciale, quindi ho iniziato a scrivere un set di strumenti per farlo, ma con mia sorpresa non erano davvero necessari. (nota: poiché non erano necessari, non li ho mai perfezionati, quindi ci sono bug, ad esempio sostituirà il dominio nei dati serializzati).
Ambiente di Staging
Quando i commit vengono inviati dal branch develop
a gitosis, vengono automaticamente distribuiti sul nostro server di staging. Il database di staging è uno slave del database di produzione.
Ambiente di Produzione
Quando i commit vengono inviati a gitosis sul branch master
, vengono automaticamente distribuiti sul server di produzione.
Il problema di wp-config.php
Vuoi che wp-config.php
sia unico da server a server, ma vuoi anche tenerlo sotto controllo di versione. La mia soluzione è stata usare .gitignore
per ignorare wp-config.php
e memorizzare le versioni di staging e produzione come file con nomi diversi. Quindi su ogni server, creo un symlink, ad esempio wp-config.php -> wp-config-production.php
. Ogni utente mantiene quindi il proprio DB con le proprie credenziali, con le proprie impostazioni (non tracciate) di wp-config.php.
Altre Note
Uso Rackspace Cloud, che è fenomenale ed economico. Con esso posso mantenere i miei server di staging e produzione identici. Sto anche scrivendo plugin che utilizzano la loro API per permettermi di controllare i miei servizi direttamente da WordPress, è fantastico.
Le directory della cache, le directory di upload dei file, ecc., sono tutte aggiunte a .gitignore. Se volessi, potresti impostare un'attività cron per verificare periodicamente gli upload e inviarli a gitosis, ma non è mai sembrato necessario.
La struttura master/develop è impostata per imitare parzialmente il modello di branching di Vincent Driessen. Uso anche la sua estensione git git-flow e la consiglio vivamente.
Ho avuto circa 10 sviluppatori che lavorano con questa struttura per oltre un anno ed è stato un sogno lavorarci. Affidabile, sicuro, veloce, funzionale e agile, non si può chiedere di meglio!

Sto per configurare un'installazione wp in modo simile (ma noi usiamo svn) e volevo confermare il tuo processo per aggiornare plugin e wp: completare l'aggiornamento e verificare su dev, commitare le modifiche, distribuirle su staging, verificare, distribuire su live. In sintesi, non fai mai un aggiornamento dell'installazione wp direttamente sul server live ma porti le modifiche tramite aggiornamenti nel repository?

E riguardo alle modifiche al DB fatte dalla routine di aggiornamento. Come vengono applicate al DB di produzione?

Quel flusso di lavoro è corretto @paullb, e non devi preoccuparti degli aggiornamenti del DB. Il modo in cui funziona WordPress, gli aggiornamenti vengono attivati dopo che il cambiamento viene rilevato, quindi funziona esattamente come funzionerebbe un aggiornamento manuale (del core o di un plugin)!

@MatthewBoynes, ciao. stai ancora utilizzando questo workflow per il tuo sviluppo? se sì, ho intenzione di applicare questo workflow al mio progetto. grazie :)

Non lo faccio, ma solo perché non è applicabile ai progetti su cui lavoro attualmente, che sono principalmente ospitati su WordPress.com VIP. Se fosse applicabile, lo userei ancora (e infatti, l'azienda per cui lavoravo in precedenza continua a utilizzarlo).

Ottimo materiale qui. Come gestisci le modifiche apportate a post esistenti ecc. sull'ambiente di staging? Come fai a pubblicare una modifica in produzione?

@MatthewBoynes E le impostazioni dei plugin? Anche queste risiedono nel database, ma vorremmo testarle in locale prima di modificarle in produzione (e preferiremmo non modificarle due volte, poiché questo metodo è soggetto a errori).

Non sono riuscito a utilizzare la variante del symlink per il config.php; non funzionava con vvv.

Innanzitutto, penso sia importante considerare cosa si intende mettere sotto controllo di versione. Raccomando contro l'idea di mettere l'intera directory di WP sotto VC. Ritengo che abbia più senso mettere sotto controllo wp-content/themes/NomeDelTuoTema. Per un sito ampio con un numero elevato di plugin complessi, si potrebbe considerare di includere anche wp-content/plugins. Se fosse assolutamente necessario, si potrebbe includere wp-content/uploads. Le risposte seguenti cambieranno leggermente, a seconda di cosa si decide di versionare.
Detto questo, ecco cosa utilizzo io:
Locale: Configurare un ambiente LAMP sulla tua macchina. Utilizza lo stesso URL del tuo sito di sviluppo. Usa VirtualHosts e voci nel file .host per simulare l'ambiente di sviluppo dal punto di vista dell'URL. Se stai versionando solo il tuo tema, considera l'uso di SSHFS per collegarti a wp-content/plugins, wp-content/uploads. Considera l'uso del database della tua installazione di sviluppo del progetto, a meno che tu non stia facendo operazioni particolarmente complesse.
Sviluppo: Estrai una copia di lavoro del tuo repository nel tuo ambiente WP. Configura un Hook POST-COMMIT in SVN per aggiornare questo repo ad ogni commit. Questo lo manterrà sincronizzato. (Consideralo una forma rudimentale di integrazione continua.)
Produzione: Estrai un tag di versione nominato che rappresenta una versione candidata finale. Quando devi utilizzare una nuova versione, cambia il tag e aggiorna il repository.

Un ambiente di sviluppo è perfettamente adatto per testare le build notturne, e il git di WordPress viene aggiornato automaticamente ogni 30 minuti, oltre ad essere decentralizzato e funzionare meglio per i team. Non conosco nessuno che sia passato a git/hg e sia tornato a usare svn.

Sono solo curioso di capire il tuo ragionamento per non mettere l'intera directory di WP sotto controllo versione. Sembra un collo di bottiglia nel flusso di lavoro. Inserire WP nel repository fornisce a tutti gli sviluppatori la stessa codebase e versione di WP. Permette anche di mantenere la coerenza tra gli ambienti. Vedi il link di Wyck (nella sua risposta) ai file wp-config condizionali.

Abbiamo recentemente scoperto RAMP. Nota: questa è solo una parte dell'intero processo, ma la sincronizzazione dei database dei contenuti tra i server è probabilmente la parte più complessa.

Lo faccio con git e mercurial, assicurati solo di utilizzare un repository privato.
Opzione 1.
L'unico problema è il config.php, che puoi dire a git di ignorare durante il push o prima dell'inizializzazione.
Usa .gitignore
oppure git update-index --assume-unchanged config.php
(leggi un po' riguardo al comando assumed-unchanged prima di usarlo)
Opzione 2.
Usa un condizionale nel config.php che controlla l'url e applica le credenziali corrette, qualcosa come "se l'url del server = dev allora usa le credenziali A, altrimenti usa le credenziali B", ecc.
Mark lo spiega meglio, http://markjaquith.wordpress.com/2011/06/24/wordpress-local-dev-tips/
PS. Puoi anche servire i file direttamente da un repository remoto invece di avere un tradizionale "file server". (video veramente noioso che ho fatto su questo http://www.youtube.com/watch?v=8ZEiFi4thDI)
