Jenkins: récupération de sous-modules avec Git

actuellement j'ai été bloqué sur un problème en essayant de récupérer les sous-modules d'un dépôt à partir de Jenkins. Ma configuration est très bien et je peux tirer des dépôts sans sous-modules très bien.

je peux aussi extraire les principaux composants d'une repo avec des sous-modules (les deux avec authentification dans le nom du dépôt comme avec SSH). Le problème ne se pose que lorsque je dois tirer les sous-modules-composants. J'exécute la dernière version de Jenkins et j'ai ajouté une partie en bas qui est pour les "sous-modules avancés comportements". J'ai sélectionné "recursively update submodules" ici et j'ai lancé la compilation plusieurs fois en vain.

quand j'essaie d'ajouter une étape de construction supplémentaire en bas avec des commandes shell, la mise à jour des dépôts ne fonctionne pas non plus. Quand j'essaie ces commandes en dehors de jenkins dans mon terminal, ça marche très bien. La question que je reçois toujours dans Jenkins est:

FATAL: Command "git submodule update" returned status code 1:

stdout: 

stderr: Cloning into 'thisismysubmodule'...
fatal: Authentication failed for 'https://git.thisismyrepo.com/scm/ap/thisismysubmodule.git/'

j'ai trouvé ce problème: https://issues.jenkins-ci.org/browse/JENKINS-20941 mais je ne peux pas utiliser la solution suggérée en bas à cause de problèmes de sécurité. Est-ce que quelqu'avez aucune expérience avec ce problème ou une solution?

21
demandé sur ItWillDo 2014-08-05 12:17:18

7 réponses

Voici une solution de contournement en utilisant ssh agent forwarding. Il a bien fonctionné pour moi.

  1. tout d'Abord, modifier <jenkins_home>/.ssh/config et définissez ForwardAgent yes
  2. puis, installez ssh Agent plugin pour Jenkins.
  3. puis, dans la configuration du projet, Réinitialiser les justificatifs d'identité Git.
  4. enfin, dans la configuration du projet, définissez le justificatif D'Agent SSH.

enter image description hereSSH Agent settings in Jenkins project configuration

13
répondu Benoit Blanchon 2015-02-19 15:10:03

les versions bêta des modules Git-client et git-plug-in sont sorties pour résoudre ce problème. Pour citer le numéro de JIRA.

le plugin client Git 2.0.0-beta1 a été libéré expérimental centre de mise à jour. Il inclut l'authentification git submodule, JGit 4.3, et nécessite JDK 7. Il exige au moins Jenkins 1.625 (le première version pour mandat de JDK 7)

en utilisant ce qui précède, il y a une option sous les comportements supplémentaires section intitulée:

utiliser les justificatifs d'identité de la commande par défaut remote of parent repository

cela a résolu mon problème en utilisant Jenkins 2.11 et les versions bêta du plug-in tournant un serveur Windows et esclave. Je n'ai pas vérifié les autres Machines de construction. Vous devez également utiliser la même méthode d'authentification, si vous utilisez http vous devez utiliser cela pour les sous-modules ainsi, si vous utilisez SSH vous devez utiliser ceci pour les sous-modules, essayer de mélanger les méthodes ne fonctionnera pas correctement.

-- UPDATE --

Les versions bêta ne sont plus nécessaires, veuillez consulter les pages suivantes:

Git Client Plugin

Git Plugin

7
répondu JamesD 2017-01-05 09:14:23

une solution serait de déclarer dans le fichier de configuration global git une aide de justificatif netrc, qui fournirait les justificatifs nécessaires pour toute requête http provenant de git.

git config --global credential.helper "netrc -f C:/path/to/_netrc.gpg -v"

(assurez-vous d'utiliser le même compte que celui utilisé pour l'exécution de Jenkins)

j'utilise un fichier netrc crypté, mais vous pouvez commencer quelques essais avec une liste non-chiffré.

1
répondu VonC 2017-05-23 11:54:46

vu que j'ai essayé à peu près toutes les options disponibles pour obtenir ce travail (SSH, .netrc, titres codés en dur,...) la seule option était celle qui était mentionnée au bas du JENKINS-20941 par "andreg":

Oui, cette question est une vraie douleur pour nous aussi. La seule façon pour nous d'obtenir cela fonctionne pour notre configuration Stash/Jenkins était de créer un utilisateur en lecture seule et pour coder les informations d'identification de cet utilisateur dans la référence à la sous-module. Même si le mauvais pratiquer, tous les utilisateurs travaillant sur le git repo déjà avoir au moins un accès en lecture seule, donc nous n'avons pas l'impression que c'était trop beaucoup de préoccupations en matière de sécurité. par exemple dans le repo parent .fichier gitmodules:

[sous-module "shared library"] path = partagée la bibliothèque url = https://username:password@stash.yourcompany.com/scm/project/shared-library.git

et puis le travail de Jenkins a sélectionné" sous-modules de mise à jour récursive".

1
répondu ItWillDo 2014-08-07 07:41:28

en fait je l'ai juste déplacé vers une commande shell et dans la commande shell je lui ai dit quel Helper d'authentification utiliser, puisque je suis sur windows il a été wincred:

git config --global credential.helper wincred
git submodule init 
git submodule sync 
git submodule update --init --recursive
1
répondu The Pax Bisonica 2015-09-29 20:53:05

j'ai réussi à obtenir ce travail en ajoutant simplement un .netrc fichier avec les justificatifs d'identité sur linux. Pas la solution la plus sûre, mais si vous avez besoin pour faire fonctionner rapidement, il vous va.

0
répondu math0ne 2017-06-13 01:32:49

Cette solution a fonctionné pour moi:

  1. assurez-vous que les justificatifs d'identité ssh sont les mêmes pour la mise à jour parent et la mise à jour submodule.
  2. Configuration des informations d'identification pour le parent repo dans Jenkins. (Gestion du Code Source (choisissez "Git") > dépôts)
  3. installez votre .gitmodule fichier de sorte qu'il utilise les informations d'authentification ssh du parent repo:

    [submodule "foo/repository"]
       path = foo/repository
       url = ssh://jenkins_build_monkey@domain.com/repository
    
  4. il y a une petite mise en garde à cette solution. Chaque fois que quelqu'un clone parent repo, ils devront synchroniser l'url avec celle à laquelle ils ont accès. La première fois qu'un utilisateur initialise le sous-module, ils doivent d'abord modifier la .gitmodules fichier et changer l'url:

    [submodule "foo/repository"]
       path = foo/repository
       url = ssh://username@domain.com/repository
    

    puis, dans le terminal:

    git submodule sync
    git submodule init repository
    git submodule update --remote repository
    

    et ensuite changer l'url de nouveau à l'url de compilation de jenkins. Sauf si vous synchronisez à nouveau, le sous-module permettra d'utiliser l'url associée à l'utilisateur.

en septembre 2016, Jenkins prévoit de sortir un nouveau une fonctionnalité qui permettra aux sous-modules de partager les informations d'authentification du dépôt parent. Une url HTTP peut alors être utilisée .gitmodule au lieu de ssh.

0
répondu sdw 2017-07-08 23:20:57