Questo articolo ha lo scopo di illustrare in modo basilare come utilizzare Deployer PHP su un SO Ubuntu, in particolare come configurare la nostra applicazione PHP per effettuare il deploy su un server remoto, come passare da una release all'altra, ad esempio nel caso in cui si voglia effettuare un rollback della nostra applicazione nel caso si verifichino dei malfunzionamenti o per altri motivi, o semplicemente passare ad un'altra release.
Si presuppone inoltre che si abbia già un'applicazione collegata ad un repository remoto e inizializzata con composer, e una connessione ssh attiva sul server di produzione.
La prima cosa che faremo è installare Deployer PHP nel nostro progetto, quindi dalla root lanciamo il seguente comando da CLI
$ composer require --dev deployer/deployer
Adesso possiamo inizializzare il progetto con deployer lanciando il seguente comando dalla root del nostro progetto
$ vendor/bin/dep init
ci verranno chieste alcune informazioni, selezionare il linguaggio con cui vogliamo creare il file di deploy
$ vendor/bin/dep init
Select recipe language [php]:
[0] php
[1] yaml
> 0
in questo esempio scegliamo 0 (che corrisponde a php) e poi invio, poi ci verrà chiesto il tipo di progetto, abbiamo diverse opzioni laravel, joomla, zend_framwork, etc...,
Select project template [common]:
[0 ] cakephp
[1 ] codeigniter
[2 ] common
[3 ] composer
[4 ] contao
[5 ] craftcms
[6 ] drupal7
[7 ] drupal8
[8 ] flow_framework
[9 ] fuelphp
[10] joomla
[11] laravel
[12] magento
[13] magento2
[14] pimcore
[15] prestashop
[16] provision
[17] shopware
[18] silverstripe
[19] statamic
[20] sulu
[21] symfony
[22] typo3
[23] wordpress
[24] yii
[25] zend_framwork
> 2
in questo esempio scegliamo common che sarebbe un progetto generico, quindi digitiamo 2 e poi invio, poi ci verrà indicato il link del repository (in questo esempio è https://github.com/MicheleDeF/deployer-example.git), poi il nome del progetto, e l'host in questo caso indichiamo l'indirizzo IP del server remoto (in questo esempio è 192.168.2.163) e poi invio.
Al termine di questa procedura verrà generato un file deploy.php nella root del nostro progetto simile a questo
deploy.php
<?php
namespace Deployer;
require 'recipe/common.php';
// Config
set('repository','https://github.com/MicheleDeF/deployer-example.git');
add('shared_files',[]);
add('shared_dirs',[]);
add('writable_dirs',[]);
// Hosts
host('192.168.2.163')
->set('remote_user', 'deployer')
->set('deploy_path', '~/example');
// Hooks
after('deploy:failed', 'deploy:unlock');
host è l'indirizzo IP del server remoto (in questo esempio è 192.168.2.163), remote_user è l'utente tramite il quale effettueremo una connessione ssh, deploy_path è il percorso nel quale verrà effettuato il deploy dell'applicazione, quindi modifichiamo questo file con i nostri dati
deploy.php
<?php
// Hosts
host('192.168.2.163')
->set('remote_user', 'micheledef')
->set('deploy_path', '/var/www/deployer-example');
micheledef è l'utente tramite il quale effettuo la connessione ssh, /var/www/deployer-example è il percorso del deploy, assicuriamoci che la cartella che abbiamo indicato sul server remoto /var/www/deployer-example abbia i permessi necessari per l'utente col quale effettuiamo il deploy, in caso contrario usiamo i seguenti comandi da CLI
cd /var/www/
sudo chown micheledef deployer-example
sudo chgrp -R micheledef deployer-example
in modo da avere un risultato simile a questo
$ drwxr-xr-x 2 micheledef micheledef 4096 lug 3 12:29 deployer-example
sostituiamo l'utente micheledef di esempio in questo articolo con quello che vogliamo.
Per connettersi all'host remoto è necessario specificare una chiave pubblica, se non ne abbiamo già una, generiamo una chiave pubblica con il seguente comando da CLI sul nostro sistema host locale
ssh-keygen
verranno generati due file id_rsa e id_rsa.pub in ~/ssh, modifichiamo il file ~/.ssh/config aggiungendo le seguenti righe
~/.ssh/config
Host *
IdentityFile ~/.ssh/id_rsa
creiamo una nuova SSH key dal nostro account github che abbia come valore key il contenuto del file id_rsa.pub.
Un'ultima cosa da fare prima di effettuare il deploy è modificare il valore repository nel file deploy.php, cioè aggiungendo l'url ssh del repository
deploy.php
<?php
set('repository','git@github.com:MicheleDeF/deployer-example.git');
Adesso lanciamo il comando per effettuare il deploy
vendor/bin/dep deploy
ci verrà chiesta la password per effettuare una connessione ssh tramite l'utente che abbiamo indicato nel file deploy.php (in questo esempio è micheledef), se tutto va a buon fine avremo un risultato simile a questo
se andiamo nel percorso del deploy sul server remoto che abbiamo indicato, in questo caso è /var/www/deployer-example, vedremo che sono stati trasferiti i file, in particolare vedremo una struttura simile a questa
current->releases/1
.dep
releases
shared
nella cartella current ci sono i file e le cartelle della nostra applicazione, la prima volta che si effettua un deploy è indicata la release numero 1.
Vediamo adesso come passare da una release all'altra nel caso ne abbiamo più di una.
Facciamo una modifica alla nostra applicazione effettuando il commit e il push, successivamente lanciamo di nuovo il comando da CLI
$ vendor/bin/dep deploy
se tutto è andato a buon fine nella directory del deploy sul server remoto /var/www/deployer-example avremo il seguente risultato
current->releases/2
.dep
releases
shared
cioè è stata creata una nuova release la numero 2 la quale è sta applicata in automatico alla nostra applicazione, se volessimo ritornare alla release 1 possiamo farlo tramite i seguenti comandi
cd /var/www/deployer-example
ln -nfs releases/1 current
possiamo passare da una release all'altra anche con un altro sistema cioè usando il comando dep come fatto fino adesso, basta lanciare il seguente comando da CLI
$ vendor/bin/dep run '{{bin/symlink}} releases/1 {{current_path}}'
indicando il numero della release, in questo esempio è 1, ci verrà chiesta la password per la connessione ssh.
Infine per visualizzare la lista delle releases disponibili lanciare il seguente comando da CLI
$ vendor/bin/dep releases
anche in questo caso ci verrà chiesta la password usata per la connessione ssh, avremo un risultato simile a questo