web-dev-qa-db-fra.com

Comment tester une modification apportée à Jenkinsfile localement?

Lors de l'écriture de pipelines Jenkins, il semble très gênant de valider chaque nouvelle modification afin de voir si elle fonctionne. 

Existe-t-il un moyen de les exécuter localement sans commettre le code?

115
sorin

Vous ne pouvez pas exécuter de script Pipeline localement, son objectif étant de créer un script Jenkins. (C’est l’une des raisons pour lesquelles il est préférable de garder votre Jenkinsfile courte et limitée au code qui traite réellement des fonctionnalités de Jenkins; votre logique de construction réelle doit être gérée avec des processus externes ou des outils de construction que vous appelez via une étape sh ou bat à une ligne .)

Si vous souhaitez tester une modification de Jenkinsfile live mais sans commettre _, utilisez la fonctionnalité Replay ajoutée dans 1.14

JENKINS-33925 effectue le suivi des données souhaitées pour un cadre de test automatisé.

84
Jesse Glick

TL; DR
Framework de test Jenkins Pipeline Unit

Version longue
Les tests de pipeline Jenkins deviennent de plus en plus pénibles. Contrairement à l'approche de configuration déclarative des tâches classique dans laquelle l'utilisateur était limité à ce que l'interface utilisateur exposait, le nouveau pipeline Jenkins est un langage de programmation complet pour le processus de construction dans lequel vous mélangez la partie déclarative avec votre propre code. En tant que bons développeurs, nous souhaitons également avoir des tests unitaires pour ce type de code. 

Vous devez suivre trois étapes pour développer les canalisations Jenkins. Le step 1. devrait couvrir 80% des cas d'utilisation.

  1. Faites autant que possible dans les scripts de construction (par exemple, Maven, Gradle, Gulp, etc.). Ensuite, dans vos scripts de pipeline, vous appelez simplement les tâches de construction dans le bon ordre. Le pipeline de génération orchestre et exécute les tâches de génération mais ne dispose pas de logique majeure nécessitant des tests spéciaux. 
  2. Si la règle précédente ne peut pas être entièrement appliquée, passez à bibliothèques de pipeline partagées où vous pouvez développer et tester la logique personnalisée et l'intégrer dans le pipeline.
  3. Si tout ce qui précède vous fait défaut, vous pouvez essayer l'une de ces bibliothèques récemment parues (mars 2017). Framework de test de l'unité de pipeline Jenkins ou pipelineUnit (exemples)

Exemples 

Le référentiel pipelineUnit GitHub contient des exemples Spock sur la manière d'utiliser cadre de test de l'unité de pipeline Jenkins

38
Vadimo

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 visual. L'éditeur fonctionne à partir de l'interface utilisateur Blue Ocean lorsque vous cliquez sur "Configurer" uniquement pour les projets github (il s'agit d'un problème connu qui s'efforce de le faire fonctionner également sur git, etc.).

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

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

Cliquez ensuite au milieu de la page, puis appuyez sur Ctrl+S. Une zone de texte permettant de coller un script déclaratif de pipeline s'affiche. Lorsque vous cliquez sur Mise à jour, s'il y a une erreur de syntaxe, l'éditeur vous indique où se trouve l'erreur de syntaxe. Comme dans cette capture d'écran:

 As a quick test I wrongly typed "stepps" instead of "steps"

S'il n'y a pas d'erreur de syntaxe, la zone de texte se fermera et la page visualisera votre pipeline. Ne vous inquiétez pas, cela ne sauvera rien (s'il s'agit d'un projet github, le changement du fichier Jenkins sera validé).

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

10
firepol

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

 Replay feature

7
AhmedDrira

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

4
bogdan.mustiata

Pour autant que je sache, ce Pipeline Plugin est le "moteur" de la nouvelle mécanique Jenkinsfile. Je suis donc tout à fait convaincu que vous pouvez l'utiliser pour tester vos scripts localement.

Je ne sais pas si des étapes supplémentaires sont 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", vérifiez this description de fonction, dernier paragraphe, première entrée.

4
Dominik Gebhart

Mis à part la fonctionnalité de relecture déjà mentionnée par d'autres (tout comme par son utilité!), J'ai trouvé les éléments suivants utiles:

  1. Créez un travail de pipeline de test dans lequel vous pouvez taper du code de pipeline ou pointer sur votre dépôt/branche d’un fichier Jenkins pour tester rapidement quelque chose. Pour des tests plus précis, utilisez un pipeline multibranches qui pointe vers votre propre fourche, où vous pouvez rapidement apporter des modifications et valider, sans affecter les prod. Des éléments tels que BRANCH_NAME env sont uniquement disponibles dans Multibranch.
  2. Jenkinsfile étant un code Groovy, appelez-le simplement avec "groovy Jenkinsfile" pour valider la syntaxe de base.
1
Max Zheng

j'utilise replay future pour effectuer des mises à jour et exécuter rapidement.

0
AhmedDrira

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

  1. Travail de pipeline avec un script groovy intégré:

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

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

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

Mettez votre clé SSH dans votre profil Jenkins, puis utilisez l’indicateur déclaratif comme suit:

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

Cela fera une analyse statique sur votre Jenkinsfile. Dans l'éditeur de votre choix, définissez un raccourci clavier qui exécute cette commande automatiquement. Dans Visual Studio Code, que j'utilise, accédez à Tâches> Configurer les tâches, puis utilisez le 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}"
    }
  ]
}
0
Hendrik M Halkow