English version
Read this article in english: click here
Questa guida ti permette di creare un sistema automatizzato per poter fare il deploy del tuo progetto senza troppi software aggiuntivi e con personalizzazioni direttamente da repository del progetto (quindi sotto versioning).
REQUISITI
- account bitbucket
- repository del progetto su bitbucket e pipeline abilitata
- accesso ssh al server
LIVELLO DI DIFFICOLTA'
- medio
1 - Creare una chiave ssh ed aggiungerla a bitbucket pipelines
Dalla shell eseguite:
ssh-keygen -t rsa -b 4096 -N '' -f my_ssh_key
Una volta creata la chiave privata e pubblica effettuare questi passaggi:
cat my_ssh_key | grep base64
cat my_ssh_key.pub | grep base64
I due output andreanno poi copiati nella sezione Environment variables del repository bitbucket - sezione Pipeline.
In pratica impostiamo come variabili d'ambiente la chiave privata e pubblica per poter accedere al server dalla pipeline di bitbucket.
2 - Aggiungere la chiave nel server
Per poter aggiungere la chiave nel server basta eseguire:
ssh-copy-id -i my_ssh_key.pub [email protected]
3 - Creare il file known_hosts per poterla utilizzare nella pipeline
Questo file ci servirà per poter accedere alla macchina dalla pipeline
ssh-keyscan -t rsa server.example.com > my_known_hosts
Una volta creato, salvarlo perchè andrà aggiunto al repository del progetto.
Per maggiori info, seguite la guida ufficiale di bitbucket: https://confluence.atlassian.com/bitbucket/access-remote-hosts-via-ssh-847452940.html
4 - Aggiungere al repository bitbucket-pipelines.yml
Nella root del progetto aggiungere il file bitbucket-pipelines.yml
contenente questi passaggi:
image: debian:8.6
pipelines:
branches:
master:
- step:
script:
- mkdir -p ~/.ssh
- cat ./deploy/my_known_hosts >> ~/.ssh/known_hosts
- touch ~/.ssh/id_rsa
- touch ~/.ssh/id_rsa.pub
- (umask 077 ; echo $DEPLOY_SSH_KEY | base64 --decode -i > ~/.ssh/id_rsa)
- (echo $DEPLOY_SSH_KEY_PUB | base64 --decode -i > ~/.ssh/id_rsa.pub)
- apt-get update
- apt-get install curl -y
- apt-get install php5 php5-cli -y
- curl -LO https://deployer.org/deployer.phar
- mv deployer.phar /usr/local/bin/dep
- chmod +x /usr/local/bin/dep
- curl -LO https://getcomposer.org/composer.phar
- chmod +x ./composer.phar
- mv ./composer.phar /usr/local/bin/composer
- composer install -d ./deploy
- dep -f=./deploy/deploy.php gmdotnet:deploy production
Questo modello in pratica viene "eseguito" ad ogni push su branch master. E' possibile comunque impostare i trigger anche in modalità manuale oppure con diversi branch.
Guida ufficiale: https://confluence.atlassian.com/bitbucket/branch-workflows-in-bitbucket-pipelines-856697482.html
Questo servizio è simile ai più famosi Travis CI, Codeship ecc.. In pratica si ha un file yaml dove è possibile utilizzare una immagine docker e poter eseguire ciò che vogliamo.
Per fare eventuali test infatti, basta avere docker e seguire la guida ufficiale: https://confluence.atlassian.com/bitbucket/debug-your-pipelines-locally-with-docker-838273569.html
5 - Aggiungere la cartella deploy
In aggiunta a pipelines, dobbiamo inserire la cartella deploy contenente il software Deployer PHP che è colui che ci permette di eseguire le operazioni in remoto. E' molto semplice nell'utilizzo, quindi vi lascio lo studio direttamente nel loro sito ufficiale: https://deployer.org/
Cosa contiene la cartella:
- composer.json -> task aggiuntivi per deployer php
- deploy.php -> file contenente i task che vengono eseguiti sul server
- my_known_hosts -> file creato al punto 3
- server.yml -> configurazione dati del server
Repository pubblico con i file di esempio: https://bitbucket.org/gmdotnet/pipelines-deployer
6 - Effettuare un deploy
Una volta effettuato tutto il setup, per lanciare un deploy basterà fare una push sul branch master e la pipeline si attiverà da sola. A fianco ad ogni commit si potrà vedere lo status della job se è andata a buon fine o meno.
Conclusioni
La guida è solo uno spunto su come poter fare un deploy e non è completamente ottimizzata. In base ad ogni progetto le esigenze sono diverse e non è detto che questo sistema possa essere ottimale. Attenzione quindi a testare il tutto in un ambiente di staging prima di portarlo in produzione!