Impostazione di un ambiente di gestione temporanea

È prassi comune lavorare localmente su un progetto e inviare revisioni a un server di produzione, ma il passaggio che le persone spesso saltano è il server di staging. Un server di staging è un mix tra produzione e sviluppo; puoi testare la tua app come se fosse in produzione. Esaminiamo alcuni dei problemi che dovremo prendere in considerazione, nonché i passaggi necessari per replicare una piattaforma di produzione come servizio (PAAS).

È successo più di una volta: spingo una revisione della mia app in produzione, solo per trovare un problema dopo che è pubblico. Questi problemi possono essere semplici come dimenticare di aggiungere immagini al repository, oppure potrebbe essere grande quanto cambiare la struttura di un database localmente e dimenticare di aggiornare il database di produzione. I problemi capitano a tutti, specialmente quando hai fretta di scadenze. In queste situazioni, è una buona idea impostare un ambiente di staging. L'idea è di avere un server che replica da vicino l'ambiente di produzione, al fine di testare la tua app prima della pubblicazione.

Gli ambienti di staging non solo catturano errori umani, ma anche problemi relativi al software.

È possibile trovare e risolvere questi problemi perché l'area di gestione temporanea ha lo stesso software dell'ambiente di produzione. Ciò è in netto contrasto con la macchina locale, in cui è possibile che siano installate versioni differenti del software (ad es. PHP 5.3 o PHP 5.4) o funzionalità diverse. Ho spinto il codice che conteneva le chiamate file_get_contents solo per scoprire che il server di produzione non supportava quella funzione.

Quindi come si fa a impostare un server di staging? Bene, il primo passo è un po 'di ricognizione.


È tutto nei dettagli (principalmente)

I problemi capitano a tutti, specialmente quando hai fretta di scadenze.

La creazione di un ambiente di gestione temporanea è specifica per l'ambiente di produzione. Non esiste una soluzione magica che funzioni in ogni situazione. Ma la maggior parte dei casi segue uno schema simile e coprirò tutti i punti chiave mentre procediamo.

È giusto presumere che la maggior parte delle persone distribuisca le proprie app con un qualche tipo di strumento di versioning (come GIT). Per le strane possibilità che stai lavorando su un vecchio progetto che utilizza ancora FTP, siti come ftploy.com o deployHQ.com possono fungere da buffer tra GIT e il tuo server. Jeffrey Way ha messo insieme un video informativo sul modo in cui impostarlo.

Oltre a GIT, devi pensare ai linguaggi, al software e alle funzionalità "speciali" offerte dai tuoi server di produzione. Io uso un PAAS basato su PHP, chiamato Fortrabbit, perché offrono supporto PHP, Apache e GIT aggiornato. Offrono anche la possibilità di aggiungere una parola chiave nel messaggio di commit GIT che attiva Composer per installare le dipendenze del progetto.

Questo è il sistema che installerò nel resto di questo articolo. Il suo set di funzionalità standard, così come la speciale funzione di compositore, rendono Fortrabbit perfetto per un'ampia varietà di host. Ricorda: questa non è una soluzione magica, ma i passaggi coinvolti seguono lo stesso schema che utilizzeresti per configurare un ambiente di staging per la maggior parte dei progetti. Personalizza il processo in base alle tue esigenze specifiche.

Quindi, senza ulteriori indugi, saltiamo dentro.


Creazione del server

La creazione di un ambiente di gestione temporanea è specifica per l'ambiente di produzione.

Esistono molti diversi sistemi operativi che è possibile eseguire su un server. Fortrabbit esegue Debian Squeeze sui loro server e, poiché stiamo cercando di combaciare, ho deciso di eseguirlo.

Userò Vagrant per configurarlo. Non preoccuparti se non hai mai usato Vagrant; non faremo nulla di avanzato. Assicurati di aver installato VirtualBox e Vagrant (Vagrant è una CLI per VirtualBox, quindi è necessario VirtualBox).

Vagrant acquisisce un'istantanea virtuale di un sistema operativo come una "scatola" di base, quindi puoi creare più VM da quella immagine. Quindi, per prima cosa, dobbiamo scaricare la base per Debian Squeeze. Non sono esattamente sicuro da dove viene la mia copia, quindi l'ho caricata su DropBox affinché tu possa scaricare e utilizzare. Per installare, aprire una finestra di terminale e digitare:

 box vagabondo aggiungere debian https://dl.dropbox.com/u/30949096/debian.box

Questo aggiunge la scatola a Vagrant con il nome, 'debian'. Ora possiamo creare un'istanza di questa scatola per la nostra area di sosta. Per prima cosa, creiamo una nuova cartella:

 mkdir ~ / staging_server cd ~ / staging_server

Quindi, creare il file di configurazione di Vagrant digitando:

 vagrant init debian

Questo crea un file di configurazione, chiamato "VagrantFile", che contiene tutte le impostazioni per il tuo server. Sembra piuttosto affollato quando lo apri, ma la maggior parte delle linee sono commenti. Hai solo bisogno di decommentare la riga che dice: config.vm.network: bridged. L'eliminazione di tutti gli altri commenti ti lascia con un file che assomiglia a questo:

 Vagrant :: Config.run do | config | config.vm.box = "debian" config.vm.network: end bridged

Queste opzioni indicano a Vagrant di creare una nuova macchina virtuale basata sulla nostra scatola base Debian Squeeze. Quindi imposta la modalità di rete su "in parallelo". Una macchina virtuale con una rete a ponte viene visualizzata come una nuova macchina fisica sul router, quindi recupera automaticamente il proprio indirizzo IP. Questo ti consente di accedere alla macchina da qualsiasi dispositivo sulla tua rete (possibilmente al di fuori della tua rete se configuri il tuo router).

Ora, possiamo avviare la nostra VM con il comando: "vagabondo"(senza le virgolette).

Dovresti vedere l'output di Vagrant che crea la tua VM. Se il tuo computer ha più schede NIC collegate alla rete, Vagrant ti chiederà di scegliere la scheda NIC da collegare.

Useremo SSH per accedere, ma avremo bisogno di utilizzare il built-in di Vagrant "sergente vagabondo"comando per accedere. Secondo le best practice di Vagrant, tutte le caselle dovrebbero avere un utente chiamato" vagrant "con la password, sia per root che per vagabondo," vagabondo ". L'utente vagabondo viene aggiunto come sudo utente che non ha bisogno di inserire una password, quindi è possibile utilizzarlo direttamente sudo comandi.

Andiamo avanti e configuriamo il software del server.


Il software

La configurazione di Fortrabbit include:

  • Apache 2.2
  • PHP 5.4
  • Compositore

Inoltre, usano il repository dotdeb per installarne la maggior parte. Per chi non lo conosce, dotdeb è un progetto di Guillaume Plessis che installa le versioni più aggiornate dei pacchetti di server web più diffusi.

Siamo pronti per iniziare. Assicurarsi che la finestra del terminale sia aperta e connessa al server tramite SSH. Innanzitutto, aggiungi il repository dotdeb ad APT (il gestore pacchetti) aggiungendo un nuovo file sources.d directory:

 sudo vim /etc/apt/sources.list.d/dotdeb.list

Questo apre un nuovo file chiamato dotdeb.list in vim (un editor di testo). Il nome non è importante perché tutti i file in questa directory vengono letti in APT. Abbiamo bisogno di aggiungere quattro righe a questo file. Se non hai mai usato VIM, digita semplicemente "io"per accedere alla modalità di inserimento e copiare / incollare le quattro righe seguenti:

 deb http://packages.dotdeb.org spremere tutti i pacchetti deb-src http://packages.dotdeb.org spremere tutti i pacchetti http://packages.dotdeb.org squeeze-php54 tutti i deb-src http: //packages.dotdeb .org squeeze-php54 tutto

Per salvare, premere il tasto Esc chiave e tipo : wq. Questo è il comando per scrivere e uscire, che in pratica significa salvare ed uscire.

Premendo invio si salva il file e si ritorna alla riga di comando.

Ora abbiamo aggiunto i repository, ma dobbiamo ancora aggiungere la firma prima di poterli utilizzare. Digitare quanto segue per aggiungere la chiave GNU:

 curl http://www.dotdeb.org/dotdeb.gpg | sudo apt-key add -

Questo scarica la chiave dotdeb e la aggiunge come sorgente firmata. Ora aggiorna APT per inserire il nuovo pacchetto digitando:

 sudo apt-get update

Questo può richiedere circa un minuto, ma avrai tutti i pacchetti dotdeb elencati in APT al termine. A causa della configurazione di dotdeb e del caricamento delle dipendenze APT, possiamo installare Apache e PHP contemporaneamente digitando:

 sudo apt-get install php5

Con questa singola linea, APT installa e configura Apache2 e PHP5. Se si utilizza il componente aggiuntivo memcache di Fortrabbit, è possibile installarlo con:

sudo apt-get install memcached

Ma non ho intenzione di entrare in memcache nel nostro esempio in questo articolo.

Ora dobbiamo installare le estensioni utilizzate da Fortrabbit. Esegui il seguente comando:

 sudo apt-get install php5-xdebug php5-tidy php5-sqlite php5-redis php5-pgsql \ php5-mysqlnd php5-memcache php5-memcached php5-mcrypt php5-imagick php5-http \ php5-gmp php5-gd php5-curl php5 -apc php5-intl

L'ultima cosa che dobbiamo installare è Composer. Lo installerò a livello globale perché lo useremo in alcune posizioni diverse. I comandi per installare Composer a livello globale sono:

 curl -s https://getcomposer.org/installer | php sudo mv compositore.phar / usr / local / bin / compositore

Il primo comando scarica ed esegue il programma di installazione; il secondo comando sposta Composer nella cartella bin in modo che possiamo usarlo senza dichiarare il percorso. Passiamo alla configurazione.


Impostazione di Apache

È probabile che tu stia lavorando su più di un progetto. In questo caso, disporre di un server di gestione temporanea per ciascun progetto crea un sacco di spese generali. Per consentire più siti su un singolo server, abbiamo bisogno di aggiungere host virtuali basati sul nome ad Apache, e dovremmo separare directory e repository per ogni progetto.

Iniziamo con un host virtuale.

Continuerò a usare vim, ma so che se vuoi lavorare nei tuoi programmi, puoi copiarlo e incollarlo o salvarlo nel staging_server cartella creata sul tuo computer.

Quella cartella è condivisa con la tua VM e puoi accedere ai file nella vagabondo root directory. Puoi quindi utilizzare: sudo cp / vagrant / file newfile o sudo mv / vagrant / filee newfile per copiare o spostare i file, rispettivamente.

Per creare un nuovo host virtuale, dobbiamo creare un file nel / etc / apache2 / sites-available / directory. Per fare ciò con VIM, digita quanto segue:

 sudo vim /etc/apache2/sites-available/demo.site

All'interno, inserisci quanto segue (ricorda di premere "io"per la modalità di inserimento):

  ServerAdmin [email protected] ServerName demo.dev DocumentRoot / var / www / demo  Opzioni Indici FollowSymLinks MultiViews AllowOverride TUTTO L'ordine consente, nega l'autorizzazione a tutti  ErrorLog $ APACHE_LOG_DIR /demo.log LogLevel debug 

La prima riga dichiara un host virtuale che ascolta le richieste su qualsiasi IP sulla porta 80. Successivamente, impostiamo l'email di amministrazione del server e il nome del server. L'e-mail è a scopo di segnalazione degli errori, e l'opzione del nome del server indica ad Apache quando leggere questo host virtuale. Gli host virtuali regolari funzionano su IP. Ad esempio, ogni vhost ascolta un IP diverso; è così che Apache li differenzia.

Dato che probabilmente hai solo un IP, possiamo usare gli host virtuali basati sui nomi, permettendoti di fornire un nome diverso sullo stesso IP.

Nel nostro esempio, qualsiasi richiesta diretta a demo.dev viene rilevata da questo host virtuale.

La riga successiva imposta la cartella radice del documento. Questo è dove Apache recupera i file per questo vhost. Le dichiarazioni all'interno del elenco direttiva imposta i permessi per questo vhost. Non entrerò troppo nel dettaglio, ma prima impostiamo le opzioni di Apache nelle directory, quindi impostiamo ciò che può essere ignorato in un file .htaccess e, infine, impostiamo chi può accedere al sito (tutti possono nel nostro caso).

Le ultime due righe indicano ad Apache come nominare il file di registro e cosa scrivere nel registro. Il nostro file di registro è chiamato demo.log nella cartella di registro di Apache situata in / Var / log / apache2 / su questa VM.

Per abilitare questo vhost, digita quanto segue:

 sudo a2ensite demo.site

Questo crea un collegamento simbolico tra il file nella cartella dei siti disponibili in un file nella cartella abilitata ai siti. Dopo aver eseguito questo comando, ti viene chiesto di riavviare Apache. Riceverai un errore se proverai a riavviare Apache perché non abbiamo creato la directory del sito. Questo è facilmente risolto comprare creando il dimostrazione cartella a cui abbiamo fatto riferimento nel file vhost:

 sudo mkdir / var / www / demo

Non vogliamo che l'utente root sia proprietario della cartella, quindi sostituiscilo con l'utente vagabondo chown comando:

 sudo chown -R vagabondo: vagrant / var / www / demo

Ora riavvia Apache:

 sudo service apache2 restart

Il nostro nuovo sito dovrebbe ora essere pienamente funzionante. Il nostro prossimo passo è impostare GIT.


Seguendo con alcuni GIT Magic

Assicurati di essere nella directory home digitando cd ~. Crea una nuova cartella per il repository: mkdir demo.git, inserisci la cartella e inizializza un nuovo repository GIT nuovo:

 cd demo.git git init --bare

Un repository nudo è essenzialmente un repository standard senza una directory di lavoro. Se vuoi saperne di più su GIT, dai un'occhiata alla serie di video di Andrew Burgess.

Ora abbiamo bisogno della possibilità di inserire il codice nella cartella del sito e ci sono molti modi per farlo. Ma mi piace rendere le cose il più vicino possibile al servizio che sto emulando. Ecco una foto del processo git fortrabbit prelevato dal loro sito:

Puoi vedere il processo di push attraverso tre passaggi. Visualizza un messaggio di aggiornamento quando si connette e distribuisce il sito nella directory. Il passaggio finale installa tutto se il messaggio di commit contiene le parole chiave "[trigger: compositore]". Quindi, al termine di questi tre passaggi, viene visualizzato il messaggio >> >> Tutto fatto <

Prima di creare i ganci, voglio parlare dei colori.

Io faccio la maggior parte del mio lavoro nel terminale e, il più delle volte, le app terminali lasciano tutto dello stesso colore. L'aggiunta di colori diversi alla tua app non solo aumenta la leggibilità, ma aumenta anche l'abilità. Quindi distribuisci le "pratiche del colore" troppo meglio nelle app di terminale, mi prenderò un momento per discutere di come funzionano.


Colori del terminale

I terminali sono dotati di sedici colori ANSI che possono essere configurati e utilizzati in tutto il terminale. Ecco un'immagine della schermata delle impostazioni di iTerm2, che mostra le sedici aree di colore:

Puoi accedervi dal terminale digitando il carattere di escape, seguito dalla parentesi quadra aperta e quindi il codice del colore. In questa immagine puoi vedere che i colori sono divisi in due righe: una con l'etichetta "Normale" e l'altra con "Luminoso". I codici per i colori normali sono i numeri 30-37 seguiti dalla lettera "m", e i colori brillanti sono da 90-97 di nuovo seguiti da un m. Puoi testarlo nella finestra del terminale usando eco. Per creare il carattere di escape, digitare ctrl-v seguito da Ctrl- [. Otterrai un personaggio simile ^ [, ma non funzionerà se si digita semplicemente "^ [" (shift-6 e quindi parentesi quadra aperta). Quindi nel tipo di finestra del terminale:

 echo "^ [[31m Hello World ^ [[0m"

Di nuovo, il primo ^ [ non è stato digitato, ma è stato creato con ctrl-v e poi Ctrl- [. Il 0m il codice carattere è il codice di reset; rimuove tutta la formattazione. Questo perché i codici colore non terminano dopo la parola successiva, continuano fino a quando non ricevono un codice diverso.

Se fatto correttamente, il codice sopra riporta le parole "ciao mondo" in rosso (a meno che tu non abbia lo slot impostato su un colore diverso).

Durante il resto del tutorial, aggiungerò i colori ai comandi. Sentiti libero di seguirli o di ometterli; non sono strettamente richiesti. Ma se vuoi usare i colori, sentiti libero di usare il mio corso per aiutare i colori. Ora, torniamo a scrivere i ganci.


Creare i ganci

Se date un'altra occhiata all'immagine di Fortrabbit, vedrete che visualizza il messaggio "Passaggio 1: Aggiornamento del repository" prima di aggiornare il repository. Per farlo correttamente, dobbiamo inserire questo messaggio nel gancio di pre-ricezione, che viene eseguito prima che il repository venga aggiornato. Nel tipo di finestra del terminale:

 vim ~ / demo.git / hooks / pre-receive

Questo apre il gancio per la modifica. Aggiungi il seguente codice:

 #! / Usr / bin / php 

La prima riga indica al sistema operativo che si tratta di un file PHP e di eseguirlo come tale. Quindi assegniamo un colore e la sequenza di reset alle variabili. L'ultimo passo ecos la linea.

L'hook successivo è un po 'più complicato perché gestisce il resto delle azioni. Lo faremo passo dopo passo, quindi salva il primo hook (: wq) e apri il prossimo hook:

 vim ~ / demo.git / hooks / post-receive

L'hook post-ricezione viene eseguito dopo l'aggiornamento del repository. Dobbiamo prima aggiornare il sito e quindi controllare il trigger Composer. Ecco uno scheletro del nostro programma, tralasciando ogni nuova logica:

 #! / Usr / bin / php  ". $ ciano." OK ". $ vuoto." \ n "; echo $ giallo." Passaggio 2: distribuzione ". $ blank." \ n "; / * TODO: Distribuire nel sito * / echo" -> ". $ ciano. "OK". $ vuoto. "\ n"; / * TODO: controlla se il commit ha trigger * / echo $ giallo. ">> Tutto fatto <<" . $blank . "\n"; ?>

Questo è solo uno schema su cui lavorare. La prima cosa che dobbiamo inserire è la funzionalità per inserire la nuova versione del repository nella directory del sito. Tradizionalmente, dovrei semplicemente digitare quanto segue se fossi nella cartella:

 git fetch origin git reset --hard origin / master

Potresti usare qualcosa del genere tira fuori, ma così facendo può causare errori. Se un file è stato modificato direttamente, o se hai perso un commit, allora tira fuori non ti consentirà di estrarre o eliminare i file non tracciati.

Si tratta di due semplici comandi, ma si verificherà un errore se si tenta di eseguirli dal gancio.

GIT imposta alcune variabili di ambiente prima di eseguire gli hook. Puoi aggirare questo problema con una delle due soluzioni e ti mostrerò entrambe.

Il primo è quello di sovrascrivere le variabili di ambiente, passando direttamente le informazioni. Il secondo cancella completamente le variabili. Userò la prima opzione in questo esempio e la seconda opzione quando lavoreremo sul trigger del compositore. Sostituisci il commento che ho aggiunto sopra dove dice "TODO Deploy to site" con quanto segue:

 $ git = "git --git-dir = / var / www / demo / .git / --work-tree = / var / www / demo /"; exec ("$ git fetch -q origin"); exec ("$ git reset --hard origin / master");

Questo sovrascrive le variabili di ambiente e chiama le funzioni di cui sopra. Il aggiunto -q parametro dice a GIT di essere "silenzioso", proibendo a GIT di echeggiare qualsiasi messaggio.

Ora dobbiamo controllare il trigger Composer. Rompiamo questo in due passaggi. Per prima cosa controlliamo il trigger e quindi eseguiamo Composer. Sostituisci il secondo commento TODO con quanto segue:

 $ msg = exec ("$ git log -n 1 --format = formato:% s% b"); if (strpos ($ msg, "[trigger: compositore]")! == false) echo $ giallo. "Step3: Composer Hook". $ vuoto. "\ N"; echo "-> Triggering install - ottieni un". $ ciano. "caffè" . $ vuoto. "\ N"; // avvia compositore echo "->". $ ciano. "OK" . $ vuoto. "\ N"; 

La prima riga recupera il messaggio di commit usando il log git comando e passaggio in un formato speciale per escludere qualsiasi informazione aggiuntiva. Successivamente, controlliamo se la stringa ha la parola di attivazione speciale e fa eco al terzo passaggio e al messaggio OK. Stiamo controllando la parola chiave Composer, ma potresti implementare più parole chiave per altre funzionalità come: migrare in Laravel o eseguire test di unità. Aggiungi qualsiasi cosa per migliorare il tuo flusso di lavoro.

L'ultimo passo è eseguire Composer. Il compositore ha due comandi: installazione di compositore e aggiornamento del compositore.

Il comando install non legge il composer.json file se trova un composer.lock, e perché alcune persone potrebbero aggiungere composer.lock al loro file .gitignore, è più sicuro da eseguire aggiornamento del compositore (guarda sempre al composer.json file.

Il secondo problema è che a volte Composer usa GIT per scaricare pacchetti, e questi tentativi falliscono a causa delle variabili di ambiente. Quindi qui è un buon posto per rimuovere semplicemente la variabile di ambiente "GIT_DIR". Sostituisci il commento per eseguire Composer con quanto segue:

 chdir ( "/ var / www / demo"); putenv ( "GIT_DIR"); exec ("aggiornamento del compositore");

Questo codice è semplice. Spostiamo il processo PHP nella cartella del sito e quindi rimuoviamo il GIT_DIR variabile d'ambiente in modo che GIT funzioni normalmente. L'ultima riga esegue Composer.


Legare le estremità sciolte

Ora abbiamo entrambi gli hook di configurazione, ma non siamo completamente pronti per iniziare a utilizzare il nostro server. Innanzitutto, dobbiamo rendere eseguibili questi hook:

 chmod a + x ~ / demo.git / hook / pre-receive chmod a + x ~ / demo.git / hooks / post-receive

Quindi, creare un repository GIT nella cartella del sito. Riceviamo un errore se proviamo a eseguire i nostri hook perché la cartella del sito non è un repository GIT. Per risolvere questo tipo:

 cd / var / www / demo git init git remote aggiungi origine /home/vagrant/demo.git

Le prime due linee creano il repository e quindi aggiungiamo il repository nudo come origine di questo repository.

È inoltre necessario aggiungere la propria chiave pubblica agli host autorizzati di questo server in modo da poter accedere al server tramite GIT senza password. Puoi copiare la tua chiave pubblica digitando sul tuo computer (non sulla VM):

 cat ~ / .ssh / id_rsa.pub | pbcopy

Quindi, è sufficiente incollarlo sul server nel file ~ / .Ssh / authorized_keys:

 vim ~ / .ssh / authorized_keys

Basta aggiungerlo al file, ma lasciare ciò che è già dentro.

Successivamente, dobbiamo aggiungere l'IP di questo server al nostro file hosts. Per trovare l'IP, digitare:

 ip -4 -o addr mostra etichetta eth *

Questo mostra l'IP di tutti i dispositivi di rete su questa VM. Aggiungi quello che si connette alla tua rete locale. Se non è possibile determinare quale indirizzo IP utilizzare, copiarne e incollarne uno nel browser. Se si connette, allora hai l'indirizzo IP corretto.

Prendi l'IP e aggiungilo al file hosts del tuo computer (non al file hosts della VM). Il file hosts su un Mac si trova in etc / hosts:

 sudo vim / etc / hosts

Quindi, aggiungi la seguente riga:

 #Formato: indirizzo_IP nome_codice 192.168.0.110 demo.dev

Se funziona, sarai in grado di navigare http://demo.dev nel tuo browser. Mentre sei ancora sul tuo Mac, crea una cartella e inizializza un repository GIT:

 mkdir ~ / demo cd ~ / demo git init echo "Hello World"> index.php git add. git commit -am "added index.php" git remote add staging [email protected]: demo.git git push staging master

Se tutto è andato bene, dovresti vedere una risposta dai nostri ganci GIT. Navigazione verso http://demo.dev dovrebbe risultare nel messaggio "Hello World" visualizzato nel browser.


Conclusione

Ecco come è possibile creare un ambiente di gestione temporanea che riproduca la funzionalità di un tipico PAAS. Se hai avuto problemi a seguire, o hai bisogno di configurare più ambienti di staging, ho creato uno script che automatizza completamente il processo. Per ulteriori informazioni, è possibile visitare stagr.gmanricks.com.

Spero che l'articolo ti sia piaciuto. Sentiti libero di porre qualsiasi domanda che potresti avere nei commenti. Grazie per aver letto.