Autentica Jenkins CI per repository privato Github


136

Vorrei che Jenkins recuperasse automagicamente i dati dal mio repository privato ospitato su Github. Ma non ho idea di come svolgere questo compito. Ho provato la documentazione, generando ssh-key per l'utente jenkins e tutto quello che posso vedere è: "impossibile clonare il repo". Ho controllato gli URL: sono validi.

Qualche indizio, forse conosci alcuni documenti / blog / qualunque cosa descriva questo tipo di cose?


Rispondo a questa domanda simile, puoi vedere la risposta nel link qui sotto: jenkins & GitHub
user965062

Risposte:


139

Forse il supporto di GitHub per le chiavi di distribuzione è quello che stai cercando? Per citare quella pagina:

Quando dovrei usare una chiave di distribuzione?

Semplice, quando si dispone di un server che necessita dell'accesso pull a un singolo repository privato. Questa chiave è collegata direttamente al repository anziché a un account utente personale.

Se è quello che stai già provando e non funziona, potresti voler aggiornare la tua domanda con maggiori dettagli sugli URL utilizzati, i nomi e la posizione dei file chiave, ecc.


Ora per la parte tecnica: come utilizzare la chiave SSH con Jenkins?

Se si dispone, ad esempio, di un jenkinsutente unix, è possibile archiviare la chiave di distribuzione ~/.ssh/id_rsa. Quando Jenkins tenta di clonare il repository tramite ssh, proverà a utilizzare quella chiave.

In alcune configurazioni, non è possibile eseguire Jenkins come proprio account utente e probabilmente non è possibile utilizzare la posizione della chiave SSH predefinita ~/.ssh/id_rsa. In tali casi, è possibile creare una chiave in una posizione diversa, ad esempio ~/.ssh/deploy_key, e configurarla sshper usarla con una voce in ~/.ssh/config:

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

Poiché tutto ciò che autentichi su tutti i repository Github utilizzando git@github.come non vuoi che la chiave sopra sia utilizzata per tutte le tue connessioni a Github, abbiamo creato un alias host github-deploy-myproject . L'URL del clone ora diventa

git clone github-deploy-myproject:myuser/myproject

e questo è anche ciò che metti come URL repository in Jenkins.

(Si noti che è necessario non mettere ssh: // di fronte in modo che questo lavoro.)


4
Bur, come hai creato una chiave per jenkins?
Thiago Diniz,

5
La "chiave di distribuzione" è qualsiasi vecchia chiave SSH. Quello che ho fatto è stato eseguito ssh-keygencome l'utente Jenkins esegue ("jenkins" sul mio server Ubuntu). Ho quindi aggiunto ~jenkins/.ssh/id_rsa.puballa sezione delle chiavi deploy del repository su github.
Adam Monsen,

10
su alcune installazioni dovresti uscire da questo non nella ~directory. Ma /var/lib/jenkins/.ssh/per l'utente jenkins predefinito utilizzare quelle chiavi!
Garmoncheg,

7
Per dare seguito al commento di @garmoncheg, nota che /var/lib/jenkins è la home directory ( ~) per l' jenkinsutente.
David Harkness,

1
Qualcuno sa come far funzionare gli hook di distribuzione con questo? Could not match github-deploy-myproject:myuser/myprojectNel registro hook vedo errori simili . L'ho inserito come URL Repo e build funzionano in modo che possa accedere a GitHub. È solo il post di GitHub che non riesce a innescare la build.
pogo,

36

Una cosa che ha funzionato per me è assicurarsi che github.comsia dentro ~jenkins/.ssh/known_hosts.


Questo risolto il problema che stavo avendo dove dopo aver impostato una coppia di chiavi, una spinta git stava fallendo
chrisbunney,

Nel mio caso, il modo più semplice per farlo è eseguire "sudo su jenkins" poiché non è possibile accedere correttamente come utente jenkins. Una volta che hai l'identità jenkins, puoi fare un login ssh manuale su github / bitbucket e accettare la chiave host remota per conto dell'utente jenkins.
LOAS,

Ma cosa succede se rendi Jenkins Initialization parte del tuo ambiente di sviluppo "bootstrap". L'aspetto "manuale" di questo non funziona
TheJediCowboy

13

Se hai bisogno di Jenkins per accedere a più di 1 progetto, dovrai:
1. aggiungere la chiave pubblica a un account utente github
2. aggiungere questo utente come Proprietario (per accedere a tutti i progetti) o come Collaboratore in ogni progetto.

Molte chiavi pubbliche per un utente del sistema non funzioneranno perché GitHub troverà la prima chiave di distribuzione corrispondente e invierà un errore del tipo "ERRORE: autorizzazione all'utente / repo2 negata all'utente / repo1"

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


2
La risposta sull'utilizzo di una chiave di distribuzione funziona perfettamente se si dispone di un solo repository. Ma quando vuoi che un server CI costruisca progetti su più repository sei immediatamente nella posizione di gestire diversi set di chiavi (una coppia per repository) e diventa molto più semplice adottare l'approccio elencato in questa risposta.
cclark,

Questa guida per ragazzi
Jorge Orpinel,

@JorgeOrpinel, credo che l'approccio nel link possa impedire ai webhook di github di innescare build usando il plugin Github. Ho trovato un utente fittizio con una sola chiave e l'accesso a tutti i repository ha funzionato meglio quando volevo anche che le build fossero attivate da un webhook, perché avevo bisogno dell'URL del repository nella configurazione build per abbinare l'URL del clone di github, vedi il mio altro commento
chrisbunney

6

Jenkins crea un utente Jenkins sul sistema. La chiave ssh deve essere generata per l'utente Jenkins. Ecco i passaggi:

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

Ora puoi creare una credenziale Jenkins usando la chiave SSH Nella dashboard Jenkins Aggiungi credenziali

seleziona questa opzione

Chiave privata: dal master Jenkins ~ / .ssh


1

Ho avuto un problema simile con gitlab. Si è scoperto che avevo limitato gli utenti autorizzati ad accedere tramite ssh. Ciò non influirà sugli utenti di github, ma nel caso in cui le persone finiscano qui per problemi con gitlab (e simili), assicurati di aggiungere gitl' AllowUsersimpostazione in /etc/ssh/sshd_config:

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

0

Un'altra opzione è quella di utilizzare i token di accesso personale GitHub :

  • Vai a https://github.com/settings/tokens/new
  • Aggiungi ambito repo
  • In Jenkins, aggiungi una fonte GitHub
  • Utilizzare l'URL HTTPS del repository
  • Aggiungi l' URL HTTPS del repository git (non quello SSH , ad es. https://github.com/my-username/my-project.git)
  • Aggiungi credenziali
    • Tipo: nome utente con password
    • Nome utente: il nome utente GitHub
    • Password: il token di accesso personale creato su GitHub
    • ID: qualcosa del genere github-token-for-my-username

Ho provato questo su Jenkins ver. 2.222.1 e Jenkins GitHub plugin 1.29.5 con un repository GitHub privato.


-1

Un'alternativa alla risposta di sergey_mo è quella di creare più chiavi ssh sul server jenkins.

(Anche se come ha detto il primo commentatore alla risposta di sergey_mo, questo potrebbe finire per essere più doloroso della gestione di una singola coppia di chiavi.)


9
Ora vedo perché pubblicare un URL è una strategia terribile per le risposte. Il link sopra è morto.
Dejay Clayton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.