Deployer + Bitbucket Pipelines: come automatizzare il deploy del tuo progetto
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

pipeline

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.

deploy-keys

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.

commit-pipeline


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!

Domande? Dubbi?


Vorresti anche tu un sistema di deploy ma non sai come fare?

Contattami
Commenti offerti da Disqus