Autenticar Jenkins CI para el repositorio privado de Github

136

Me gustaría que Jenkins recupere automáticamente datos de mi repositorio privado alojado en Github. Pero no tengo idea de cómo realizar esa tarea. Probé la documentación, generando ssh-key para el usuario de jenkins y todo lo que puedo ver es: "no se puede clonar el repositorio". He comprobado las URL, son válidas.

¿Alguna pista, tal vez conoces algunos documentos / blogs / lo que sea que describa este tipo de cosas?

bx2
fuente
Respondo a esto una pregunta similar, puedes ver la respuesta en el siguiente enlace: jenkins & GitHub
user965062

Respuestas:

139

¿Quizás el soporte de GitHub para implementar claves es lo que estás buscando? Para citar esa página:

¿Cuándo debo usar una clave de implementación?

Simple, cuando tiene un servidor que necesita acceso de extracción a un único repositorio privado. Esta clave se adjunta directamente al repositorio en lugar de a una cuenta de usuario personal.

Si eso es lo que ya está intentando y no funciona, es posible que desee actualizar su pregunta con más detalles de las URL que se utilizan, los nombres y la ubicación de los archivos clave, etc.


Ahora para la parte técnica: ¿Cómo usar su clave SSH con Jenkins?

Si tiene, por ejemplo, un jenkinsusuario de Unix, puede almacenar su clave de implementación ~/.ssh/id_rsa. Cuando Jenkins intenta clonar el repositorio a través de ssh, intentará usar esa clave.

En algunas configuraciones, no puede ejecutar Jenkins como una cuenta de usuario propia, y posiblemente tampoco puede usar la ubicación de clave ssh predeterminada ~/.ssh/id_rsa. En tales casos, puede crear una clave en una ubicación diferente, por ejemplo ~/.ssh/deploy_key, y configurarla sshpara usarla con una entrada en ~/.ssh/config:

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

Debido a que todo lo que se autentica en todos los repositorios de Github usando [email protected]y no desea que la clave anterior se use para todas sus conexiones a Github, creamos un alias de host github-deploy-myproject . Su URL de clonación ahora se convierte en

git clone github-deploy-myproject:myuser/myproject

y eso también es lo que pones como URL de repositorio en Jenkins.

(Tenga en cuenta que debe no poner ssh: // delante para que esto funcione.)

Mark Longair
fuente
44
Pero, ¿cómo creaste una clave para Jenkins?
Thiago Diniz
55
La "clave de despliegue" es cualquier clave SSH antigua. Lo que hice fue ejecutar ssh-keygencomo el usuario Jenkins como ("jenkins" en mi servidor Ubuntu). Luego agregué ~jenkins/.ssh/id_rsa.puba la sección de claves de implementación del repositorio en github.
Adam Monsen
10
en algunas instalaciones, necesitaría eliminar esto, no en el ~directorio. ¡Pero /var/lib/jenkins/.ssh/si el usuario predeterminado de jenkins usa esas teclas!
garmoncheg
77
Para seguir el comentario de @garmoncheg, tenga en cuenta que /var/lib/jenkins es el directorio de inicio ( ~) para el jenkinsusuario.
David Harkness
1
¿Alguien sabe cómo hacer que los ganchos de despliegue funcionen con esto? Veo errores similares Could not match github-deploy-myproject:myuser/myprojecten el registro de gancho. Ingresé eso como mi URL de repositorio y las compilaciones funcionan para que pueda acceder a GitHub. Es solo la publicación de GitHub que no puede activar la compilación.
pogo
36

Una cosa que hizo que esto funcionara para mí es asegurarme de que github.comesté dentro ~jenkins/.ssh/known_hosts.

Edward Samson
fuente
Esto solucionó el problema que tenía cuando después de configurar un par de claves, un
error de
En mi caso, la forma más fácil de hacer esto es hacer 'sudo su jenkins' ya que no es posible iniciar sesión como usuario de jenkins correctamente. Una vez que tenga la identidad de jenkins, puede hacer un inicio de sesión ssh manual en github / bitbucket y aceptar la clave de host remoto en nombre del usuario de jenkins.
LOAS
Pero, ¿qué pasa si hace que Jenkins Initialization forme parte de su entorno de desarrollo 'bootstrap'? El aspecto 'manual' de esto no funciona
TheJediCowboy
13

Si necesita que Jenkins acceda a más de 1 proyecto, deberá:
1. agregar clave pública a una cuenta de usuario de github
2. agregar este usuario como Propietario (para acceder a todos los proyectos) o como Colaborador en cada proyecto.

Muchas claves públicas para un usuario del sistema no funcionarán porque GitHub encontrará la primera clave de implementación coincidente y enviará un error como "ERROR: Permiso al usuario / repo2 denegado al usuario / repo1"

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

Sergii Mostovyi
fuente
2
La respuesta sobre el uso de una clave de despliegue funciona muy bien si solo tiene un repositorio único. Pero cuando desea que un servidor CI cree proyectos a través de múltiples repositorios, está inmediatamente en la posición de administrar varios conjuntos de claves (un par por repositorio) y se vuelve mucho más fácil adoptar el enfoque que figura en esta respuesta.
cclark
La guía de este tipo explica cómo configurarla mediante diferentes teclas de implementación mediante ~ / .ssh / config: gist.github.com/victorborda/2871029
Jorge Orpinel
@JorgeOrpinel, creo que el enfoque en el enlace puede evitar que los webhooks de github activen compilaciones utilizando el complemento Github. Encontré un usuario ficticio con una sola clave y el acceso a todos los repositorios funcionó mejor cuando también quería que las compilaciones fueran activadas por un webhook, porque necesitaba la URL del repositorio en la configuración de compilación para que coincida con la URL del clon de github, vea mi otro comentario
chrisbunney
6

Jenkins crea un usuario Jenkins en el sistema. La clave ssh debe generarse para el usuario de Jenkins. Aquí están los pasos:

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

Ahora puede crear una credencial de Jenkins utilizando la clave SSH En el panel de Jenkins Agregar credenciales

selecciona esta opción

Clave privada: del maestro Jenkins ~ / .ssh

Rayo
fuente
1

Tuve un problema similar con gitlab. Resulta que restringí a los usuarios que pueden iniciar sesión a través de ssh. Esto no afectará a los usuarios de github, pero en caso de que las personas terminen aquí por problemas de gitlab (y similares), asegúrese de agregar gita la AllowUsersconfiguración en /etc/ssh/sshd_config:

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

Otra opción es usar tokens de acceso personal de GitHub :

  • Vaya a https://github.com/settings/tokens/new
  • Agregar repositorio alcance de
  • En Jenkins, agregue un GitHub fuente de
  • Usar URL HTTPS de repositorio
  • Agregue la URL HTTPS del repositorio git (no la SSH , por ejemplo.https://github.com/my-username/my-project.git )
  • Añadir credencial
    • Tipo: nombre de usuario con contraseña
    • Nombre de usuario: el nombre de usuario de GitHub
    • Contraseña: el token de acceso personal que creó en GitHub
    • ID: algo como github-token-for-my-username

Probé esto en Jenkins ver. 2.222.1 y Jenkins GitHub plugin 1.29.5 con un repositorio privado de GitHub.

salomvario
fuente
-1

Una alternativa a la respuesta de sergey_mo es crear múltiples claves ssh en el servidor jenkins.

(Aunque, como dijo el primer comentarista de la respuesta de sergey_mo, esto puede terminar siendo más doloroso que administrar un solo par de claves).

orlanthi
fuente
9
Ahora veo por qué simplemente publicar una URL es una estrategia terrible para las respuestas. El enlace de arriba está muerto.
Dejay Clayton