Autenticar Jenkins CI para repositório privado Github

136

Gostaria que o Jenkins buscasse automaticamente dados do meu repositório privado hospedado no Github. Mas não tenho idéia de como realizar essa tarefa. Tentei a documentação, gerando ssh-key para o usuário jenkins e tudo o que vejo é: "incapaz de clonar o repositório". Eu verifiquei os URLs - eles são válidos.

Alguma pista, talvez você conheça alguns documentos / blogs / o que quer que esteja descrevendo esse tipo de coisa?

bx2
fonte
Eu respondo a uma pergunta semelhante, você pode ver a resposta no link abaixo: jenkins e GitHub
user965062

Respostas:

139

Talvez o suporte do GitHub para implantar chaves seja o que você está procurando? Para citar essa página:

Quando devo usar uma chave de implantação?

Simples, quando você tem um servidor que precisa obter acesso a um único repositório particular. Essa chave é anexada diretamente ao repositório em vez de a uma conta de usuário pessoal.

Se é isso que você já está tentando e não funciona, convém atualizar sua pergunta com mais detalhes dos URLs que estão sendo usados, os nomes e o local dos arquivos principais etc.


Agora, para a parte técnica: Como usar sua chave SSH com Jenkins?

Se você possui, digamos, um jenkinsusuário unix, pode armazenar sua chave de implantação ~/.ssh/id_rsa. Quando Jenkins tenta clonar o repositório via ssh, ele tenta usar essa chave.

Em algumas configurações, você não pode executar o Jenkins como uma conta de usuário e, possivelmente, também não pode usar o local padrão da chave ssh ~/.ssh/id_rsa. Nesses casos, você pode criar uma chave em um local diferente, por exemplo ~/.ssh/deploy_key, e configurar sshpara usar isso com uma entrada em~/.ssh/config :

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

Como tudo o que você autentica em todos os repositórios do Github usando [email protected]e você não deseja que a chave acima seja usada para todas as suas conexões com o Github, criamos um alias de host github-deploy-myproject . O URL do seu clone agora se torna

git clone github-deploy-myproject:myuser/myproject

e é também isso que você coloca como URL de repositório no Jenkins.

(Observe que você não deve colocar ssh: // na frente para que isso funcione.)

Mark Longair
fonte
4
Mas como você criou uma chave para o jenkins?
Thiago Diniz
5
A "chave de implantação" é qualquer chave SSH antiga. O que eu fiz foi executar ssh-keygencomo o usuário Jenkins como ("jenkins" no meu servidor Ubuntu). Em seguida, adicionei ~jenkins/.ssh/id_rsa.pubà seção deploy keys do repositório no github.
Adam Monsen
10
em algumas instalações, você precisaria colocar isso fora do ~diretório. Mas /var/lib/jenkins/.ssh/para o usuário jenkins padrão usar essas chaves!
garmoncheg
7
Para acompanhar o comentário de @garmoncheg, observe que /var/lib/jenkins é o diretório inicial ( ~) do jenkinsusuário.
David Harkness
1
Alguém sabe como implantar ganchos trabalhando com isso? Estou vendo erros semelhantes Could not match github-deploy-myproject:myuser/myprojectno log do gancho. Eu inseri isso como meu URL de repositório e as compilações funcionam para que ele possa acessar o GitHub. É apenas a postagem do GitHub que falha ao acionar a compilação.
pogo
36

Uma coisa que fez isso funcionar para mim é ter certeza de que github.comestá dentro ~jenkins/.ssh/known_hosts.

Edward Samson
fonte
Isso corrigiu o problema que eu estava tendo, onde após a criação de um par de chaves, um git push estava falhando
chrisbunney
No meu caso, a maneira mais fácil de fazer isso é 'sudo su jenkins', pois não é possível fazer login como o usuário jenkins corretamente. Depois de ter a identidade do jenkins, você pode fazer um login ssh manual no github / bitbucket e aceitar a chave do host remoto em nome do usuário do jenkins.
LOAS
Mas e se você fizer da Jenkins Initialization parte do seu ambiente de desenvolvimento 'bootstrap'. O aspecto 'manual' disso não funciona #
TheJediCowboy
13

Se você precisar que o Jenkins acesse mais de um projeto, será necessário:
1. adicionar chave pública a uma conta de usuário do github
2. adicionar esse usuário como proprietário (para acessar todos os projetos) ou como colaborador em cada projeto.

Muitas chaves públicas para um usuário do sistema não funcionarão porque o GitHub encontrará a primeira chave de implantação correspondente e retornará um erro como "ERRO: Permissão para o usuário / repo2 negada ao usuário / repo1"

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

Sergii Mostovyi
fonte
2
A resposta sobre o uso de uma chave de implantação funciona muito bem se você tiver apenas um repositório. Mas quando você deseja que um servidor de IC crie projetos em vários repositórios, você está imediatamente na posição de gerenciar vários conjuntos de chaves (um par por repositório) e fica muito mais fácil adotar a abordagem listada nesta resposta.
Cclark
Este guia do cara explica como configurá-lo através de diferentes chaves Implantar usando ~ / .ssh / config: gist.github.com/victorborda/2871029
Jorge Orpinel
@JorgeOrpinel, acredito que a abordagem no link pode impedir que os webhooks do github acionem construções usando o plug-in do Github. Eu encontrei um usuário fictício com uma única chave e acesso a todos os repos funcionou melhor quando eu também queria constrói para ser desencadeada por uma webhook, porque eu precisava do Repositório URL na configuração de compilação para coincidir com a URL clone github, veja meu outro comentário
chrisbunney
6

Jenkins cria um usuário Jenkins no sistema. A chave ssh deve ser gerada para o usuário Jenkins. Aqui estão os passos:

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

Agora você pode criar uma credencial Jenkins usando a chave SSH No painel do Jenkins Adicionar credenciais

selecione esta opção

Chave privada: do mestre Jenkins ~ / .ssh

Raio
fonte
1

Eu tive um problema semelhante com o gitlab. Acontece que eu havia restringido os usuários que têm permissão para fazer login via ssh. Isso não afetará os usuários do github, mas, caso as pessoas acabem aqui por problemas no gitlab (e similares), certifique-se de adicionar gita AllowUsersconfiguração em /etc/ssh/sshd_config:

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

Outra opção é usar os tokens de acesso pessoal do GitHub :

  • Acesse https://github.com/settings/tokens/new
  • Adicionar escopo de repo
  • No Jenkins, adicione uma fonte do GitHub
  • Usar URL HTTPS do repositório
  • Adicione o URL HTTPS do repositório git (não o SSH , por exemplo https://github.com/my-username/my-project.git) .
  • Adicionar credencial
    • Tipo: Nome de usuário com senha
    • Nome de usuário: o nome de usuário do GitHub
    • Senha: o token de acesso pessoal que você criou no GitHub
    • ID: algo como github-token-for-my-username

Eu testei isso no Jenkins ver. 2.222.1 e Jenkins GitHub plugin 1.29.5 com um repositório GitHub particular.

salomário
fonte
-1

Uma alternativa à resposta de sergey_mo é criar várias chaves ssh no servidor jenkins.

(Embora, como disse o primeiro comentarista da resposta de sergey_mo, isso possa acabar sendo mais doloroso do que gerenciar um único par de chaves.)

orlanthi
fonte
9
Agora vejo por que simplesmente postar um URL é uma péssima estratégia para respostas. O link acima está morto.
DeJay Clayton