web-dev-qa-db-fra.com

Créer un script de pipeline Jenkins réutilisable

J'envisage d'utiliser le script du pipeline Jenkins récemment, une question est que je ne trouve pas un moyen intelligent pour créer du code interne réutilisable, imaginez, j'ai une fonction commune helloworld qui sera utilisée par beaucoup d'emplois pipeline, donc j'espère créer un utils.jar peut l'injecter dans le chemin d'accès aux classes de travaux.

Je remarque que Jenkins a un concept similaire avec le bibliothèque globale , mais ma préoccupation concernant ce plugin:

Comme il s'agit d'un plugin, nous devons donc l'installer/le mettre à niveau via le gestionnaire de plugins jenkins, alors il peut nécessiter un redémarrage pour appliquer le changement, ce n'est pas ce que je veux voir car les utilitaires peuvent changer, ajoutez toujours, nous espérons qu'il pourrait être disponible immédiatement.

Deuxièmement, c'est la librairie partagée jenkins officielle, je ne veux pas (ou ils ne nous appliqueront pas) mettre du code privé dans le repo jenkins.

Une bonne idée?

27
Tim

Bibliothèques partagées ( docs ) vous permet de créer votre code accessible à tous vos scripts de pipeline. Vous n'avez pas besoin de créer un plugin pour cela et vous n'avez pas à redémarrer Jenkins.

Par exemple. c'est ma bibliothèque et c'est un Jenkinsfile qui appelle cette fonction commune.


EDIT (février 2017): La bibliothèque est accessible via le serveur Git interne de Jenkins, ou déployée par d'autres moyens (par exemple via Chef) dans le répertoire workflow-lib/ Dans le jenkins répertoire personnel de l'utilisateur. (toujours possible, mais très maniable).

La bibliothèque globale peut être configurée par les moyens suivants:

  • une annotation @Library('github.com/...') dans le Jenkinsfile pointant vers l'URL du dépôt de bibliothèque partagée.
  • configuré au niveau du dossier des travaux Jenkins.
  • configuré dans la configuration Jenkins en tant que bibliothèque globale, avec l'avantage que le code est fiable , c'est-à-dire qu'il n'est pas soumis à la sécurité du script.

Un mélange de la première et de la dernière méthode serait une bibliothèque partagée non chargée explicitement qui est alors demandée uniquement en utilisant son nom dans Jenkinsfile: @Library('mysharedlib').

30
StephenKing

Selon la fréquence à laquelle vous prévoyez de réutiliser votre code, vous pouvez également charger une fonction (ou un ensemble de fonctions) dans le cadre d'un autre pipeline.

{
  // ...your pipeline code...

  git 'http://urlToYourGit/projectContainingYourScript'
  pipeline = load 'global-functions.groovy'
  pipeline.helloworld()    // Call one of your defined function

  // ...some other pipeline code...
}

Cette solution peut sembler un peu lourde par rapport à celle de StephenKing, mais ce que j'aime dans cette solution, c'est que mes fonctions globales sont toutes engagées dans Git et n'importe qui peut facilement les modifier sans (presque) aucune connaissance de Jenkins, juste les bases de Groovy.

Dans le script Groovy, vous êtes loading, assurez-vous d'ajouter return this à la fin. Cela vous permettra de faire des appels plus tard. Sinon, lorsque vous définissez pipeline = load global-functions.groovy, la variable sera définie sur null.

10
Pom12

Voici la solution que nous utilisons actuellement afin de réutiliser le code Jenkinsfile:

node {

  curl_cmd = "curl -H 'Accept: application/vnd.github.v3.raw' -H 'Authorization: token ${env.GITHUB_TOKEN}' https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t
  sh "${curl_cmd}"
  load 'Jenkinsfile.tmp'

}

Je pourrais être un peu moche, mais cela fonctionne de manière réaliste et en plus de cela, il nous permet également d'insérer du code spécifique au référentiel avant ou après le code partagé.

2
sorin