Crea una pipeline di build con Travis CI

1. Introduzione

Nello sviluppo di software moderno, il termine pipeline viene utilizzato molto. Ma cos'è?

In generale, una pipeline di compilazione è un insieme di passaggi automatizzati che spostano il codice dallo sviluppo alla produzione .

Le pipeline di compilazione sono ottime per implementare flussi di lavoro di integrazione continua per il software. Ci consentono di creare modifiche più piccole con maggiore frequenza , con l'obiettivo di trovare i bug prima e ridurre il loro impatto.

In questo tutorial, vedremo come costruire una semplice pipeline di build utilizzando Travis CI.

2. Passaggi in una pipeline di build

Una pipeline di compilazione può essere composta da molti passaggi diversi, ma come minimo dovrebbe includere:

  • Compilazione del codice : nel nostro caso, ciò significa compilare il codice sorgente Java in file di classe
  • Esecuzione di test : come l'esecuzione di unit test ed eventualmente di test di integrazione
  • Distribuzione di artefatti : impacchettare il codice in artefatti, ad esempio in file jar e distribuirli

Se un'applicazione utilizza tecnologie diverse, è possibile includere passaggi aggiuntivi nella pipeline di compilazione . Ad esempio, potremmo avere un passaggio aggiuntivo che minimizza i file JavaScript o pubblica la documentazione API aggiornata.

3. Che cos'è Travis CI?

Per la nostra pipeline di build di esempio, utilizzeremo Travis CI, uno strumento di integrazione continua basato su cloud .

Questo ha una serie di funzionalità che lo rendono un'ottima scelta per iniziare a creare pipeline:

  • Si integra rapidamente con qualsiasi repository GitHub pubblico
  • Supporta tutti i principali linguaggi di programmazione
  • Distribuisce su più piattaforme cloud differenti
  • Offre una varietà di strumenti di messaggistica e avviso

Ad alto livello, funziona monitorando un repository GitHub per nuovi commit.

Quando viene effettuato un nuovo commit, esegue i passaggi della pipeline di compilazione come definito in un file di configurazione (maggiori informazioni su questo di seguito). Se uno qualsiasi dei passaggi fallisce, la pipeline si interrompe e ci avviserà.

Fuori dagli schemi, Travis CI richiede pochissima configurazione. L'unica configurazione richiesta è specificare il linguaggio di programmazione .

Possiamo sempre fornire più configurazione per adattare la nostra pipeline, se necessario. Ad esempio, possiamo limitare i rami che attivano le build, aggiungere ulteriori passaggi alla pipeline e molto altro ancora.

3.1. Versioni gratuite ea pagamento

È importante sapere che Travis CI attualmente ha 2 offerte: una versione gratuita e una a pagamento.

La versione gratuita, indicata dal nome di dominio .org , offre funzionalità complete per qualsiasi repository GitHub pubblico . Non ci sono limiti al numero di build o repository, sebbene ci siano limiti di risorse imposti quando la pipeline è in esecuzione.

La versione a pagamento, che utilizza il nome di dominio .com , è richiesta per i repository GitHub privati. Offre anche più build simultanee e minuti di build illimitati rispetto al piano gratuito. C'è una prova gratuita per le prime 100 build per testare la versione a pagamento.

4. Creazione di una pipeline di build con Travis CI

Per questo tutorial, utilizzeremo la versione gratuita sopra menzionata. Qualsiasi repository pubblico può essere utilizzato per creare una pipeline gratuita.

Tutto quello che dobbiamo fare è accedere a Travis CI con il nostro account GitHub e autorizzarlo:

Dopo aver concesso le autorizzazioni al nostro account GitHub, siamo pronti per iniziare a configurare la nostra pipeline di build.

4.1. Configurazione del repository

Inizialmente, tutti i nostri archivi pubblici sono considerati inattivi. Per risolvere questo problema, dobbiamo abilitare il nostro repository dalla pagina delle impostazioni dell'account .

Questo elenca tutti i nostri repository pubblici, insieme a un pulsante di attivazione / disattivazione. Facendo clic sul pulsante di attivazione / disattivazione verrà configurato Travis CI per avviare il monitoraggio di tale repository per nuovi commit, utilizzando il ramo predefinito del master:

Nota che ogni repository ha anche un pulsante Impostazioni . Qui è dove possiamo configurare diversi comportamenti della pipeline:

  • Definisci quali eventi attivano la pipeline (push, pull request e così via)
  • Imposta le variabili di ambiente che vengono passate nella pipeline
  • Annullamento automatico delle build quando vengono attivati ​​nuovi eventi

Per questo tutorial, le impostazioni predefinite funzioneranno bene. Più avanti vedremo come sovrascrivere alcuni dei comportamenti predefiniti.

4.2. Creazione della configurazione di Travis

Il prossimo passo è creare un nuovo file chiamato .travis.yml nella directory principale del nostro repository. Questo file contiene tutte le informazioni necessarie per configurare una pipeline. Senza questo file, la pipeline non verrà eseguita .

Per questo tutorial dobbiamo solo includere la configurazione minima, che specifica il linguaggio di programmazione:

language: java

Questo è tutto! Senza fornire ulteriori informazioni, Travis CI eseguirà una semplice pipeline che:

  • Compila il nostro codice sorgente
  • Esegue i nostri test

Una volta eseguito il commit del file .travis.yml , Travis darà il via alla nostra prima build. Qualsiasi ulteriore commit sul ramo master attiverà build aggiuntive. Il dashboard ci consente inoltre di attivare manualmente la pipeline in qualsiasi momento senza richiedere una richiesta di commit o pull.

5. Configurazione aggiuntiva

Nella sezione precedente, abbiamo visto che una singola riga di configurazione è tutto ciò di cui abbiamo bisogno per eseguire la nostra pipeline di compilazione. Ma la maggior parte dei progetti richiederà una configurazione aggiuntiva per implementare una pipeline significativa.

Questa sezione delinea alcune delle configurazioni più utili che potremmo voler aggiungere alla nostra pipeline.

5.1. Modifica del comando di compilazione predefinito

Il comando predefinito utilizzato per creare progetti Maven è:

mvn test -B

Possiamo cambiarlo con qualsiasi comando impostando la direttiva script in .travis.yml :

script: mvn package -DskipTests

È possibile concatenare più comandi in una singola riga di script utilizzando l' operatore && .

Alcuni comandi di compilazione sono complessi e possono estendersi su più righe o avere una logica complessa. Ad esempio, possono eseguire azioni diverse in base alle variabili di ambiente.

In questi casi, si consiglia di inserire il comando build in uno script autonomo e chiamare lo script dall'interno del file di configurazione:

script: ./build.sh

5.2. Distribuzione del codice

Le impostazioni di compilazione predefinite per i progetti Java compilano semplicemente il codice ed eseguono i test. Gli artefatti risultanti (file .jar e così via) vengono eliminati alla fine della pipeline a meno che non vengano distribuiti da qualche parte.

Travis CI supporta una varietà di noti servizi di terze parti. Gli artefatti possono essere copiati su molti sistemi di archiviazione cloud popolari come Amazon S3, Google Cloud Storage, Bintray e altri.

Può anche distribuire il codice direttamente sulle piattaforme di cloud computing più popolari come AWS, Google App Engine, Heroku e molti altri.

Di seguito è riportato un esempio di configurazione che mostra come possiamo eseguire il deployment su Heroku. Per generare proprietà crittografate, dobbiamo utilizzare lo strumento Travis CLI.

deploy: provider: heroku api_key: secure: "ENCRYPTED_API_KEY"

Inoltre, fornisce un'opzione di distribuzione generica che ci consente di scrivere il nostro script di distribuzione. Ciò è utile se è necessario distribuire elementi su un sistema di terze parti che non è supportato in modo nativo.

Ad esempio, potremmo scrivere uno script di shell che copia in modo sicuro gli artefatti su un server FTP privato:

deploy: provider: script script: bash ./custom-deploy.sh

5.3. Gestione dei rami che attivano la pipeline

Per impostazione predefinita, la pipeline verrà eseguita per qualsiasi commit sul master . Tuttavia, la maggior parte dei progetti di grandi dimensioni utilizza una qualche forma di ramificazione git per gestire i cicli di sviluppo.

Travis CI supporta sia la lista bianca che quella nera dei rami git per determinare quali commit dovrebbero attivare la pipeline.

Ad esempio, considera la seguente configurazione:

branches: only: - release - stable except: - master - nightly

Questo ignorerebbe i commit sui rami master e nightly . L'impegno per il rilascio e i rami stabili attiveranno la pipeline. Notare che l' unica direttiva ha sempre la precedenza sulla direttiva eccetto .

Possiamo anche usare espressioni regolari per controllare quali rami attivano la pipeline:

branches: only: - /^development.*$/

Ciò avvierebbe la pipeline solo per i commit sui rami che iniziano con lo sviluppo .

5.4. Ignorare commit specifici

Possiamo usare il messaggio git commit per saltare i singoli commit . Travis CI esaminerà il messaggio per i seguenti modelli:

  • Salta
  • Salta

Dove si trova uno dei seguenti valori:

  • ci
  • travis
  • travis ci
  • travis-ci
  • travisci

Se il messaggio di commit corrisponde a uno di questi modelli, la pipeline non verrà eseguita.

5.5. Utilizzo di ambienti di costruzione diversi

L'ambiente di compilazione predefinito per i progetti Java è Ubuntu Linux. Le pipeline possono essere eseguite anche su Mac OSX o Windows Server aggiungendo la seguente configurazione in .travis.yml :

os: osx # can also be 'windows'

Anche con Linux, ci sono 3 diverse distribuzioni tra cui possiamo scegliere:

os: linux dist: xenial # other choices are 'trusty' or 'precise'

La documentazione della piattaforma di compilazione copre tutti gli ambienti disponibili e le loro differenze.

Ricorda solo che se cambiamo la piattaforma, potrebbe anche essere necessario modificare qualsiasi build personalizzata o distribuire script per garantire la compatibilità. Esistono diversi modi per gestire più sistemi operativi nella configurazione.

5.6. Utilizzo di versioni differenti di JDK

Possiamo anche testare su una versione specifica del JDK impostando la seguente configurazione nel file .travis.yml :

jdk: oraclejdk8

Tieni presente che diversi ambienti di compilazione, anche le diverse distribuzioni Linux, possono avere diverse versioni di JDK disponibili. Consulta la documentazione di ogni ambiente per visualizzare l'elenco completo delle versioni di JDK.

6. Crea matrici

Per impostazione predefinita, ogni volta che la nostra pipeline viene eseguita, viene eseguita come un singolo lavoro. Ciò significa che tutte le fasi della pipeline vengono eseguite in sequenza su una singola macchina virtuale con le stesse impostazioni.

Ma una delle grandi caratteristiche di Travis CI è la capacità di creare una matrice di build. Questo ci consente di eseguire più lavori per ogni commit, utilizzando valori diversi per alcune delle impostazioni che abbiamo visto in precedenza.

Ad esempio, possiamo utilizzare una matrice di compilazione per eseguire la nostra pipeline sia su Linux che su Mac OSX o con JDK 8 e 9.

Esistono due modi per creare matrici di compilazione . Innanzitutto, possiamo fornire una matrice di valori per una o più configurazioni di lingua e ambiente viste in precedenza. Per esempio:

language: java jdk: - openjdk8 - openjdk9 os: - linux - osx

Utilizzando questo approccio, Travis CI espanderà automaticamente ogni combinazione di configurazione per formare più lavori. Nell'esempio precedente, il risultato sarebbe quattro lavori totali.

Il secondo modo per creare una matrice di compilazione è utilizzare la direttiva matrix.include . Questo ci consente di dichiarare esplicitamente quali combinazioni vogliamo eseguire:

language: java matrix: include: - jdk: openjdk8 os: linux - jdk: openjdk9 os: osx

L'esempio sopra risulterebbe in due lavori.

Ancora una volta, se costruiamo su più sistemi operativi, dobbiamo stare attenti a garantire che i nostri script di build e distribuzione funzionino per tutti i casi. Gli script della shell non funzioneranno su Windows, ad esempio. Dobbiamo utilizzare istruzioni condizionali appropriate per gestire diversi sistemi operativi.

Sono disponibili più opzioni che forniscono un controllo più granulare sui lavori da creare e su come gestire gli errori.

7. Conclusione

In questo articolo, abbiamo creato una semplice pipeline di build utilizzando Travis CI. Utilizzando principalmente la configurazione predefinita, abbiamo creato una pipeline che crea codice ed esegue test.

Abbiamo anche visto un piccolo esempio di quanto sia configurabile Travis CI. Funziona con una varietà di linguaggi di programmazione e piattaforme cloud di terze parti. L'unico svantaggio è che attualmente funziona solo con i repository GitHub.