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:
- creare un repository "vuoto" sul server remoto;
- definire in questo repository un hook dove indicare il percorso in cui eseguire il deploy;
- 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.