Récupérer plusieurs dépôts git dans le même espace de travail Jenkins


127

Utilisation de Jenkins 1.501 et du plugin Jenkins Git 1.1.26

J'ai 3 dépôts git différents chacun avec plusieurs projets.

Maintenant, je dois extraire tous les projets des 3 dépôts git dans le même espace de travail sur un esclave Jenkins. J'ai défini chaque dépôt git dans: Gestion du code source: plusieurs SCM . Mais chaque fois qu'un dépôt est extrait, le dépôt précédent (et ses projets associés) est supprimé.

J'ai lu ceci:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

mais ça n'aide pas vraiment. J'ai essayé de spécifier le même dossier sous le sous- répertoire local pour le repo (facultatif) pour tous les dépôts mais cela donne le même résultat.

Si cela est tout simplement impossible avec Jenkins, je suppose que certaines étapes / scripts de pré-construction pourraient être utilisés pour déplacer les projets au bon emplacement. Ce n'est pas une option pour modifier la configuration de construction des projets.

Réponses:


69

Il n'est pas possible d'extraire plusieurs dépôts à la fois dans un même espace de travail avec Jenkins + Git Plugin.

Pour contourner ce problème, vous pouvez soit avoir plusieurs travaux en amont qui extraient chacun un seul dépôt puis les copier dans l'espace de travail de votre projet final (problématique à plusieurs niveaux), soit vous pouvez configurer une étape de script shell qui extrait chaque dépôt nécessaire pour l'espace de travail du travail au moment de la construction.

Auparavant, le plugin Multiple SCM pouvait aider à résoudre ce problème, mais il est désormais obsolète. Depuis la page du plugin Multiple SCM: "Les utilisateurs doivent migrer vers https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin . Pipeline offre un meilleur moyen de récupérer plusieurs SCM et est pris en charge par Jenkins l'équipe de développement de base. "


Pourquoi la première approche est-elle problématique? Le fractionnement des emplois semble être une bonne pratique.
CurtainDog

1
C'est une bonne pratique en général, mais lorsque vous avez besoin de plusieurs caisses dans le même emplacement physique, la maintenance devient une préoccupation majeure. Par exemple, si vous vouliez créer une construction de branche, vous devrez cloner 4 travaux, puis modifier individuellement les chemins pour chacun. Il existe bien sûr des plugins pour vous aider, mais il est plus facile de simplement récupérer un chemin relatif à partir d'un seul travail. Ensuite, vous pouvez cloner autant que vous le souhaitez sans modifier les paramètres.
CIGuy

1
Vous devez le changer de la bonne réponse car elle n'est plus pertinente.
Dvir669

2
Les pipelines vous obligent à apprendre un nouveau DSL, ce qui est un peu trop pour le travail très simple (extraire le code de plusieurs référentiels) que nous voulons qu'il fasse. Tenez-vous-en au plugin Multiple SCM jusqu'à ce qu'une interface graphique décente apparaisse autour du DSL du pipeline Jenkins. Je peux signaler que cela fonctionne bien avec Jenkins 2.17
Burak Arslan

2
Je viens de rencontrer les mêmes problèmes avec plusieurs dépôts. J'utilise maintenant le plugin Pipeline même si j'étais aussi sceptique que @BurakArslan à propos du nouveau DSL. Ce n'est en fait pas aussi grave que je le pensais et est livré avec un générateur d'extraits raisonnablement décent. Après l'avoir utilisé pendant seulement 2 heures, je préfère maintenant cette approche car je peux éventuellement valider les scripts de construction du pipeline sur git avec le reste du code.
Ben

81

Avec le plugin Multiple SCMs:

  • créez une entrée de référentiel différente pour chaque référentiel que vous devez extraire (projet principal ou projet de dépendance.

  • pour chaque projet, dans le menu "avancé" (le deuxième menu "avancé", il y a deux boutons étiquetés "avancé" pour chaque référentiel), recherchez le champ de texte "Sous-répertoire local pour repo (optionnel)". Vous pouvez y spécifier le sous-répertoire du répertoire "workspace" dans lequel vous souhaitez copier le projet. Vous pouvez mapper le système de fichiers de mon ordinateur de développement.

Le "deuxième menu avancé" n'existe plus, il faut plutôt utiliser le bouton "Ajouter" (dans la section "Comportements supplémentaires"), et choisir "Extraire dans un sous-répertoire"

  • si vous utilisez ant, comme maintenant le fichier build.xml avec les cibles de construction ne se trouve pas dans le répertoire racine de l'espace de travail mais dans un sous-répertoire, vous devez le refléter dans la configuration "Invoke Ant". Pour ce faire, dans "Invoke ant", appuyez sur "Advanced" et remplissez le texte d'entrée "Build file", y compris le nom du sous-répertoire où se trouve le build.xml.

J'espère que cela pourra aider.


3
Cela doit être dépassé. Au moment de l'écriture de l'extrait de code GIT du plugin Multiple SCMs ne contient pas le sous-chemin facultatif.
AlexeiOst

12
Dans chaque référentiel, il y a une liste déroulante appelée "Ajouter". Vous y trouverez l'option "Récupérer dans un sous-répertoire", qui effectue la même chose.
Gary Ye

1
J'ai suivi votre guide avec le plugin multiple SCM et git mais j'ai un autre problème amusant. Il semble ne pas vouloir extraire correctement la même branche (développer) pour différents référentiels. Il essaie d'extraire un commit par hachage (qui n'est valide que dans le premier référentiel). Une idée sur la façon de résoudre ce problème?
Lefteris

Le plus gros problème avec plusieurs plugins SCM est le suivant: "Les déclencheurs de type post-commit ne fonctionnent pas actuellement (au moins pour la subversion), il est donc nécessaire de configurer l'interrogation de type 'cron'."
grayaii

1
Les pipelines vous obligent à apprendre un nouveau DSL, ce qui est un peu trop pour le travail très simple (extraire le code de plusieurs référentiels) que nous voulons qu'il fasse. Tenez-vous-en au plugin Multiple SCM jusqu'à ce qu'une interface graphique décente apparaisse autour du DSL du pipeline Jenkins. Je peux signaler que cela fonctionne bien avec Jenkins 2.17
Burak Arslan

41

Depuis plusieurs SCM Plugin est obsolète.

Avec Jenkins Pipeline, il est possible de récupérer plusieurs dépôts git et après l'avoir construit en utilisant gradle

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

Vous voudrez peut-être envisager d'utiliser des sous-modules git au lieu d'un pipeline personnalisé comme celui-ci.


Je vous remercie!!! Le dirblocage est la clé, je ne pouvais pas comprendre pourquoi je ne voyais que le dépôt cloné le plus récent dans l'espace de travail de mon travail.
bonh

comment la notion de «changements» est-elle considérée sous plusieurs SCM? S'agit-il simplement de la somme des changements observés dans tous les pensions qui composent les emplois? Il serait bon de les détailler de chacun si possible, 23 changes from repo XXX, 3 changes from repo YYYou quelque chose de plus compact dans ce sens.
jxramos

20

J'ai utilisé avec succès le plugin Multiple SCMs conjointement avec le plugin Git avec Jenkins.


3
merci c'est super, je suis capable de mettre 2 chemins bitbucket dans la section repository, et maintenant comment puis-je dire repo 1 checkout branche "develop" et pour la branche repo 2 checkout "fixes"? Je vois les branches pour construire la partie dans jenkins, comment puis-je configurer le nom du référentiel et Refsec dans le spécificateur de branche (vide pour `` any '') afin que chacun puisse vérifier la branche correspondante que je veux? ou je le fais mal et je devrais cliquer sur le booléen qui dit "Multiple SCM"?
pelos

@pelos Avez-vous trouvé la solution?
Govind

pour le moment, nous n'utilisons pas le fichier yml et nous avons effectué les deux flux de travail différents avec les tâches régulières
pelos

5

Selon les relations entre les référentiels, une autre approche consiste à ajouter l'autre référentiel (référentiels) en tant que sous-modules git à l'un des référentiels. Un sous-module git crée une référence aux autres dépôts. Ces dépôts de sous-modules ne sont pas clonés sauf si vous spécifiez le --recursivedrapeau lors du clonage du "superprojet" (terme officiel).

Voici la commande pour ajouter un sous-module dans le projet actuel:

git submodule add <repository URI path to clone>

Nous utilisons Jenkins v1.645 et le git SCM fera immédiatement un clone récursif pour les superprojets. Voila, vous obtenez les fichiers de superprojet et tous les fichiers de dépôt dépendants (sous-module) dans leurs propres répertoires respectifs dans le même espace de travail Jenkins.

Ne garantissant pas que c'est la bonne approche, c'est plutôt une approche.


5

Jenkins: Multiple SCM - obsolète. Plugin GIT - ne fonctionne pas pour plusieurs dépôts.

Script / pipeline sous forme de code - est la voie à suivre.


2

J'ai aussi eu ce problème. Je l'ai résolu en utilisant Trigger / call s'appuie sur d'autres projets. Pour chaque référentiel, j'appelle le projet en aval à l'aide de paramètres.

Projet principal:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

Ensuite, pour chaque référentiel, j'appelle un projet en aval comme celui-ci:

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

Projet en aval: Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 

1

Le retrait de plusieurs dépôts à la fois dans un même espace de travail est possible avec Jenkins + Git Plugin (peut-être uniquement dans les versions plus récentes?).

Dans la section "Source-Code-Management", ne sélectionnez pas "Git", mais "Multiple SCMs" et ajoutez plusieurs dépôts git.

Assurez-vous que dans tous sauf un, vous ajoutez comme "Comportement supplémentaire" l'action "Extraire dans un sous-répertoire" et spécifiez un sous-répertoire individuel.


Je crois que de cette façon, vous utilisez le plugin Multiple SCM (obsolète) plutôt que le plugin Git vanilla.
Robert

0

Nous utilisons git-repo pour gérer nos multiples dépôts GIT. Il existe également un plugin Jenkins Repo qui permet de récupérer tout ou partie des référentiels gérés par git-repo dans le même espace de travail Jenkins.


Comment résolvez-vous exactement le problème posé dans cette question? J'ai installé le plugin que vous avez mentionné et lu sur le repo et le plugin, mais je ne vois pas comment configurer Jenkins pour cloner deux dépôts à exécuter dans un projet ...
GreenAsJade

Afin d'utiliser Repo, le référentiel spécial doit être créé qui ne contiendra que le (s) fichier (s) manifeste (s). Dans ce fichier, vous spécifiez toutes les informations sur les autres référentiels. Le format exact des fichiers manifestes est décrit dans le fichier docs / manifest-format.txt du projet git-repo ( gerrit.googlesource.com/git-repo/+/master/docs/… ). Lors de la configuration de Jenkins Repo, une partie du travail - vous spécifiez l'emplacement du référentiel 'manifest' et éventuellement le nom des fichiers 'manifest' (vous pouvez en avoir plusieurs). Tous les référentiels spécifiés dans le manifeste seront clonés.
vladisld
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.