2009-07-17 16 views
22

Come distribuire correttamente le applicazioni dallo sviluppo alla produzione e come gestire più configurazioni del sito. Tutto il mio sviluppo avviene tramite svn situato in var/svn/myapp/trunk e il codice di produzione attuale è in/var/www/myapp.Come distribuire correttamente le tue applicazioni PHP?

Controllo l'ultimo codice sul mio computer locale in una directory denominata "myapp_latest_svn". devo sito e codice specifico posizione nel mio settings.php principale, che ha H_PATH = 'http://myapp.com' impostazioni di configurazione & db per db_host, db_user_name e password_db che è come sapete diversa in impostazioni della macchina locale (dove localhost/myapp. com è solo un alias Apache) & sul server di produzione (sito live viene eseguito su myapp.com).

Anche il file .htaccess è diverso da quello sul server di produzione. In breve, ci sono una serie di differenze tra dev e produzione.

Conservo tutto il mio lavoro in SVN. Ogni mattina uso SVN Update che aggiorna l'ultimo codice al mio repository svn locale. Quando sono pronto per andare a vivere, costruisco un rilascio con svn Commit.

Quindi nel rilascio devo ricordare di cambiare tutti i file dev appropriati alla loro controparte di produzione. Ora ho dovuto modificare manualmente le impostazioni di produzione.php & .htaccess per riflettere le modifiche specifiche del sito.

Sto cercando un modo automatico di passare dalla produzione alla produzione completa di controllo delle versioni e non modificare manualmente i file che sono soggetti a errori e cattive pratiche.

Un modo è rendere la versione di produzione dei file di sola lettura (0444). In questo modo quando eseguo un'esportazione svn, , non vengono sovrascritti dalla versione dev dei file e non devo preoccuparmi di modificare i file su ogni spostamento da dev in produzione. Ma questo è un cattivo modo di fare cose come l'integrazione continua.

Anche facendo più copie di settings.php (una per localhost, beta e prod). Quindi usa uno script di shell che esporta da svn, e poi una volta che l'esportazione è terminata, sostituisce il settings.php con le corrette impostazioni.php, a seconda della posizione in cui ci stiamo distribuendo. In questo modo tutto è automatizzato. Ma questo è anche un modo zoppo per andare.

Ultima modo è

if(eregi ("myapp.com$", $_SERVER['HTTP_HOST'])){ 

    define('H_PATH', 'myapp.com'); 

} else { 

    define('H_PATH', 'localmyapp.com'); 

} 

Questo va bene per quanto settings.php è interessato. Ma a cosa serve il .htaccess, non puoi controllare come sopra in .htaccess.

Quello che non voglio finire ogni volta che distribuisco il mio sito che devo modificare le impostazioni.

Lo schema del mio DB non è nel controllo di versione, quindi db non è un problema con me, solo le impostazioni.php e .htaccess.

Inoltre, come posso dire a svn di non aggiornare alcune directory dato che è anche specifico del sito (/ log,/cache,/assets,/downloads). Inoltre ho bisogno di conservare l'accesso in scrittura apache (www_data) intatto anche per i file sopra.

Infine, non voglio copiare la directory di trunk vuota ei file .svn sul server di produzione quando esporto.

Come posso utilizzare Phing o anche uno script di shell per integrare senza causare nessuno di questi problemi quando si costruisce da svn ai server di produzione.

Questo potrebbe essere utile per molti sviluppatori di app wannabe là fuori in natura.

Grazie in anticipo,

ocptime

risposta

13

vi consiglio di guardare Capistrano per i vostri mali di distribuzione. L'ho usato per distribuire i sistemi PHP e farà tutto ciò che descrivi (con un piccolo script che funziona nella tua ricetta di deploy).

Non conservo alcun file di configurazione nel mio repository remoto - quando effettuo il checkout in dev, posso aggiungerli una volta, quindi ignorarli, quindi non li controllo per errore. Quando si tratta di implementare, la mia ricetta di deploying è impostata in modo che scriva i file delle impostazioni nella versione distribuita. In questo modo, non devo mai preoccuparmi di distribuire e perdere qualcosa di critico.

Cap si occupa anche di tutte le risorse caricate (collegando in modo simbolico le directory in modo che rimangano in posizione su ogni distribuzione) e esegue automaticamente il backup di tutti i file di asset e del database in distribuzione su Amazon S3. Abbastanza elegante, eh?

+0

Grande link! Grazie! –

+0

Puoi spiegare che cosa fanno le directory degli asset di collegamento simbolico? – dave1010

2

Memorizzo i miei file di impostazioni e .haccess in SVN con nomi di file rinominati, ad es. settings.php.example e .htaccess.example. In questo modo quando creo una nuova versione non devo preoccuparmi di sovrascrivere le cose.

8

Ho un task Phing chiamato config, che mi chiede quale ambiente mi piacerebbe configurare il codice. Il compito accetta vari valori possibili: locale, lo sviluppo, la messa in scena, la produzione, ecc

volta dico che l'ambiente, si legge nel file .properties appropriato (cioè local.properties, production.properties, ecc)

Il passaggio successivo sarà la chiave per voi: memorizzare TEMPLATE dei file di configurazione e htaccess, quindi eseguire un task filterChain replaceTokens su di essi in modo che i token vengano sostituiti con i valori dal file delle proprietà.

Creare questi file:

comune/costruire/templates/settings.tpl

define('H_PATH','##H_PATH##'); 
define('ENVIRONMENT', '##ENVIRONMENT##'); 

build/templates/htaccess.tpl

http://##H_PATH## 

build/proprietà/local.properties

site.H_PATH = localmyapp.com 
site.ENVIRONMENT = local 

build/properties/production.properties

site.H_PATH = myapp.com 
site.ENVIRONMENT = production 

common/build/build.xml

<target name="config"> 
    <input propertyname="env" validargs="local,production">Enter environment name:</input> 
    <property file="build/properties/${environment}.properties" /> 
    <copy file="build/templates/settings.tpl" 
    tofile="config/settings.php" overwrite="true"> 
    <filterchain> 
     <replacetokens begintoken="##" endtoken="##">  
      <token key="H_PATH" value="${site.H_PATH}" /> 
      <token key="ENVIRONMENT" value="${site.ENVIRONMENT}" /> 
     </replacetokens>   
    </filterchain> 
    </copy>  
    <copy file="build/templates/htaccess.tpl" 
    tofile="public/.htaccess" overwrite="true">  
    <filterchain> 
     <replacetokens begintoken="##" endtoken="##">  
      <token key="H_PATH" value="${site.H_PATH}" />               
     </replacetokens>   
    </filterchain> 
    </copy>    
    <echo msg="Configured settings.php and .htaccess for ${environment}" />    
</target>        

Ora, quando si desidera configurare il sito per l'esecuzione a livello locale è sufficiente digitare:

phing config 

quindi digitare:

local 

e premere invio. Questo è tutto! Un enorme vantaggio di questo è che non hai più bisogno di alcuna istruzione if/else nel tuo codice. Inoltre, non dipende dalle variabili $ _SERVER, quindi funzionerà correttamente sulla riga di comando.

0

si può pensare a Capistrano, Magallanes, Deployer, ma sono anche una sceneggiatura. Posso consigliarti di provare walle-web, uno strumento di distribuzione scritto in PHP con yii2 out of the box. L'ho ospitato per mesi nella nostra azienda, funziona senza problemi durante l'implementazione di test, simulazione, ambiente di produzione.

Consente di configurare le attività di pre-distribuzione, post-distribuzione e post-rilascio, quindi è possibile modificare la configurazione dell'ambiente, ad esempio cp db_test.php db.php.

enter image description here

Dipende gruppi di strumenti bash, rsync, git, collegamento, ma un'interfaccia utente web generalmente ben per il funzionamento, avere una prova :)

Problemi correlati