Effettuare il deploy di un'applicazione su un server remoto con git

Con Git รจ possibile trasferire il codice sorgente di un'applicazione da un ambiente di sviluppo ad un ambiente di produzione o test.

Pubblicato da ,
Ultima modifica

In questo articolo si fa riferimento ad un server remoto con SO Linux su cui è già installato Apache e git, e inoltre si suppone che sia attiva una connessione ssh sulla porta 22.

Il deploy di un'applicazione su un server remoto con git è suddiviso nei seguenti passaggi:

  1. creare un repository "vuoto" sul server remoto;
  2. definire in questo repository un hook dove indicare il percorso in cui eseguire il deploy;
  3. aggiungere al nostro repository locale (non remoto) l'indirizzo del repository vuoto creato in precedenza.

Per creare un repository vuoto si usa il parametro --bare, creeremo questo repository in

/var/repositories/mysite.git

quindi da CLI lanciamo il seguente comando

$ mkdir -p /var/repositories/mysite.git

poi inizializiamo un repository vuoto con git init --bare, quindi da CLI

$ cd /var/repositories/mysite.git
$ git init --bare
Initialized empty Git repository in /var/repositories/mysite.git

per vedere cosa ha creato il comando --bare, possiamo usare ls -l, vedremo una struttura simile a questa

$ ls -l
-- branches
-- config
-- description
-- HEAD
-- hooks
-- info
-- objects
-- refs

A questo punto definiamo un hook post-receive, che verrà chiamato dopo che il repository ha ricevuto il codice inviato, quindi da CLI

$ cd hooks
$ vim post-receive

vim è il mio editor predefinito sul mio SO Linux, aggiungiamo il seguente codice

post-receive

#!/bin/sh
git --work-tree=/var/www/mysite.com --git-dir=/var/repositories/mysite.git checkout -f master
  • --work-tree, è la root del nostro progetto (in questo esempio è /var/www/mysite.com);
  • --git-dir, è il percorso del repository vuoto (quindi /var/repositories/mysite.git);
  • checkout -f master, indica il branch dal quale prenderemo il codice sorgente (in questo caso è il branch master)

affinchè si possa eseguire questo script, bisogna che abbia i permessi eseguibili, quindi da CLI eseguire il comando

$ chmod +x post-receive

questo è tutto ciò che bisogna fare sul server remoto, adesso occupiamoci del nostro progetto in locale.

Se abbiamo già avviato un progetto in locale con git, allora avremmo già un indirizzo remoto, se da CLI lanciamo il comando git remote -v avremo un risultato simile a questo

$ git remote -v
origin  https://github.com/<Username>/<Name Repository>.git (fetch)
origin  https://github.com/<Username>/<Name Repository>.git (push)

possiamo aggiungere altri indirizzi, quindi aggiungiamo quello del repository vuoto creato in precedenza sul server remoto, da CLI lanciamo il seguente comando nella cartella principale del nostro progetto locale

git remote add mysite ssh://root@<ip address>/var/repositories/mysite.git

mysite è un nome scelto a piacere, in questo caso sto usando l'utente root per effettuare una connessione ssh, ip address è l'indirizzo ip del nostro server, più il percorso del repository remoto, se lanciamo di nuovo il comando git remote -v avremo un risultato simile a questo

$ git remote -v
mysite  ssh://root@<ip address>/var/repositories/mysite.git (fetch)
mysite  ssh://root@<ip address>/var/repositories/mysite.git (push)
origin  https://github.com/<Username>/<Name Repository>.git (fetch)
origin  https://github.com/<Username>/<Name Repository>.git (push)

quindi per effettuare il push sul server remoto e quindi effettuare il deploy in /var/www/mysite.com useremo il comando

$ git push mysite master

verrà effettuata una connessione ssh e quindi, in questo caso, chiesta la password dell'utente root, e avremo un risultato simile a questo

$ git push mysite master
root@192.168.0.100's password:
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 301 bytes | 100.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Switched to branch 'master'
To ssh://192.168.0.100/var/repositories/mysite.git
   d26a4cc..018b5f9  master -> master

se invece vogliamo aggiornare il repository su GitHub possiamo farlo col comando

$ git push origin master

con questo sistema manterremo aggiornato il repository su GitHub qualora fosse condiviso da un gruppo di lavoro ed effettueremo il deploy della nostra applicazione sul server di produzione.