web-dev-qa-db-fra.com

Pipeline multibranches Jenkins avec Jenkinsfile de différents référentiels

J'ai un référentiel Git avec le code que je voudrais construire mais je ne suis pas "autorisé" à ajouter un Jenkinsfile dans sa racine (c'est un paquet Debian, donc je ne peux pas ajouter de fichiers dans la source amont). Existe-t-il un moyen de stocker la Jenkinsfile dans un référentiel et de le générer à partir d'un autre référentiel? Étant donné que mon référentiel de code doit créer plusieurs branches (une pour chaque version de Debian), il devrait s'agir d'un pipeline multibranch. Les validations dans les référentiels code ou Jenkinsfile devraient déclencher une construction.

Complexité des bonus: J'ai plusieurs référentiels de code/packaging comme celui-ci et j'aimerais réutiliser la même Jenkinsfile pour chacun d'entre eux. Ainsi, il devrait en quelque sorte extraire dynamiquement l’URL Git à utiliser. Les branches à construire portent les mêmes noms dans tous les référentiels.

19
Kolargol00

La réponse courte est: vous ne pouvez pas faire cela avec un multibranch pipeline. Les pipelines multibranches sont uniquement conçus (du moins pour le moment) pour exécuter un pipeline spécifique dans le style Pipeline script from SCM, avec une variable Jenkinsfile fixe à la racine du projet.

Vous pouvez cependant utiliser le plugin Multi-Branch Project conçu pour les projets multibranches freestyle. Tout d’abord, vous devez définir votre multibranch freestyle configuration comme vous le feriez avec un multibranch pipeline configuration. Sélectionnez ce nouvel élément comme indiqué ci-dessous:

 New Freestyle multi-branch project

Ce type de configuration se comportera exactement comme le type multibranch pipeline, c’est-à-dire qu’il vous créera un dossier avec le nom de votre configuration et un sous-projet pour chaque branche automatiquement détectée.

La mise en œuvre devrait alors être un jeu d'enfant:

  1. Spécifiez votre référentiel SCM dans la configuration multibranch
  2. Appelez une autre construction dans le cadre de votre construction/post-construction, comme vous le feriez dans un projet freestyle standard, sauf que vous devez appeler une tâche paramétrée (appelons-la build-job) et lui donner les informations de votre référentiel, c'est-à-dire l'URL Git et la branche actuelle. (vous pouvez utiliser les variables prédéfinies $GIT_URL et $GIT_BRANCH à cette fin)
  3. Dans votre build-job, définissez simplement un pipeline en ligne ou un script de pipeline extrait de SCM. Dans ce script, effectuez une extraction de SCM et poursuivez les étapes à créer. Exemple de contenu du pipeline build-job:

.

node() {
  stage 'Checkout'
  checkout scm: [$class: 'GitSCM', branches: [[name: '*/${GIT_BRANCH}']], userRemoteConfigs: [[url: '${GIT_URL}']]]

  stage 'Build'
  // Build steps...
}

Bien sûr, si vos différents projets multibranches doivent être traités un peu différemment, vous pouvez également utiliser des projets intermédiaires (disons build-project-A, build-project-B, ...) qui à leur tour appellent le pipeline générique build-job.

L'inconvénient majeur de cette solution est qu'un seul travail sera responsable de toutes vos versions, ce qui rendra le débogage plus difficile. Vos projets multibranches passeraient toujours au bleu/rouge en cas de succès/erreur, mais vous devrez revenir à build-job pour trouver le véritable problème de votre construction. 

9
Pom12

Dans mon cas, j’ai un escenario avec un projet gitlab basé sur gradle qui a des dépendances sur un autre pré-projet gitlab basé sur gradle également (même tableau de bord, mais différents commits, différents développeurs). 

J'ai ajouté les lignes suivantes dans mon Jenkinsfile (celui qui dépend)

stage('Build') { 
            steps {
                git branch: 'dev', credentialsId: 'jenkins-generated-ssh-key', url: '[email protected]:root/coreProject.git'
                sh './gradlew clean'  
            }                 
        }

Remarque: soyez attentif à l'ordre des phrases ... Si vous avez des doutes sur la création de jenkins-généré-ssh-key, merci de me demander

0
Matias Camargo

J'ai la version 2.121 et vous pouvez le faire de deux manières:

Voie 1

Dans la configuration du pipeline multibranches> Configuration de la construction> Mode> Sélectionnez "Script personnalisé" et saisissez "Fichier de marqueur" sous le nom du fichier que vous utiliserez pour identifier les branches pour lesquelles vous souhaitez créer.

Ensuite, sous Pipeline> Définition, sélectionnez "Script Pipeline à partir de SCM" et entrez les informations "SCM" pour savoir comment trouver le "fichier Jenkins" contenant le script que vous souhaitez exécuter. Cela peut se trouver dans le même référentiel que celui dans lequel vous trouvez des branches pour créer les tâches (si vous insérez les mêmes informations dans le référentiel GitHub), mais je ne trouve pas le moyen d'indiquer que vous utilisez simplement la même branche pour le fichier.

Way 2

Comme ci-dessus, dans la configuration du pipeline multibranches> Configuration de la construction> Mode> Sélectionnez "Script personnalisé" et saisissez "Fichier de marqueur" sous le nom du fichier que vous utiliserez pour identifier les branches pour lesquelles vous souhaitez créer.

Ensuite, sous Pipeline> Définition, sélectionnez "Script Pipeline" et mettez un peu de Groovy dans la zone de texte pour charger ce que vous voulez ou exécuter un script déjà chargé dans l’espace de travail.

0
Lee Meador