Authentifizieren Sie Jenkins CI für das private Github-Repository

136

Ich möchte, dass Jenkins Daten automatisch aus meinem auf Github gehosteten privaten Repository abruft. Aber ich habe keine Ahnung, wie ich diese Aufgabe erledigen soll. Ich habe die Dokumentation ausprobiert und einen SSH-Schlüssel für Jenkins Benutzer generiert. Alles, was ich sehen kann, ist: "Das Repo kann nicht geklont werden". Ich habe URLs überprüft - sie sind gültig.

Irgendwelche Hinweise, vielleicht kennen Sie einige Dokumente / Blogs / was auch immer, die solche Sachen beschreiben?

bx2
quelle
Ich beantworte diese eine ähnliche Frage, Sie können die Antwort in dem Link unten sehen: Jenkins & GitHub
Benutzer965062

Antworten:

139

Vielleicht suchen Sie nach GitHubs Unterstützung für die Bereitstellung von Schlüsseln ? Um diese Seite zu zitieren:

Wann sollte ich einen Bereitstellungsschlüssel verwenden?

Einfach, wenn Sie einen Server haben, der Pull-Zugriff auf ein einzelnes privates Repo benötigt. Dieser Schlüssel wird direkt an das Repository anstatt an ein persönliches Benutzerkonto angehängt.

Wenn Sie dies bereits versuchen und es nicht funktioniert, möchten Sie Ihre Frage möglicherweise mit weiteren Details zu den verwendeten URLs, den Namen und dem Speicherort der Schlüsseldateien usw. aktualisieren.


Nun zum technischen Teil: Wie verwende ich meinen SSH-Schlüssel mit Jenkins?

Wenn Sie beispielsweise einen jenkinsUnix-Benutzer haben, können Sie Ihren Bereitstellungsschlüssel in speichern ~/.ssh/id_rsa. Wenn Jenkins versucht, das Repo über ssh zu klonen, versucht er, diesen Schlüssel zu verwenden.

In einigen Setups können Sie Jenkins nicht als eigenes Benutzerkonto ausführen und möglicherweise auch nicht den Standardspeicherort für den SSH-Schlüssel verwenden ~/.ssh/id_rsa. In solchen Fällen können Sie einen Schlüssel an einem anderen Ort erstellen, z. B. ~/.ssh/deploy_keykonfigurieren ssh, um diesen mit einem Eintrag in ~/.ssh/config: zu verwenden.

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

Da Sie sich bei allen Github-Repositorys mit authentifizieren [email protected]und nicht möchten, dass der obige Schlüssel für alle Ihre Verbindungen zu Github verwendet wird, haben wir einen Host-Alias github-deploy-myproject erstellt . Ihre Klon-URL wird jetzt

git clone github-deploy-myproject:myuser/myproject

und das ist auch, was Sie als Repository-URL in Jenkins setzen.

(Beachten Sie, dass Sie müssen nicht setzen ssh: // vor , um diese an die Arbeit.)

Mark Longair
quelle
4
Aber wie hast du einen Schlüssel für Jenkins erstellt?
Thiago Diniz
5
Der "Bereitstellungsschlüssel" ist nur ein alter SSH-Schlüssel. Ich habe ausgeführt, ssh-keygenwie der Benutzer Jenkins ausgeführt wird ("jenkins" auf meinem Ubuntu-Server). Ich habe dann ~jenkins/.ssh/id_rsa.pubden Abschnitt mit den Bereitstellungsschlüsseln des Repositorys auf github hinzugefügt.
Adam Monsen
10
Bei einigen Installationen müssten Sie dies nicht in ein ~Verzeichnis geben. Aber /var/lib/jenkins/.ssh/für den Standard-Jenkins-Benutzer, um diese Schlüssel zu verwenden!
Garmoncheg
7
Beachten Sie, dass dies das Home-Verzeichnis ( ) für den Benutzer /var/lib/jenkins ist , um den Kommentar von @garmoncheg weiterzuverfolgen . ~jenkins
David Harkness
1
Weiß jemand, wie man Deploy-Hooks damit zum Laufen bringt? Ich sehe ähnliche Fehler Could not match github-deploy-myproject:myuser/myprojectim Hook-Protokoll. Ich habe das als meine Repo-URL eingegeben und Builds funktionieren, damit sie auf GitHub zugreifen können. Es ist nur der Beitrag von GitHub, der den Build nicht auslösen kann.
Pogo
36

Eine Sache, die das für mich zum Laufen gebracht hat, github.comist sicherzustellen, dass das in ist ~jenkins/.ssh/known_hosts.

Edward Samson
quelle
Dies behebt das Problem, bei dem nach dem Einrichten eines Schlüsselpaars ein Git-Push fehlschlug
Chrisbunney,
In meinem Fall ist der einfachste Weg, dies zu tun, "sudo su jenkins", da es nicht möglich ist, sich ordnungsgemäß als jenkins-Benutzer anzumelden. Sobald Sie die Jenkins-Identität haben, können Sie sich manuell bei github / bitbucket anmelden und den Remote-Host-Schlüssel im Namen des Jenkins-Benutzers akzeptieren.
LOAS
Was aber, wenn Sie die Jenkins-Initialisierung zu einem Teil Ihrer Entwicklungsumgebung machen? Der "manuelle" Aspekt funktioniert nicht
TheJediCowboy
13

Wenn Sie Jenkins benötigen, um auf mehr als ein Projekt zuzugreifen, müssen Sie:
1. einem Github-Benutzerkonto einen öffentlichen Schlüssel
hinzufügen 2. diesen Benutzer als Eigentümer (um auf alle Projekte zuzugreifen) oder als Mitarbeiter in jedem Projekt hinzufügen.

Viele öffentliche Schlüssel für einen Systembenutzer funktionieren nicht, da GitHub den ersten übereinstimmenden Bereitstellungsschlüssel findet und einen Fehler wie "FEHLER: Berechtigung für Benutzer / repo2 an Benutzer / repo1 verweigert" zurücksendet.

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

Sergii Mostovyi
quelle
2
Die Antwort zur Verwendung eines Bereitstellungsschlüssels funktioniert hervorragend, wenn Sie nur ein einziges Repository haben. Wenn Sie jedoch möchten, dass ein CI-Server Projekte über mehrere Repos hinweg erstellt, können Sie sofort mehrere Schlüsselsätze (ein Paar pro Repo) verwalten, und es wird viel einfacher, den in dieser Antwort aufgeführten Ansatz zu wählen.
Clark
In diesem Handbuch wird erklärt, wie Sie es mithilfe von ~ / .ssh / config über verschiedene Bereitstellungsschlüssel festlegen: gist.github.com/victorborda/2871029
Jorge Orpinel
@JorgeOrpinel, ich glaube, der Ansatz im Link kann verhindern, dass Github-Webhooks Builds mit dem Github-Plugin auslösen. Ich fand einen Dummy-Benutzer mit einem einzigen Schlüssel und der Zugriff auf alle Repos funktionierte besser, wenn ich auch wollte, dass Builds von einem Webhook ausgelöst werden, da ich die Repository-URL in der Build-Konfiguration benötigte, um mit der URL des Github-Klons übereinzustimmen, siehe meine andere Kommentar
Chrisbunney
6

Jenkins erstellt einen Benutzer Jenkins auf dem System. Der SSH-Schlüssel muss für den Jenkins-Benutzer generiert werden. Hier sind die Schritte:

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

Jetzt können Sie einen Jenkins-Berechtigungsnachweis mit dem SSH-Schlüssel im Jenkins-Dashboard erstellen. Anmeldeinformationen hinzufügen

Wählen Sie diese Option

Privater Schlüssel: Vom Jenkins-Master ~ / .ssh

Strahl
quelle
1

Ich hatte ein ähnliches Problem mit Gitlab. Es stellte sich heraus, dass ich die Benutzer eingeschränkt hatte, die sich über ssh anmelden dürfen. Dies hat keine Auswirkungen auf Github-Benutzer. Wenn jedoch Personen aufgrund von Gitlab-Problemen (und ähnlichen Problemen) hier landen, stellen Sie sicher, dass Sie gitdie AllowUsersEinstellungen in Folgendem hinzufügen /etc/ssh/sshd_config:

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

Eine weitere Option ist die Verwendung von GitHub-Token für den persönlichen Zugriff :

  • Gehen Sie zu https://github.com/settings/tokens/new
  • In Repo - Rahmen
  • Fügen Sie in Jenkins eine GitHub- Quelle hinzu
  • Verwenden Sie die Repository-HTTPS-URL
  • Fügen Sie die HTTPS- URL des Git-Repos hinzu (nicht die SSH- URL , z. B. https://github.com/my-username/my-project.git).
  • Anmeldeinformationen hinzufügen
    • Art: Benutzername mit Passwort
    • Benutzername: Der GitHub-Benutzername
    • Passwort: Das persönliche Zugriffstoken, das Sie auf GitHub erstellt haben
    • ID: so etwas wie github-token-for-my-username

Ich habe das auf Jenkins ver getestet. 2.222.1 und Jenkins GitHub Plugin 1.29.5 mit einem privaten GitHub Repo.

Speichel
quelle
-1

Eine Alternative zur Antwort von sergey_mo besteht darin, mehrere SSH-Schlüssel auf dem Jenkins-Server zu erstellen.

(Wie der erste Kommentator der Antwort von sergey_mo sagte, kann dies schmerzhafter sein als die Verwaltung eines einzelnen Schlüsselpaars.)

Orlanthi
quelle
9
Jetzt verstehe ich, warum das einfache Posten einer URL eine schreckliche Strategie für Antworten ist. Der obige Link ist tot.
Dejay Clayton