Uwierzytelnij Jenkins CI dla prywatnego repozytorium Github

136

Chciałbym, aby Jenkins automatycznie pobierał dane z mojego prywatnego repozytorium hostowanego na Github. Ale nie mam pojęcia, jak wykonać to zadanie. Wypróbowałem dokumentację, wygenerowałem klucz ssh dla użytkownika jenkins i widzę tylko: „nie można sklonować repozytorium”. Sprawdziłem adresy URL - są prawidłowe.

Jakieś wskazówki, może znasz jakieś dokumenty / blogi / cokolwiek, które opisują tego rodzaju rzeczy?

bx2
źródło
Odpowiadam na to podobne pytanie, odpowiedź można zobaczyć w linku poniżej: jenkins & GitHub
user965062

Odpowiedzi:

139

Być może obsługa GitHub dla kluczy wdrażania jest tym, czego szukasz? Aby zacytować tę stronę:

Kiedy należy używać klucza wdrażania?

To proste, gdy masz serwer, który wymaga dostępu do pojedynczego repozytorium prywatnego. Ten klucz jest dołączany bezpośrednio do repozytorium zamiast do osobistego konta użytkownika.

Jeśli tego już próbujesz i nie działa, możesz zaktualizować swoje pytanie, podając więcej szczegółów dotyczących używanych adresów URL, nazw i lokalizacji plików kluczy itp.


A teraz część techniczna: jak używać klucza SSH z Jenkinsem?

Jeśli masz, powiedzmy, jenkinsużytkownika systemu UNIX, możesz przechowywać klucz wdrożenia w ~/.ssh/id_rsa. Kiedy Jenkins spróbuje sklonować repozytorium przez ssh, spróbuje użyć tego klucza.

W niektórych konfiguracjach nie można uruchomić Jenkinsa jako własnego konta użytkownika i prawdopodobnie nie można również użyć domyślnej lokalizacji klucza ssh ~/.ssh/id_rsa. W takich przypadkach możesz utworzyć klucz w innej lokalizacji, np. ~/.ssh/deploy_keyI skonfigurować sshgo tak, aby używał go z wpisem w ~/.ssh/config:

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

Ponieważ wszyscy uwierzytelniacie się we wszystkich repozytoriach Github, używając [email protected]i nie chcecie, aby powyższy klucz był używany do wszystkich połączeń z Github, utworzyliśmy alias hosta github-deploy-myproject . Twój sklonowany adres URL ma teraz postać

git clone github-deploy-myproject:myuser/myproject

i to również jest to, co umieszczasz jako adres URL repozytorium w Jenkins.

(Należy pamiętać, że trzeba nie umieścić ssh: // z przodu, aby to zadziałało).

Mark Longair
źródło
4
Jak stworzyłeś klucz dla Jenkinsa?
Thiago Diniz
5
„Klucz wdrażania” to po prostu stary klucz SSH. To, co zrobiłem, to uruchomienie ssh-keygenjako użytkownika Jenkins („jenkins” na moim serwerze Ubuntu). Następnie dodałem ~jenkins/.ssh/id_rsa.pubdo sekcji kluczy wdrażania w repozytorium na github.
Adam Monsen
10
w niektórych instalacjach będziesz musiał wyrzucić to nie do ~katalogu. Ale /var/lib/jenkins/.ssh/żeby domyślny użytkownik jenkins używał tych kluczy!
garmoncheg
7
Kontynuując komentarz @garmoncheg, zwróć uwagę, że /var/lib/jenkins jest to katalog domowy ( ~) jenkinsużytkownika.
David Harkness
1
Czy ktoś wie, jak sprawić, aby wdrożyć haki pracujące z tym? Widzę błędy podobne do tych Could not match github-deploy-myproject:myuser/myprojectw dzienniku przechwytywania. Wpisałem to, ponieważ mój adres URL repozytorium i kompilacje działają, dzięki czemu może uzyskać dostęp do GitHub. To tylko post z GitHub, który nie uruchamia kompilacji.
pogo
36

Jedna rzecz, która sprawiła, że github.comto zadziałało, to upewnienie się, że jest w ~jenkins/.ssh/known_hosts.

Edward Samson
źródło
To rozwiązało problem, który miałem, gdzie po skonfigurowaniu pary kluczy, push git
zawodziło
W moim przypadku najłatwiejszym sposobem jest zrobienie tego 'sudo su jenkins', ponieważ nie można poprawnie zalogować się jako użytkownik jenkins. Gdy masz już tożsamość Jenkinsa, możesz ręcznie zalogować się przez ssh do github / bitbucket i zaakceptować klucz zdalnego hosta w imieniu użytkownika jenkins.
LOAS
Ale co, jeśli uczynisz Jenkins Initialization częścią swojego środowiska programistycznego „bootstrap”. „Ręczny” aspekt tego nie działa
TheJediCowboy
13

Jeśli potrzebujesz Jenkinsa, aby uzyskać dostęp do więcej niż 1 projektu, będziesz musiał:
1. dodać klucz publiczny do jednego konta użytkownika github
2. dodać tego użytkownika jako właściciela (aby uzyskać dostęp do wszystkich projektów) lub jako współpracownika w każdym projekcie.

Wiele kluczy publicznych dla jednego użytkownika systemu nie będzie działać, ponieważ GitHub znajdzie pierwszy dopasowany klucz wdrożenia i odeśle błąd, taki jak „BŁĄD: Odmowa dostępu do użytkownika / repo2 dla użytkownika / repo1”

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

Sergii Mostovyi
źródło
2
Odpowiedź dotycząca używania klucza wdrażania działa świetnie, jeśli masz tylko jedno repozytorium. Ale kiedy chcesz, aby serwer CI budował projekty w wielu repozytoriach, od razu możesz zarządzać kilkoma zestawami kluczy (jedna para na repozytorium) i znacznie łatwiej jest zastosować podejście wymienione w tej odpowiedzi.
cclark
Przewodnik tego gościa wyjaśnia, jak ustawić to za pomocą różnych kluczy wdrażania za pomocą ~ / .ssh / config: gist.github.com/victorborda/2871029
Jorge Orpinel
@JorgeOrpinel, uważam, że podejście w linku może zapobiec wyzwalaniu kompilacji za pomocą wtyczki Github. Znalazłem fałszywego użytkownika z jednym kluczem i dostęp do wszystkich repozytoriów działał lepiej, gdy chciałem również, aby kompilacje były wyzwalane przez webhook, ponieważ potrzebowałem adresu URL repozytorium w konfiguracji kompilacji, aby pasował do adresu URL klonu github, zobacz mój inny komentarz
chrisbunney
6

Jenkins tworzy użytkownika Jenkins w systemie. Klucz ssh musi zostać wygenerowany dla użytkownika Jenkins. Oto kroki:

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

Teraz możesz utworzyć poświadczenie Jenkins za pomocą klucza SSH Na pulpicie nawigacyjnym Jenkins Dodaj poświadczenia

wybierz tę opcję

Klucz prywatny: z głównego serwera Jenkins ~ / .ssh

Promień
źródło
1

Miałem podobny problem z gitlabem. Okazuje się, że ograniczyłem użytkowników, którzy mogą logować się przez ssh. Nie wpłynie to na użytkowników github, ale na wypadek, gdyby ludzie trafili tutaj z powodu problemów z gitlab (i tym podobnymi), upewnij się, że dodałeś gitdo AllowUsersustawienia w /etc/ssh/sshd_config:

# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
AllowUsers batman git
Jon
źródło
0

Inną opcją jest użycie osobistych tokenów dostępu GitHub :

  • Wejdź na https://github.com/settings/tokens/new
  • Dodaj zakres repozytorium
  • W Jenkins dodaj źródło GitHub
  • Użyj adresu URL repozytorium HTTPS
  • Dodaj adres URL HTTPS repozytorium git (nie adres SSH , np. https://github.com/my-username/my-project.git)
  • Dodaj dane logowania
    • Rodzaj: nazwa użytkownika z hasłem
    • Nazwa użytkownika: nazwa użytkownika GitHub
    • Hasło: osobisty token dostępu, który utworzyłeś na GitHub
    • ID: coś w stylu github-token-for-my-username

Przetestowałem to na Jenkins ver. 2.222.1 i wtyczka Jenkins GitHub 1.29.5 z prywatnym repozytorium GitHub.

salomwaria
źródło
-1

Alternatywą dla odpowiedzi z sergey_mo jest utworzenie wielu kluczy ssh na serwerze jenkins.

(Chociaż, jak powiedział pierwszy komentator odpowiedzi sergey_mo, może to być bardziej bolesne niż zarządzanie jedną parą kluczy).

orlanthi
źródło
9
Teraz rozumiem, dlaczego po prostu opublikowanie adresu URL jest okropną strategią udzielania odpowiedzi. Powyższy link nie działa.
Dejay Clayton