Ci sono stati momenti in cui creavamo job Jenkins utilizzando solo l’interfaccia utente. Successivamente, l’idea di pipeline come codice è stata proposta per affrontare la crescente complessità con i job di build e deployment. In Jenkins 2.0, il team di Jenkins ha introdotto Jenkinsfile per realizzare la pipeline come codice. Se vuoi creare una pipeline Jenkins automatizzata basata su pull request o su branch, la pipeline multibranch di Jenkins è la strada da percorrere.Integrazione Continua e Consegna Continua
Dato che la pipeline multibranch di Jenkins è completamente basata su git e come codice, puoi sviluppare i tuoi flussi di lavoro CI/CD. La Pipeline come Codice (PaaC) rende facile portare i vantaggi dell’automazione e della portabilità cloud ai tuoi test Selenium. Puoi utilizzare il modello di pipeline multibranch per costruire rapidamente e in modo affidabile, testare, distribuire, monitorare, segnalare e gestire i tuoi test Selenium, e molto altro ancora. In questo tutorial di Jenkins, daremo un’occhiata a come creare una pipeline multibranch di Jenkins e ai concetti chiave coinvolti nella configurazione di una pipeline multibranch di Jenkins per i test di automazione Selenium.
Iniziamo.
Che cos’è la Pipeline Multibranch di Jenkins?
Secondo la documentazione ufficiale, il tipo di job multibranch pipeline ti consente di definire un job da un singolo repository git, Jenkins rileverà più branch e creerà job nidificati quando trova un Jenkinsfile.
Dalla definizione sopra, possiamo capire che Jenkins può esaminare il repository Git per trovare il Jenkinsfile e creare job automaticamente. Tutto ciò di cui ha bisogno da parte nostra sono i dettagli del repository Git. In questo articolo, utilizzeremo un repository GitHub di esempio. Il nostro repository GitHub di esempio contiene un progetto Spring Boot di esempio, che può essere distribuito su Tomcat.
Nella directory root del progetto, abbiamo il Jenkinsfile. Abbiamo utilizzato la sintassi di pipeline dichiarativa di Jenkins per creare questo Jenkinsfile. Se siete nuovi alla pipeline dichiarativa di Jenkins, leggete il nostro articolo dettagliato qui.
Esempio di Jenkinsfile
pipeline {
agent any
stages {
stage('Build Code') {
steps {
sh """
echo "Building Artifact"
"""
}
}
stage('Deploy Code') {
steps {
sh """
echo "Deploying Code"
"""
}
}
}
}
Abbiamo creato due stage “Compila Codice” e “Distribuisci Codice” nel nostro Jenkinsfile, ciascuno di loro configurato per stampare messaggi appropriati. Ora, abbiamo pronto il repository Git con il Jenkinsfile.
Creiamo una pipeline multibranch in Jenkins server.
Pipeline di Jenkins vs Pipeline Multibranch
La pipeline di Jenkins è la novità più calda, ma non è per tutti. E le pipeline multibranch sono ancora fantastiche. In questa sezione del tutorial sulle pipeline multibranch di Jenkins, capiamo i casi d’uso ideali per la pipeline di Jenkins e le pipeline multibranch attraverso questa comparazione tra pipeline di Jenkins e pipeline multibranch.
Jenkins pipeline è un sistema di configurazione dei job che ti permette di configurare una pipeline di job, che verranno eseguiti automaticamente per conto tuo. Una pipeline Jenkins può avere più fasi e ogni fase verrà eseguita da un singolo agente, tutti in esecuzione su una singola macchina o su più macchine. Una pipeline viene normalmente creata per un ramo specifico di codice sorgente. Quando crei un nuovo job, vedrai un’opzione per selezionare il repository di codice sorgente e il ramo. Puoi anche creare una pipeline fresca per un nuovo progetto o una nuova funzionalità di un progetto esistente.
Jenkins pipeline ti consente di avere un Jenkinsfile flessibile con fasi per il tuo build. Quindi, puoi avere una fase iniziale in cui esegui linting, test, ecc., e poi fasi separate per la creazione di artefatti o il loro deployment. Questo è molto utile quando vuoi fare più cose nella tua pipeline.
E se hai solo una cosa da fare? O se tutte le cose che vuoi fare sono diverse a seconda di alcune configurazioni? Ha senso usare Jenkins pipeline qui?
La pipeline multibranch è un approccio alternativo che potrebbe essere più adatto in questi casi. La pipeline multibranch ti permette di suddividere i compiti in rami e integrarli successivamente. Questo è molto simile al modo in cui funziona il branching di Git.
A multibranch pipeline is a pipeline that has multiple branches. The main advantage of using a multibranch pipeline is to build and deploy multiple branches from a single repository. Having a multibranch pipeline also allows you to have different environments for different branches. However, it is not recommended to use a multibranch pipeline if you do not have a standard branching and CI/CD strategy.
Ora, visto che hai visto il confronto tra Jenkins pipeline e multibranch pipeline, passiamo attraverso i passaggi per creare una multibranch pipeline Jenkins.
Creare una Multibranch Pipeline Jenkins
Passo 1
Apri la home page di Jenkins (http://localhost:8080
in locale) e fai clic su “Nuovo Elemento” dal menu laterale a sinistra.
Passo 2
Inserisci nome del job Jenkins, scegli lo stile come “multibranch pipeline,” e clicca su “OK.”
Passo 3
Nella pagina “Configura”, abbiamo bisogno di configurare solo una cosa: la sorgente del repo Git.
Scorri fino alla sezione “Branch Sources” e clicca sul menu a discesa “Aggiungi Sorgente”.
Scegli “GitHub” come sorgente perché il nostro repo di esempio GitHub è ospitato lì.
Passo 4
Inserisci l’URL HTTPS del repository come https://github.com/iamvickyav/spring-boot-h2-war-tomcat.git
e clicca su “Convalida.”
Dato che il nostro repo GitHub è ospitato come repo pubblico, non abbiamo bisogno di configurare le credenziali per accedervi. Per repo aziendali/privati, potremmo aver bisogno di credenziali per accedervi.
Il messaggio “Credenziali ok” rappresenta il successo della connessione tra il server Jenkins e il repo Git.
Passo 5
Lascia le altre sezioni di configurazione così come sono per ora e clicca sul pulsante “Salva” in basso.
Salvando, Jenkins eseguirà automaticamente i seguenti passaggi:
Scansione del Repository Step
- Scansiona il repo Git che abbiamo configurato.
- Cerca l’elenco delle branch disponibili nel repo Git.
- Seleziona le branch che hanno Jenkinsfile.
Esecuzione del Build Step
- Esegui la build per ciascuna delle branch trovate nel passaggio precedente con i passaggi menzionati nel Jenkinsfile.
Dalla sezione “Scan Repository Log“, possiamo capire cosa è successo durante il passaggio di scansione del repository.
Poiché abbiamo solo una master branch nel nostro repo git, il Log di scansione del repository dice “1 branch è stato elaborato”.
Dopo che la scansione è completa, Jenkins creerà e eseguirà un job di build per ciascuna branch elaborata separatamente.
Nel nostro caso, abbiamo avuto solo una branch chiamata master. Pertanto, la build verrà eseguita solo per la nostra master branch. Possiamo verificare ciò facendo clic su “Status” nel menu laterale.
Possiamo vedere un job di build creato per la master branch nella sezione di stato.
Fai clic sul nome della branch per vedere il log e lo stato del job di build.
“Stage View” fornisce una rappresentazione visiva di quanto tempo ciascuno stage ha impiegato per eseguire e lo stato del job di build.
Accesso ai Log di Esecuzione del Job di Build
Step 1
Fai clic sul “Numero di build” nella sezione “Cronologia delle build”.
Step 2
Successivamente, scegli “Output della Console” dal menu laterale per vedere i log.
Cosa succede se abbiamo più di una branch nel nostro repo Git? Controlliamolo ora.
Nel repo Git, viene creata una nuova branch chiamata “develop“.
Per differenziare il build della “branch develop“, abbiamo apportato piccole modifiche nelle comandi echo nel Jenkinsfile.
Jenkinsfile nella Branch Master
pipeline {
agent any
stages {
stage('Build Code') {
steps {
sh """
echo "Building Artifact"
"""
}
}
stage('Deploy Code') {
steps {
sh """
echo "Deploying Code"
"""
}
}
}
}
Jenkinsfile nella Branch Develop
pipeline {
agent any
stages {
stage('Build Code') {
steps {
sh """
echo "Building Artifact from Develop Branch"
"""
}
}
stage('Deploy Code') {
steps {
sh """
echo "Deploying Code from Develop Branch"
"""
}
}
}
}
Ora, abbiamo due Jenkinsfile in due branch diversi. Ripetiamo la scansione del repository in Jenkins per osservare il comportamento.
Possiamo vedere che la nuova branch (branch develop) è stata rilevata da Jenkins. Di conseguenza, è stato creato un nuovo job separato per la branch develop.
Facendo clic su “develop“, possiamo vedere il log per il job di build della branch develop.
Nell’esempio precedente, abbiamo mantenuto contenuti diversi per Jenkinsfile nelle branch master e develop. Ma non è così che procediamo nelle applicazioni del mondo reale. Sfruttiamo i blocchi when all’interno del blocco stage per verificare la branch.
Ecco un esempio con passaggi combinati per le branch master e develop. Questo stesso contenuto sarà inserito in entrambi i Jenkinsfile delle branch master e develop.
pipeline {
agent any
stages {
stage('Master Branch Deploy Code') {
when {
branch 'master'
}
steps {
sh """
echo "Building Artifact from Master branch"
"""
sh """
echo "Deploying Code from Master branch"
"""
}
}
stage('Develop Branch Deploy Code') {
when {
branch 'develop'
}
steps {
sh """
echo "Building Artifact from Develop branch"
"""
sh """
echo "Deploying Code from Develop branch"
"""
}
}
}
}
Step 3
Fai clic su “Scan Repository” dalla barra laterale per consentire a Jenkins di rilevare le nuove modifiche dal repo Git.
A questo punto, potresti aver notato che utilizziamo la scansione del repository ogni volta che vogliamo che Jenkins rilevi le modifiche dal repo.
Che ne dici di automatizzare questo passaggio?
Trigger Periodico per la Scansione della Pipeline Multibranch di Jenkins
Step 1
Fai clic su “Configure” dalla barra laterale.
Step 2
Scorri verso il basso fino alla sezione “Attiva Triggers del Repository” e abilita la casella di controllo “Periodicamente se non eseguito diversamente” e scegli l’intervallo di tempo per l’esecuzione periodica dello scan (due minuti nel nostro esempio).
Passo 3
Clicca sul pulsante “Salva“.
Da ora in poi, Jenkins scannerà il repo ogni due minuti. Se viene trovato un nuovo commit in qualsiasi branch, Jenkins eseguirà un nuovo job di build per quel particolare branch utilizzando Jenkinsfile.
Di seguito è riportato il “Log dello Scan del Repository“, che mostra chiaramente lo scan attivato ogni due minuti.
Casi d’uso in tempo reale per il Pipeline Multibranch di Jenkins
Di seguito sono riportati alcuni scenari in cui il pipeline multibranch di Jenkins può risultare utile:
- Qualsiasi nuovo commit nel branch master deve essere distribuito automaticamente sul server.
- Se un sviluppatore tenta di aprire una Pull Request (PR) per sviluppare un branch, allora:
- Il codice deve essere compilato con successo senza errori di compilazione.
- Il codice deve avere almeno una copertura dei test del 80%.
- Il codice deve superare il test di qualità del codice SONAR.
- Se gli sviluppatori tentano di inserire il codice in un branch diverso da master o develop, il codice deve compilarsi con successo. In caso contrario, inviare una email di allarme.
Ecco un esempio di Jenkinsfile che copre alcuni dei casi d’uso sopra menzionati:
pipeline {
agent any
tools {
maven 'MAVEN_PATH'
jdk 'jdk8'
}
stages {
stage("Tools initialization") {
steps {
sh "mvn --version"
sh "java -version"
}
}
stage("Checkout Code") {
steps {
checkout scm
}
}
stage("Check Code Health") {
when {
not {
anyOf {
branch 'master';
branch 'develop'
}
}
}
steps {
sh "mvn clean compile"
}
}
stage("Run Test cases") {
when {
branch 'develop';
}
steps {
sh "mvn clean test"
}
}
stage("Check Code coverage") {
when {
branch 'develop'
}
steps {
jacoco(
execPattern: '**/target/**.exec',
classPattern: '**/target/classes',
sourcePattern: '**/src',
inclusionPattern: 'com/iamvickyav/**',
changeBuildStatus: true,
minimumInstructionCoverage: '30',
maximumInstructionCoverage: '80')
}
}
stage("Build and Deploy Code") {
when {
branch 'master'
}
steps {
sh "mvn tomcat7:deploy"
}
}
}
}
Abbiamo inserito questa nuova Jenkinsfile nelle branch master e develop, in modo che possa essere rilevata dalla Jenkins multibranch nella prossima scansione del repository.
Test di Automazione Selenium con Pipeline Multibranch Jenkins
Consideriamo che stiamo scrivendo casi di test di automazione per un sito web. Ogni volta che un nuovo caso di test viene commesso in una branch, vogliamo eseguirli e assicurarci che vengano eseguiti come previsto.
Eseguire casi di test di automazione su ogni combinazione di browser e sistema operativo è un incubo per qualsiasi sviluppatore. È qui che può risultare utile l’infrastruttura potente di test di automazione di LambdaTest.
Utilizzando la griglia Selenium di LambdaTest, puoi massimizzare la copertura dei browser.
In questa sezione, vedremo come sfruttare l’infrastruttura di test di LambdaTest con la pipeline multibranch Jenkins. Per dimostrare, abbiamo ospitato un semplice app Todo qui—App Todo LambdaTest. I casi di test di automazione scritti con Cucumber sono commessi nel repo campione.
Da Jenkins, vogliamo eseguire questi casi di test nella piattaforma LambdaTest. Eseguire casi di test su LambdaTest richiede nome utente e accessToken. Registrati gratuitamente con la piattaforma LambdaTest per ottenere le tue credenziali.
Configurazione della Variabile di Ambiente
Quando il caso di test viene eseguito, cercherà il nome utente di LambdaTest (LT_USERNAME
) e la password (LT_ACCESS_KEY
) nelle variabili di ambiente. Quindi, dobbiamo configurarli in anticipo.
Per evitare di memorizzarli con il codice sorgente, li abbiamo configurati come segreti in Jenkins e caricato le variabili di ambiente da loro:
environment {
LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
LT_USERNAME = "$LAMBDATEST_CRED_USR"
LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
}
Ecco la nostra Jenkinsfile finale:
pipeline {
agent any
tools {
maven 'MAVEN_PATH'
jdk 'jdk8'
}
stages {
stage("Tools initialization") {
steps {
sh "mvn --version"
sh "java -version"
}
}
stage("Checkout Code") {
steps {
checkout scm
}
}
stage("Check Code Health") {
when {
not {
anyOf {
branch 'master';
branch 'develop'
}
}
}
steps {
sh "mvn clean compile"
}
}
stage("Run Test cases in LambdaTest") {
when {
branch 'develop';
}
environment {
LAMBDATEST_CRED = credentials('Lambda-Test-Credentials-For-multibranch')
LT_USERNAME = "$LAMBDATEST_CRED_USR"
LT_ACCESS_KEY = "$LAMBDATEST_CRED_PSW"
}
steps {
sh "mvn test"
}
}
}
}
Ora, creeremo un nuovo “Lavoro” in Jenkins come pipeline multibranch seguendo i passaggi menzionati nelle sezioni precedenti. Indichiamo il repository di esempio.
Una volta che il build viene eseguito con successo, visita il dashboard di automazione di LambdaTest per ottenere i log dei test.
Conclusione
Con questo, abbiamo imparato come creare una pipeline multibranch in Jenkins, come configurare un repository git, diversi passaggi di build per diverse branch, utilizzando la scansione automatica periodica del repository da parte di Jenkins e sfruttando la potente infrastruttura di test di automazione di LambdaTest per automatizzare i nostri build CI/CD. Spero che questo articolo ti sia stato utile. Condividi il tuo feedback nella sezione dei commenti.
Source:
https://dzone.com/articles/how-to-create-jenkins-multibranch-pipeline