Comment puis-je tester une modification apscope à Jenkinsfile localement?

Lors de l’écriture des pipelines jenkins, il semble très incommode de commettre chaque nouvelle modification pour voir si cela fonctionne.

Est-il possible de les exécuter localement sans avoir à valider le code?

    Vous ne pouvez pas exécuter le script Pipeline localement, car son objective est de créer un script Jenkins. (C’est une des raisons pour lesquelles il est préférable de garder votre Jenkinsfile court et limité au code qui traite réellement des fonctionnalités de Jenkins; votre logique de construction doit être gérée avec des processus externes ou des outils de construction .)

    Si vous voulez tester un changement de Jenkinsfile direct mais sans le Jenkinsfile , utilisez la fonctionnalité Replay ajoutée au 1.14.

    JENKINS-33925 effectue le suivi des besoins pour un cadre de test automatisé.

    TL; DR
    Cadre de test Jenkins Pipeline Unit

    Version longue
    Le test Jenkins Pipeline devient de plus en plus douloureux. Contrairement à l’approche classique de configuration de travail déclaratif, où l’utilisateur était limité à l’interface utilisateur exposée, le nouveau Pipeline Jenkins est un langage de programmation complet pour le processus de construction où vous mélangez la partie déclarative avec votre propre code. En tant que bons développeurs, nous voulons également avoir des tests unitaires pour ce type de code.

    Vous devez suivre trois étapes pour développer les pipelines Jenkins. L’ étape 1. devrait couvrir 80% des cas d’utilisation.

    1. Faites autant que possible dans les scripts de compilation (par exemple, Maven, Gradle, Gulp, etc.). Ensuite, dans votre pipeline, les scripts appellent simplement les tâches de génération dans le bon ordre. Le pipeline de construction orchestre et exécute simplement les tâches de génération, mais aucune logique majeure ne nécessite un test spécial.
    2. Si la règle précédente ne peut pas être entièrement appliquée, passez aux bibliothèques Pipeline Shared où vous pouvez développer et tester la logique personnalisée et les intégrer dans le pipeline.
    3. Si tout ce qui précède vous échoue, vous pouvez essayer l’une de ces bibliothèques récemment apparues (mars 2017). Framework de test ou pipelineUnit de Jenkins Pipeline Unit (exemples)

    Exemples

    Le référentiel pipelineUnit GitHub contient des exemples de Spock sur la façon d’utiliser le framework de test Jenkins Pipeline Unit

    J’ai une solution qui fonctionne bien pour moi. Il se compose d’un jenkins local fonctionnant dans docker et d’un hook web git pour déclencher le pipeline dans les jenkins locaux à chaque validation. Vous n’avez plus besoin de pousser vers votre référentiel github ou bitbucket pour tester le pipeline.

    Cela n’a été testé que dans un environnement Linux.

    Il est assez simple de faire ce travail bien que cette instruction soit un peu longue. La plupart des étapes sont là.

    C’est ce dont vous avez besoin

    • Docker installé et fonctionnel. Cela ne fait pas partie de cette instruction.
    • Un Jenkins s’exécutant dans Docker localement. Expliqué ci-dessous.
      • Les droits appropriés (clé d’access ssh) que votre utilisateur de docker Jenkins local peut extraire de votre repository git local. Expliqué ci-dessous.
      • Un projet de pipeline Jenkins qui tire de votre référentiel git local. Expliqué ci-dessous.
      • Un utilisateur git dans votre Jenkins local avec un minimum de droits. Expliqué ci-dessous.
    • Un projet git avec un hook Web post-commit qui déclenche le projet de pipeline. Expliqué ci-dessous.

    Voici comment tu le fais

    Jenkins Docker

    Créez un fichier appelé Dockerfile à la place de votre choix. Je le place dans /opt/docker/jenkins/Dockerfile avec ceci:

     FROM jenkins/jenkins:lts USER root RUN apt-get -y update && apt-get -y upgrade # Your needed installations goes here USER jenkins 

    Construisez l’image local_jenkins

    Cela vous devrez faire une seule fois ou après avoir ajouté quelque chose au fichier Docker.

     $ docker build -t local_jenkins /opt/docker/jenkins/Dockerfile 

    Démarrer et redémarrer local_jenkins

    De temps en temps, vous voulez démarrer et redémarrer facilement jenkins. Par exemple après un redémarrage de votre machine. Pour cela, j’ai créé un alias que j’ai mis dans .bash_aliases dans mon dossier personnel.

     $ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases $ source .bash_aliases # To make it work 

    Assurez-vous que le dossier /opt/docker/jenkins/jenkins_home existe et que vous avez des droits en lecture et en écriture.

    Pour démarrer ou redémarrer vos jenkins, tapez simplement:

     $ localjenkinsrestart 

    Tout ce que vous faites dans vos jenkins locaux sera stocké dans le dossier / opt / docker / jenkins / jenkins_home et conservé entre les redémarrages.

    Créez une clé d’access ssh dans votre docker jenkins

    Ceci est une partie très importante pour que cela fonctionne. Nous commençons par démarrer le conteneur docker et créons un shell bash:

     $ localjenkinsrestart $ docker exec -it jenkins /bin/bash 

    Vous êtes maintenant entré dans le conteneur jenkins@e7b23bad10aa:/$ , ce que vous pouvez voir par quelque chose comme jenkins@e7b23bad10aa:/$ dans votre terminal. Le hash après le @ sera à coup sûr différent.

    Créer la clé

     jenkins@e7b23bad10aa:/$ ssh-keygen 

    Appuyez sur Entrée pour toutes les questions jusqu’à ce que vous obteniez le message

    Copiez la clé sur votre ordinateur. À partir du conteneur Docker, votre ordinateur est 172.17.0.1 si vous vous posez la question.

     jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1 

    user = votre nom d’utilisateur et 172.17.0.1 est l’adresse IP de votre ordinateur depuis le conteneur docker.

    Vous devrez taper votre mot de passe à ce stade.

    Essayons maintenant de terminer la boucle en ssh-ting sur votre ordinateur depuis le conteneur docker.

     jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1 

    Cette fois, vous ne devriez pas avoir à entrer votre mot de passe. Si vous le faites, quelque chose a mal tourné et vous devez réessayer.

    Vous allez maintenant être dans le dossier d’accueil de votre ordinateur. Essayez ls et regardez.

    Ne vous arrêtez pas ici car nous avons une chaîne de shells SSH dont nous devons nous sortir.

     $ exit jenkins@e7b23bad10aa:/$ exit 

    Droite! Maintenant nous sums de retour et prêts à continuer.

    Installez votre Jenkins

    Vous trouverez votre Jenkins local dans votre navigateur à l’ adresse http: // localhost: 8787 .

    La première fois que vous dirigez votre navigateur vers votre Jenkins local, vous serez équipé d’un assistant d’installation. Les valeurs par défaut sont correctes, mais assurez-vous d’installer le plug-in de pipeline pendant l’installation.

    Configurez vos jenkins

    Il est très important d’activer la sécurité basée sur la masortingce sur http: // localhost: 8787 / configureSecurity et de vous donner tous les droits en vous ajoutant à la masortingce et en cochant toutes les cases. (Il y a une icône de toutes les cases à cocher à l’extrême droite)

    • Sélectionnez Jenkins' own user database de Jenkins' own user database comme domaine de sécurité
    • Sélectionnez Masortingx-based security sur Masortingx-based security dans la section Autorisation
    • Ecrivez votre nom d’utilisateur dans le champ User/group to add: et cliquez sur le bouton [ Add ]
    • Dans le tableau ci-dessus, votre nom d’utilisateur doit apparaître avec une icône représentant des personnes. S’il est croisé, vous avez saisi votre nom d’utilisateur de manière incorrecte.
    • Allez à l’extrême droite du tableau et cliquez sur le bouton à cocher ou cochez manuellement toutes les cases de votre ligne.
    • Veuillez vérifier que la case à cocher Prevent Cross Site Request Forgery exploits est désactivée. (Puisque Jenkins n’est accessible que depuis votre ordinateur, ce n’est pas grave)
    • Cliquez sur [ Save ] et déconnectez-vous de Jenkins pour vous assurer que cela fonctionne. Si ce n’est pas le cas, vous devez recommencer depuis le début et vider le dossier /opt/docker/jenkins/jenkins_home avant de redémarrer

    Ajouter l’utilisateur git

    Nous devons permettre à notre hook git de se connecter à notre Jenkins local avec un minimum de droits. Il suffit de voir et de créer des emplois. Par conséquent, nous créons un utilisateur appelé git avec un mot de passe de login .

    Dirigez votre navigateur vers http: // localhost: 8787 / securityRealm / addUser et ajoutez git comme nom d’utilisateur et login comme mot de passe. Cliquez sur [ Create User ] .

    Ajouter les droits à l’utilisateur git

    Accédez à la page http: // localhost: 8787 / configureSecurity de votre navigateur. Ajoutez l’utilisateur git à la masortingce:

    • Ecrivez git dans le champ User/group to add: et cliquez sur [ Add ]

    Maintenant, il est temps de cocher les cases pour les droits minimaux à l’utilisateur git. Seuls ceux-ci sont nécessaires:

    • dans l’ensemble: lire
    • job: construire
    • job: découvrir
    • job: lire

    Assurez-vous que la case à cocher Prevent Cross Site Request Forgery exploits la Prevent Cross Site Request Forgery exploits est désactivée et cliquez sur [ Save ]

    Créer le projet de pipeline

    Nous supposons que nous avons le nom user utilisateur user et que notre projet activé par git avec le Jenkinsfile dans ce Jenkinsfile s’appelle project et se trouve dans /home/user/projects/project

    Dans votre http: // localhost: 8787, Jenkins ajoute un nouveau projet de pipeline. Je l’ai nommé crochetpipeline pour référence.

    • Cliquez sur New Item dans le menu Jenkins
    • Nommez la ligne de passe du projet
    • Cliquez sur Pipeline
    • Cliquez sur [ OK ]
    • Cochez la case Poll SCM dans la section Build Triggers. Laissez l’horaire vide.
    • Dans la section Pipeline:
      • sélectionnez le Pipeline script from SCM
      • Dans le champ Repository URL du Repository URL , entrez user@172.17.0.1:projects/project/.git
      • dans le champ Script Path , entrez Jenkinsfile
    • Enregistrez le projet de ligne de connexion
    • Construisez le hookpipeline manuellement une fois, ceci est nécessaire pour que le Poll SCM fonctionne.

    Créez le hook git

    Allez dans le dossier /home/user/projects/project/.git/hooks et créez un fichier appelé post-commit qui contient:

     #!/bin/sh BRANCHNAME=$(git rev-parse --abbrev-ref HEAD) MASTERBRANCH='master' curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build echo "Build sortingggered successfully on branch: $BRANCHNAME" 

    Rendre ce fichier exécutable:

     $ chmod +x /home/user/projects/project/.git/hooks/post-commit 

    Testez le hook post-commit:

     $ /home/user/projects/project/.git/hooks/post-commit 

    Vérifiez dans Jenkins si votre projet de ligne de connexion a été déclenché.

    Enfin, apportez des modifications arbitraires à votre projet, ajoutez les modifications et faites un commit. Cela va maintenant déclencher le pipeline dans votre Jenkins local.

    Jours heureux!

    Au moment de l’écriture (fin juillet 2017) avec le plugin Blue Ocean, vous pouvez vérifier la syntaxe d’un pipeline déclaratif directement dans l’ éditeur de pipeline visuel . L’éditeur fonctionne à partir de l’interface utilisateur de Blue Ocean lorsque vous cliquez sur “configurer” uniquement pour les projets github (il s’agit d’un problème connu et ils travaillent à le faire fonctionner également sur git, etc.).

    Mais, comme expliqué dans cette question, vous pouvez ouvrir l’éditeur en parcourant:

    [Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

    Cliquez ensuite au milieu de la page et appuyez sur Ctrl+S , cela ouvrira une zone de texte où vous pourrez coller un script déclaratif de pipeline. Lorsque vous cliquez sur Update , s’il y a une erreur de syntaxe, l’éditeur vous indiquera où se trouve l’erreur de syntaxe. Comme dans cette capture d’écran:

    Comme un test rapide j'ai mal typé

    S’il n’y a pas d’erreur de syntaxe, la zone de texte se ferme et la page visualise votre pipeline. Ne vous inquiétez pas, cela ne sauvera rien (si c’est un projet github, il commettrait le changement de Jenkins).

    Je suis nouveau sur Jenkins et c’est très utile, sans cela je devais commettre un fichier Jenkins plusieurs fois, jusqu’à ce que ça marche (très ennuyeux!). J’espère que cela t’aides. À votre santé.

    Pour autant que je sache, ce plugin Pipeline est le “moteur” du nouveau mécanisme Jenkinsfile, donc très positif, vous pouvez l’utiliser pour tester localement vos scripts.

    Je ne suis pas sûr que des étapes supplémentaires soient nécessaires lorsque vous le copiez dans un fichier Jenkins, mais la syntaxe, etc. devrait être exactement la même.

    Edit: Trouvé la référence sur le “moteur”, cochez cette description de fonctionnalité, dernier paragraphe, première entrée.

    Jenkins possède une fonctionnalité «Replay» qui vous permet de relire rapidement un travail sans mettre à jour les sources:

    Fonctionnalité de relecture

    Dans ma configuration de développement – il manque un éditeur Groovy approprié – une grande partie des problèmes liés à Jenkinsfile proviennent de simples erreurs de syntaxe . Pour résoudre ce problème, vous pouvez valider le fichier Jenkins sur votre instance Jenkins (exécutée à $JENKINS_HTTP_URL ):

    curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=

    La commande ci-dessus est une version légèrement modifiée de https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line

    Un peu tard pour la fête, mais c’est pourquoi j’ai écrit jenny , une petite réimplémentation de certaines étapes de base de Jenkins. ( https://github.com/bmustiata/jenny )

    Mis à part la fonctionnalité Replay que d’autres ont déjà mentionnée (ce qui est utile), j’ai trouvé ce qui suit pour être utile:

    1. Créez un travail Pipeline de test dans lequel vous pouvez taper du code Pipeline ou pointer sur votre repo / twig d’un fichier Jenkins pour tester rapidement quelque chose. Pour des tests plus précis, utilisez un pipeline multitwigs qui pointe vers votre propre fourche, où vous pouvez rapidement apporter des modifications et valider sans affecter prod. Des choses comme BRANCH_NAME env sont uniquement disponibles dans Multibranch.
    2. Comme Jenkinsfile est du code Groovy, appelez-le simplement avec “groovy Jenkinsfile” pour valider la syntaxe de base.

    Placez votre clé SSH dans votre profil Jenkins, puis utilisez le linter déclaratif comme suit:

     ssh jenkins.hostname.here declarative-linter < Jenkinsfile 

    Cela fera une parsing statique sur votre fichier Jenkins. Dans l'éditeur de votre choix, définissez un raccourci clavier qui exécute cette commande automatiquement. Dans Visual Studio Code, qui est ce que j'utilise, accédez à Tâches> Configurer les tâches, puis utilisez le code JSON suivant pour créer une commande Validate Jenkinsfile :

     { "version": "2.0.0", "tasks": [ { "label": "Validate Jenkinsfile", "type": "shell", "command": "ssh jenkins.hostname declarative-linter < ${file}" } ] } 

    J’utilise future rejouer, pour faire des mises à jour et exécuter rapidement.

    Avec certaines limitations et pour les pipelines scriptés, j’utilise cette solution:

    1. Travail de pipeline avec un script groovy en ligne:

     node('master') { stage('Run!') { def script = load('...you job file...') } } 

    1. Jenkinsfile pour tester a la même structure que pour lesfurets:

     def execute() { ... main job code here ... } execute()