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