Cos'è Jenkins? Il server CI ha spiegato

Jenkins offre un modo semplice per configurare un ambiente di integrazione continua o distribuzione continua (CI / CD) per quasi tutte le combinazioni di linguaggi e repository di codice sorgente utilizzando pipeline, oltre ad automatizzare altre attività di sviluppo di routine. Sebbene Jenkins non elimini la necessità di creare script per i singoli passaggi, offre un modo più veloce e più robusto per integrare l'intera catena di strumenti di build, test e distribuzione di quanto tu possa facilmente costruire da solo.

"Non rompere la build notturna!" è una regola cardinale nei negozi di sviluppo software che pubblicano ogni mattina una versione del prodotto appena creata per i loro tester. Prima di Jenkins, il meglio che uno sviluppatore poteva fare per evitare di rompere la build notturna era compilare e testare attentamente e con successo su una macchina locale prima di eseguire il commit del codice. Ma ciò significava testare i propri cambiamenti isolatamente, senza gli impegni quotidiani di tutti gli altri. Non c'era alcuna garanzia assoluta che la build notturna sarebbe sopravvissuta al proprio impegno.

Jenkins - originariamente Hudson - fu una risposta diretta a questa limitazione.

Hudson e Jenkins

Nel 2004, Kohsuke Kawaguchi era uno sviluppatore Java presso Sun. Kawaguchi si era stancato di rompere le build nel suo lavoro di sviluppo e voleva trovare un modo per sapere, prima di inviare il codice al repository, se il codice avrebbe funzionato. Quindi Kawaguchi ha costruito un server di automazione in e per Java per renderlo possibile, chiamato Hudson. Hudson è diventato popolare in Sun e si è diffuso ad altre società come open source.

Andando avanti velocemente fino al 2011, una controversia tra Oracle (che aveva acquisito Sun) e la comunità open source indipendente di Hudson ha portato a un fork con un cambio di nome, Jenkins. Nel 2014 Kawaguchi è diventata CTO di CloudBees, che offre prodotti di consegna continua basati su Jenkins.

Entrambe le forcelle continuarono ad esistere, sebbene Jenkins fosse molto più attivo. Oggi il progetto Jenkins è ancora attivo. Il sito web di Hudson è stato chiuso il 31 gennaio 2020.

Nel marzo 2019 la Linux Foundation, insieme a CloudBees, Google e una serie di altre società, ha lanciato una nuova fondazione software open source chiamata Continuous Delivery Foundation (CDF). I collaboratori di Jenkins hanno deciso che il loro progetto dovrebbe unirsi a questa nuova fondazione. Kawaguchi ha scritto all'epoca che nulla di significativo sarebbe cambiato per gli utenti.

Nel gennaio 2020 Kawaguchi ha annunciato che si sarebbe trasferito nella sua nuova startup, Launchable. Ha anche affermato che si sarebbe ufficialmente ritirato da Jenkins, pur rimanendo nel Comitato di supervisione tecnica della Continuous Delivery Foundation, e trasferendo il suo ruolo in CloudBees a un consulente.

Video correlato: come distribuire il codice più velocemente con CI / CD

Automazione Jenkins

Oggi Jenkins è il principale server di automazione open source con circa 1.600 plug-in per supportare l'automazione di tutti i tipi di attività di sviluppo. Il problema che Kawaguchi stava originariamente cercando di risolvere, l'integrazione continua e la fornitura continua di codice Java (ad es. Costruzione di progetti, esecuzione di test, analisi statica del codice e distribuzione) è solo uno dei molti processi che le persone automatizzano con Jenkins. Questi 1.600 plug-in coprono cinque aree: piattaforme, interfaccia utente, amministrazione, gestione del codice sorgente e, più frequentemente, gestione delle build.

Come funziona Jenkins

Jenkins è distribuito come archivio WAR e come pacchetti di installazione per i principali sistemi operativi, come pacchetto Homebrew, come immagine Docker e come codice sorgente. Il codice sorgente è principalmente Java, con alcuni file Groovy, Ruby e Antlr.

È possibile eseguire Jenkins WAR in modalità autonoma o come servlet in un server di applicazioni Java come Tomcat. In entrambi i casi, produce un'interfaccia utente Web e accetta chiamate alla sua API REST.

Quando esegui Jenkins per la prima volta, crea un utente amministrativo con una lunga password casuale, che puoi incollare nella sua pagina web iniziale per sbloccare l'installazione.

Plug-in di Jenkins

Una volta installato, Jenkins ti consente di accettare l'elenco di plug-in predefinito o di scegliere i tuoi plug-in.

Dopo aver scelto il set iniziale di plug-in, fare clic sul pulsante Installa e Jenkins li aggiungerà.

La schermata principale di Jenkins mostra la coda di compilazione corrente e lo stato dell'esecutore e offre collegamenti per creare nuovi elementi (lavori), gestire gli utenti, visualizzare le cronologie delle build, gestire Jenkins, esaminare le visualizzazioni personalizzate e gestire le proprie credenziali.

Un nuovo elemento Jenkins può essere uno dei sei tipi di lavoro più una cartella per organizzare gli elementi.

Ci sono 18 cose che puoi fare dalla pagina Gestisci Jenkins, inclusa l'opzione per aprire un'interfaccia della riga di comando. A questo punto, tuttavia, dovremmo esaminare le pipeline, che sono flussi di lavoro avanzati generalmente definiti da script.

Condutture di Jenkins

Dopo aver configurato Jenkins, è il momento di creare alcuni progetti che Jenkins può creare per te. Sebbene sia possibile utilizzare l'interfaccia utente Web per creare script, la best practice corrente consiste nel creare uno script pipeline, denominato Jenkinsfile , e archiviarlo nel repository. Lo screenshot seguente mostra il modulo Web di configurazione per una pipeline multibranch.

Come puoi vedere, le sorgenti di branch per questo tipo di pipeline nella mia installazione di base di Jenkins possono essere i repository Git o Subversion, incluso GitHub. Se hai bisogno di altri tipi di repository o di diversi servizi di repository online, è solo questione di aggiungere i plug-in appropriati e riavviare Jenkins. Ho provato, ma non riuscivo a pensare a un sistema di gestione del codice sorgente (SCM) che non avesse già un plug-in Jenkins elencato.

Le pipeline di Jenkins possono essere dichiarative o con script. Una pipeline dichiarativa , la più semplice delle due, utilizza la sintassi compatibile con Groovy e, se lo desideri, puoi avviare il file con #!groovyper indirizzare il tuo editor di codice nella giusta direzione. Una pipeline dichiarativa inizia con un pipelineblocco, definisce un agente definisce stagesche include eseguibile steps, come nell'esempio in tre fasi di seguito.

tubatura {

    agente qualsiasi

    fasi {

        stage ('Build') {

            passaggi {

                echo "Building .."

            }

        }

        stage ('Test') {

            passaggi {

                echo "Testing .."

            }

        }

        stage ('Deploy') {

            passaggi {

                echo "Distribuzione in corso ..."

            }

        }

    }

}

pipelineè il blocco esterno obbligatorio per richiamare il plug-in della pipeline di Jenkins. agentdefinisce dove si desidera eseguire la pipeline. anydice di utilizzare qualsiasi agente disponibile per eseguire la pipeline o lo stage. Un agente più specifico potrebbe dichiarare un contenitore da utilizzare, ad esempio:

agente {

    docker {

        immagine 'maven: 3-alpine'

        etichetta "etichetta-mia-definita"

        args '-v / tmp: / tmp'

    }

}

stagescontenere una sequenza di una o più direttive di fase. Nell'esempio precedente, le tre fasi sono Build, Test e Deploy.

stepsfare il lavoro vero e proprio. Nell'esempio sopra i passaggi hanno appena stampato i messaggi. Un passaggio di creazione più utile potrebbe essere simile al seguente:

tubatura {

    agente qualsiasi

    fasi {

        stage ('Build') {

            passaggi {

                sh 'fare'

                archiveArtifacts artifacts: '** / target / *. jar', fingerprint: true

            }

        }

    }

}

Qui stiamo invocando makeda una shell e quindi archiviando qualsiasi file JAR prodotto nell'archivio Jenkins.

La postsezione definisce le azioni che verranno eseguite alla fine dell'esecuzione o della fase della pipeline. È possibile utilizzare una serie di post-condizione blocchi all'interno della sezione di post: always, changed, failure, success, unstable, e aborted.

Ad esempio, il file Jenkins di seguito esegue sempre JUnit dopo la fase di test, ma invia un'e-mail solo se la pipeline non riesce.

tubatura {

    agente qualsiasi

    fasi {

        stage ('Test') {

            passaggi {

                sh 'fare il controllo'

            }

        }

    }

    post {

        sempre {

            junit "** / target / *. xml"

        }

        fallimento {

            inviare una mail a: [email protected], oggetto: "The Pipeline failed :("

        }

    }

}

La pipeline dichiarativa può esprimere la maggior parte di ciò che è necessario per definire le pipeline ed è molto più facile da apprendere rispetto alla sintassi della pipeline con script, che è un DSL basato su Groovy. La pipeline con script è in effetti un ambiente di programmazione completo.

Per confronto, i seguenti due file Jenkins sono completamente equivalenti.

Pipeline dichiarativa

tubatura {

    agent {docker 'node: 6.3'}

    fasi {

        stage ('build') {

            passaggi {

                sh 'npm —version'

            }

        }

    }

Pipeline con script

node ('docker') {

    checkout scm

    stage ('Build') {

        docker.image ('node: 6.3'). inside {

            sh 'npm —version'

        }

    }

}

Blue Ocean, la GUI di Jenkins

Se desideri la più recente e migliore interfaccia utente di Jenkins, puoi utilizzare il plug-in Blue Ocean, che fornisce un'esperienza utente grafica. È possibile aggiungere il plug-in Blue Ocean all'installazione Jenkins esistente o eseguire un container Docker Jenkins / Blue Ocean. Con Blue Ocean installato, il menu principale di Jenkins avrà un'icona in più:

Puoi aprire Blue Ocean direttamente se lo desideri. Si trova nella cartella / blue sul server Jenkins. La creazione della pipeline in Blue Ocean è un po 'più grafica rispetto alla semplice Jenkins:

Jenkins Docker

Come accennato in precedenza, Jenkins è distribuito anche come immagine Docker. Non c'è molto altro da fare: una volta scelto il tipo SCM, fornisci un URL e le credenziali, quindi crei una pipeline da un singolo repository o scansiona tutti i repository nell'organizzazione. Ogni ramo con un Jenkinsfile riceverà una pipeline.

Qui sto eseguendo un'immagine Docker Blue Ocean, fornita con alcuni plug-in del servizio Git in più installati rispetto all'elenco predefinito di provider SCM:

Dopo aver eseguito alcune pipeline, il plug-in Blue Ocean visualizzerà il loro stato, come mostrato sopra. Puoi ingrandire una singola pipeline per visualizzare le fasi e i passaggi:

Puoi anche ingrandire i rami (in alto) e le attività (in basso):  

-

Perché usare Jenkins?

Il plug-in Jenkins Pipeline che abbiamo utilizzato supporta un caso d'uso generale di integrazione continua / consegna continua (CICD), che è probabilmente l'uso più comune per Jenkins. Ci sono considerazioni specialistiche per alcuni altri casi d'uso.

I progetti Java erano la ragion d'essere originale di Jenkins. Abbiamo già visto che Jenkins supporta la costruzione con Maven; funziona anche con Ant, Gradle, JUnit, Nexus e Artifactory.

Android esegue una sorta di Java, ma introduce il problema di come testare sulla vasta gamma di dispositivi Android. Il plug-in dell'emulatore Android ti consente di creare e testare su tutti i dispositivi emulati che desideri definire. Il plug-in Publisher di Google Play ti consente di inviare build a un canale alfa in Google Play per il rilascio o ulteriori test sui dispositivi effettivi.

Ho mostrato esempi in cui abbiamo specificato un container Docker come agente per una pipeline e in cui abbiamo eseguito Jenkins e Blue Ocean in un container Docker. I contenitori Docker sono molto utili in un ambiente Jenkins per migliorare la velocità, la scalabilità e la coerenza.

Esistono due casi d'uso principali per Jenkins e GitHub. Uno è l'integrazione della build, che può includere un hook di servizio per attivare Jenkins su ogni commit nel tuo repository GitHub. Il secondo è l'uso dell'autenticazione GitHub per controllare l'accesso a Jenkins tramite OAuth.

Jenkins supporta molti altri linguaggi oltre a Java. Per C / C ++, sono disponibili plug-in per acquisire errori e avvisi dalla console, generare script di build con CMake, eseguire unit test ed eseguire analisi statiche del codice. Jenkins ha una serie di integrazioni con strumenti PHP.

Sebbene non sia necessario creare codice Python (a meno che non si utilizzi Cython, ad esempio, o si crei una ruota Python per l'installazione) è utile che Jenkins si integri con gli strumenti di test e report Python, come Nose2 e Pytest, e la qualità del codice strumenti come Pylint. Allo stesso modo, Jenkins si integra con strumenti Ruby come Rake, Cucumber, Brakeman e CI :: Reporter.

Jenkins per CI / CD

Nel complesso, Jenkins offre un modo semplice per configurare un ambiente CI / CD per praticamente qualsiasi combinazione di linguaggi e repository di codice sorgente utilizzando pipeline, oltre ad automatizzare una serie di altre attività di sviluppo di routine. Sebbene Jenkins non elimini la necessità di creare script per i singoli passaggi, offre un modo più rapido e affidabile per integrare l'intera catena di strumenti di creazione, test e distribuzione di quanto potresti facilmente costruire da solo.