Intro to Jenkins 2 et la puissance des pipelines

Intro à Jenkins 2 et à la puissance des pipelines

1. Vue d'ensemble

Dans cet article, nous allons présenter l'utilisation des pipelines à travers un exemple de livraison continue utilisantJenkins.

Nous allons créer un pipeline simple mais très utile pour notre exemple de projet:

  • Compilation

  • Analyse statique simple (parallèle à la compilation)

  • Tests unitaires

  • Tests d'intégration (parallèles aux tests unitaires)

  • Déploiement

2. Configurer Jenkins

Tout d'abord, nous devons télécharger la dernière version stable deJenkins (2.73.3 au moment de la rédaction de cet article).

Navigons jusqu'au dossier où se trouve notre fichier et exécutons-le à l'aide de la commandejava -jar jenkins.war. Keep in mind that we can’t use Jenkins without an initial users setup.

Après avoir déverrouillé Jenkins en utilisant le mot de passe initial généré par l’administrateur, nous devons renseigner les informations de profil du premier utilisateur d’administrateur et veiller à installer tous les plug-in recommandés.

image

Nous avons maintenant une nouvelle installation de Jenkins prête à être utilisée.

image

Toutes les versions disponibles de Jenkins peuvent être trouvéeshere.

3. Pipelines

Jenkins 2 est livré avec une fonctionnalité intéressante appeléePipelines, qui est très extensible lorsque nous devons définir un environnement d'intégration continue pour un projet.

A Pipeline is another way of defining some Jenkins steps using code et automatiser le processus de déploiement du logiciel.

Il utilise unDomain Specific Language(DSL) avec deux syntaxes différentes:

  • Pipeline déclaratif

  • Pipeline scripté

Dans nos exemples, nous allons utiliserthe Scripted Pipeline which is following a more imperative programming model built with Groovy.

Passons en revue quelques caractéristiques du pluginPipeline:

  • les pipelines sont écrits dans un fichier texte et traités comme du code; cela signifie qu'ils peuvent être ajoutés au contrôle de version et modifiés ultérieurement

  • ils resteront après les redémarrages du serveur Jenkins

  • nous pouvons éventuellement mettre en pause les pipelines

  • ils supportent des exigences complexes telles que l'exécution de travaux en parallèle

  • le plugin Pipeline peut également être étendu ou intégré à d'autres plugins

En d'autres termes, configurer un projet Pipeline signifie écrire un script qui appliquera de manière séquentielle certaines étapes du processus que nous souhaitons accomplir.

To start using pipelines we have to install the Pipeline plugin qui permet de composer une automatisation simple et complexe.

Nous pouvons également avoir celui dePipeline Stage View afin que lorsque nous exécutons une compilation, nous voyons toutes les étapes que nous avons configurées.

4. Un exemple rapide

Pour notre exemple, nous utiliserons une petite application Spring Boot. Nous allons ensuite créer un pipeline qui clone le projet, le construit et exécute plusieurs tests, puis exécute l'application.

Installons les plugins*https://wiki.jenkins-ci.org/display/JENKINS/Checkstyle+Plugin[Checkstyle],*Static Analysis Collector etJUnit, qui sont respectivement utiles pour collecter les résultats deCheckstyle, construire un graphique d'analyse combiné des rapports de test et illustrer les tests exécutés avec succès et échoués .

Tout d'abord, comprenons la raison de Checkstyle ici: c'est un outil de développement qui aide les programmeurs à écrire un meilleur code Java en suivant des normes acceptées et bien connues.

Static Analysis Collector est un module complémentaire qui collecte différentes sorties d'analyse et les imprime dans un graphique de tendance combiné. En outre, le plug-in fournit des rapports sur l'état de fonctionnement et renforce la stabilité en fonction de ces résultats groupés.

Enfin, le pluginJUnit fournit un éditeur qui consomme les rapports de test XML générés lors des builds et produit des informations détaillées et significatives relatives aux tests d'un projet.

Nous allons également configurerCheckstyle dans lespom.xml: de notre application


    org.apache.maven.plugins
    maven-checkstyle-plugin
    2.17

5. Création d'un script de pipeline

Premièrement, nous devons créer un nouveau travail Jenkins. Veillons à sélectionnerPipeline comme type avant de cliquer sur le bouton OK comme décrit dans cette capture d'écran:

image

L'écran suivant nous permet de renseigner plus de détails sur les différentes étapes de notre travail Jenkins, telles que lesdescription,triggers, certainsadvanced project options:

image

Plongeons dans la partie principale et la plus importante de ce type de travail en cliquant sur l'ongletPipeline.

Ensuite, pour la définition sélectionnezPipeline script ** et cochezUse Groovy Sandbox.

Voici le script de travail pour un environnement Unix:

node {
    stage 'Clone the project'
    git 'https://github.com/eugenp/tutorials.git'

    dir('spring-jenkins-pipeline') {
        stage("Compilation and Analysis") {
            parallel 'Compilation': {
                sh "./mvnw clean install -DskipTests"
            }, 'Static Analysis': {
                stage("Checkstyle") {
                    sh "./mvnw checkstyle:checkstyle"

                    step([$class: 'CheckStylePublisher',
                      canRunOnFailed: true,
                      defaultEncoding: '',
                      healthy: '100',
                      pattern: '**/target/checkstyle-result.xml',
                      unHealthy: '90',
                      useStableBuildAsReference: true
                    ])
                }
            }
        }

        stage("Tests and Deployment") {
            parallel 'Unit tests': {
                stage("Runing unit tests") {
                    try {
                        sh "./mvnw test -Punit"
                    } catch(err) {
                        step([$class: 'JUnitResultArchiver', testResults:
                          '**/target/surefire-reports/TEST-*UnitTest.xml'])
                        throw err
                    }
                   step([$class: 'JUnitResultArchiver', testResults:
                     '**/target/surefire-reports/TEST-*UnitTest.xml'])
                }
            }, 'Integration tests': {
                stage("Runing integration tests") {
                    try {
                        sh "./mvnw test -Pintegration"
                    } catch(err) {
                        step([$class: 'JUnitResultArchiver', testResults:
                          '**/target/surefire-reports/TEST-'
                            + '*IntegrationTest.xml'])
                        throw err
                    }
                    step([$class: 'JUnitResultArchiver', testResults:
                      '**/target/surefire-reports/TEST-'
                        + '*IntegrationTest.xml'])
                }
            }

            stage("Staging") {
                sh "pid=\$(lsof -i:8989 -t); kill -TERM \$pid "
                  + "|| kill -KILL \$pid"
                withEnv(['JENKINS_NODE_COOKIE=dontkill']) {
                    sh 'nohup ./mvnw spring-boot:run -Dserver.port=8989 &'
                }
            }
        }
    }
}

Tout d'abord, nous clonons le dépôt à partir de GitHub, puis nous modifions le répertoire vers notre projet, appeléspring-jenkins-pipeline.

Ensuite, nous avons compilé le projet et appliqué l'analyse deCheckstyle de manière parallèle.

L'étape suivante représente une exécution en parallèle de tests unitaires et de tests d'intégration, puis du déploiement de l'application.

Parallelism is used to optimize the pipeline, and have the job runs faster. Il est recommandé dans Jenkins d'exécuter simultanément des actions indépendantes qui peuvent prendre beaucoup de temps.

Par exemple, dans un projet réel, nous avons généralement beaucoup de tests unitaires et d’intégration qui peuvent durer plus longtemps.

Notez que si un test échoue, BUILD sera également marqué comme FAILED et le déploiement n'aura pas lieu.

De plus, nous utilisonsJENKINS_NODE_COOKIE pour empêcher l'arrêt immédiat de notre application lorsque le pipeline atteint la fin.

Pour voir un script plus général fonctionnant sur d'autres systèmes différents, consultez lesGitHub repository.

6. Bulletin d'analyse

Après avoir créé la tâche, nous enregistrerons notre script et appuierons surBuild Now sur la page d'accueil du projet de notre tableau de bord Jenkins.

Voici un aperçu des versions:

image

Un peu plus bas, nous trouverons la vue de la scène du pipeline, avec le résultat de chaque étape:

image

Chaque sortie est accessible en survolant une cellule d'étape et en cliquant sur le boutonLogs pour voir les messages du journal imprimés à cette étape.

Nous pouvons également trouver plus de détails sur l'analyse de code. Cliquons sur la construction souhaitée à partir desBuild History dans le menu de droite et frapponsCheckstyle Warnings.

Nous voyons ici 60 avertissements de haute priorité pouvant être consultés en cliquant sur:

image

L'ongletDetails affiche des informations qui mettent en évidence les avertissements et permettent au développeur d'en comprendre les causes.

De la même manière, le rapport de test complet est accessible en cliquant sur le lienTest Result. Voyons les résultats du packagecom.example:

image

Ici, nous pouvons voir chaque fichier de test avec sa durée et son statut.

7. Conclusion

Dans cet article, nous avons configuré un environnement de livraison continue simple pour exécuter et afficher une analyse de code statique et un rapport de test dans Jenkins via une tâchePipeline.

Comme toujours, le code source de cet article peut être trouvéover on GitHub.