Authentifier Jenkins CI pour le référentiel privé Github

136

J'aimerais que Jenkins récupère automatiquement les données de mon référentiel privé hébergé sur Github. Mais je n'ai aucune idée de la façon d'accomplir cette tâche. J'ai essayé la documentation, en générant la clé ssh pour l'utilisateur jenkins et tout ce que je peux voir est: "impossible de cloner le dépôt". J'ai vérifié les URL - elles sont valides.

Des indices, peut-être connaissez-vous des documents / blogs / quoi que ce soit qui décrivent ce genre de choses?

bx2
la source
Je réponds à cette question similaire, vous pouvez voir la réponse dans le lien ci-dessous: jenkins & GitHub
user965062

Réponses:

139

Peut-être que la prise en charge de GitHub pour les clés de déploiement est ce que vous recherchez? Pour citer cette page:

Quand dois-je utiliser une clé de déploiement?

Simple, lorsque vous avez un serveur qui a besoin d'un accès par extraction à un seul dépôt privé. Cette clé est directement attachée au référentiel et non à un compte utilisateur personnel.

Si c'est ce que vous essayez déjà et que cela ne fonctionne pas, vous voudrez peut-être mettre à jour votre question avec plus de détails sur les URL utilisées, les noms et l'emplacement des fichiers clés, etc.


Passons maintenant à la partie technique: comment utiliser votre clé SSH avec Jenkins?

Si vous avez, par exemple, un jenkinsutilisateur unix, vous pouvez stocker votre clé de déploiement dans ~/.ssh/id_rsa. Lorsque Jenkins essaie de cloner le dépôt via ssh, il essaie d'utiliser cette clé.

Dans certaines configurations, vous ne pouvez pas exécuter Jenkins en tant que propre compte d'utilisateur, et peut-être pas non plus utiliser l'emplacement de la clé ssh par défaut ~/.ssh/id_rsa. Dans de tels cas, vous pouvez créer une clé à un emplacement différent, par exemple ~/.ssh/deploy_key, et configurer sshpour l'utiliser avec une entrée dans ~/.ssh/config:

Host github-deploy-myproject
    HostName       github.com
    User           git
    IdentityFile   ~/.ssh/deploy_key
    IdentitiesOnly yes

Parce que tout ce que vous vous authentifiez auprès de tous les référentiels Github en utilisant [email protected]et que vous ne voulez pas que la clé ci-dessus soit utilisée pour toutes vos connexions à Github, nous avons créé un alias d'hôte github-deploy-myproject . Votre URL de clonage devient maintenant

git clone github-deploy-myproject:myuser/myproject

et c'est aussi ce que vous mettez comme URL de référentiel dans Jenkins.

(Notez que vous ne devez pas mettre ssh: // devant pour que cela fonctionne.)

Mark Longair
la source
4
Mais comment avez-vous créé une clé pour jenkins?
Thiago Diniz
5
La «clé de déploiement» est n'importe quelle ancienne clé SSH. Ce que j'ai fait, c'est exécuter ssh-keygencomme l'utilisateur Jenkins s'exécute en tant que ("jenkins" sur mon serveur Ubuntu). J'ai ensuite ajouté ~jenkins/.ssh/id_rsa.pubà la section de déploiement des clés du référentiel sur github.
Adam Monsen
10
sur certaines installations, vous auriez besoin de sortir ceci pas dans le ~répertoire. Mais /var/lib/jenkins/.ssh/pour que l'utilisateur jenkins par défaut utilise ces clés!
garmoncheg
7
Pour faire suite au commentaire de @garmoncheg, notez qu'il /var/lib/jenkins s'agit du répertoire personnel ( ~) de l' jenkinsutilisateur.
David Harkness
1
Quelqu'un sait-il comment faire fonctionner les hooks de déploiement avec cela? Je vois des erreurs semblables à celles Could not match github-deploy-myproject:myuser/myprojectdu journal du hook. Je l'ai entré comme URL de dépôt et les builds fonctionnent pour pouvoir accéder à GitHub. C'est juste la publication de GitHub qui ne parvient pas à déclencher la compilation.
pogo
36

Une chose qui a permis à cela de fonctionner pour moi est de m'assurer que github.comc'est bien le cas ~jenkins/.ssh/known_hosts.

Edward Samson
la source
Cela a résolu le problème que j'avais après la configuration d'une paire de clés, une poussée git échouait
chrisbunney
Dans mon cas, le moyen le plus simple de le faire est de faire «sudo su jenkins» car il n'est pas possible de se connecter correctement en tant qu'utilisateur jenkins. Une fois que vous avez l'identité jenkins, vous pouvez effectuer une connexion SSH manuelle à github / bitbucket et accepter la clé d'hôte distant au nom de l'utilisateur jenkins.
LOAS
Mais que se passe-t-il si vous intégrez l'initialisation de Jenkins à l'amorçage de votre environnement de développement? L'aspect `` manuel '' de cela ne fonctionne pas
TheJediCowboy
13

Si vous avez besoin que Jenkins accède à plus d'un projet, vous devrez:
1. ajouter une clé publique à un compte utilisateur github
2. ajouter cet utilisateur en tant que propriétaire (pour accéder à tous les projets) ou en tant que collaborateur dans chaque projet.

De nombreuses clés publiques pour un utilisateur système ne fonctionneront pas car GitHub trouvera la première clé de déploiement correspondante et renverra une erreur du type "ERREUR: Autorisation à l'utilisateur / repo2 refusée à l'utilisateur / repo1"

http://help.github.com/ssh-issues/

Sergii Mostovyi
la source
2
La réponse à propos de l'utilisation d'une clé de déploiement fonctionne très bien si vous n'avez qu'un seul référentiel. Mais lorsque vous voulez qu'un serveur CI crée des projets sur plusieurs dépôts, vous êtes immédiatement en mesure de gérer plusieurs ensembles de clés (une paire par dépôt) et il devient beaucoup plus facile d'adopter l'approche répertoriée dans cette réponse.
cclark
Ce guide explique comment le définir via différentes clés de déploiement en utilisant ~ / .ssh / config: gist.github.com/victorborda/2871029
Jorge Orpinel
@JorgeOrpinel, je pense que l'approche du lien peut empêcher les webhooks github de déclencher des builds à l'aide du plugin Github. J'ai trouvé un utilisateur factice avec une seule clé et l'accès à tous les dépôts fonctionnait mieux lorsque je voulais également que les builds soient déclenchés par un webhook, car j'avais besoin de l'URL du référentiel dans la configuration de build pour correspondre à l'URL du clone github, voir mon autre comment
chrisbunney
6

Jenkins crée un utilisateur Jenkins sur le système. La clé ssh doit être générée pour l'utilisateur Jenkins. Voici les étapes:

sudo su jenkins -s /bin/bash
cd ~
mkdir .ssh // may already exist
cd .ssh
ssh-keygen

Vous pouvez maintenant créer des informations d'identification Jenkins à l'aide de la clé SSH Sur le tableau de bord Jenkins Ajouter des informations d'identification

sélectionnez cette option

Clé privée: du maître Jenkins ~ / .ssh

Rayon
la source
1

J'ai eu un problème similaire avec gitlab. Il s'est avéré que j'avais restreint les utilisateurs autorisés à se connecter via ssh. Cela n'affectera pas les utilisateurs de github, mais au cas où des gens se retrouveraient ici pour des problèmes de gitlab (et autres), assurez-vous d'ajouter gitle AllowUsersparamètre dans /etc/ssh/sshd_config:

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers batman git
Jon
la source
0

Une autre option consiste à utiliser des jetons d'accès personnels GitHub :

  • Accédez à https://github.com/settings/tokens/new
  • Ajouter l' étendue du dépôt
  • Dans Jenkins, ajoutez une source GitHub
  • Utiliser l'URL HTTPS du référentiel
  • Ajoutez l' URL HTTPS du dépôt git (pas celle SSH , par exemple https://github.com/my-username/my-project.git) .
  • Ajouter un identifiant
    • Genre: nom d'utilisateur avec mot de passe
    • Nom d'utilisateur: le nom d'utilisateur GitHub
    • Mot de passe: le jeton d'accès personnel que vous avez créé sur GitHub
    • ID: quelque chose comme github-token-for-my-username

J'ai testé cela sur Jenkins ver. 2.222.1 et le plugin Jenkins GitHub 1.29.5 avec un dépôt GitHub privé.

salomvary
la source
-1

Une alternative à la réponse de sergey_mo est de créer plusieurs clés ssh sur le serveur jenkins.

(Bien que, comme l'a dit le premier commentateur de la réponse de sergey_mo, cela peut finir par être plus douloureux que de gérer une seule paire de clés.)

Orlanthi
la source
9
Maintenant, je vois pourquoi simplement publier une URL est une stratégie terrible pour obtenir des réponses. Le lien ci-dessus est mort.
Dejay Clayton