Llamando a Git en el guión de compilation de Jenkins en Docker

Tengo un script de compilation para un website de Jekyll (páginas GH) que requiere commands de llamada git que requieren authentication Github desde dentro del script. Aquí está el guión:

#!/usr/bin/env bash rm -rf _site/ git clone git@github.com:RIT-EVT/RIT-EVT.github.io.git --branch master --depth 1 _site LIVE_VERSION_BUILD=`cat _site/version` LIVE_VERSION=${LIVE_VERSION_BUILD%.*} LIVE_BUILD=${LIVE_VERSION_BUILD##*.} PACKAGE_VERSION=`sed -nE 's/^\s*"version": "(.*?)",$/\1/p' package.json` if [[ "$LIVE_VERSION" == "$PACKAGE_VERSION" ]]; then LIVE_BUILD=`expr $LIVE_BUILD + 1` else LIVE_VERSION=${PACKAGE_VERSION} LIVE_BUILD=0 fi rm -rf _site/* jekyll build echo "$LIVE_VERSION.$LIVE_BUILD" > _site/version cd _site/ git add -A git commit -m "v$LIVE_VERSION.$LIVE_BUILD $(date)" git push cd .. 

Estoy ejecutando Jenkins dentro de un contenedor Docker que saqué del centro de acoplamiento. Modifiqué el contenedor agregando la misma información de key privada utilizada por Jenkins para realizar el clon inicial del repository. Sin embargo, cuando invoco un command git desde el script, dice que no está autenticado:

 Started by user evt Building in workspace /var/jenkins_home/workspace/Website Deploy > git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url git@github.com:RIT-EVT/RIT-EVT.github.io.git # timeout=10 Fetching upstream changes from git@github.com:RIT-EVT/RIT-EVT.github.io.git > git --version # timeout=10 using GIT_SSH to set cnetworkingentials GitHub - ssh > git fetch --tags --progress git@github.com:RIT-EVT/RIT-EVT.github.io.git +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/develop^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/develop^{commit} # timeout=10 Checking out Revision 85084620e62b5b03f02c610e33880eeb94b12531 (refs/remotes/origin/develop) > git config core.sparsecheckout # timeout=10 > git checkout -f 85084620e62b5b03f02c610e33880eeb94b12531 > git rev-list 85084620e62b5b03f02c610e33880eeb94b12531 # timeout=10 [Website Deploy] $ /bin/bash -xe /tmp/hudson9119924045433544873.sh + rm -rf _site/ + git clone git@github.com:RIT-EVT/RIT-EVT.github.io.git --branch master --depth 1 _site Cloning into '_site'... Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. Build step 'Execute shell' marked build as failure Finished: FAILURE 

Así que la información key está trabajando claramente para el plugin git para jenkins, pero por alguna razón, la key no está siendo recogida por el binary git en el contenedor. Lo que es aún más extraño es que puedo SSH en la máquina en la que se está ejecutando el contenedor, docker exec -it jenkins bash en el contenedor, y ejecuta el mismo command git, y funciona perfectamente.

Esto me hizo pensar que podría ser un problema con los usuarios y los permissions. Así que traté de averiguar qué usuario jenkins está ejecutando el script como. Aquí está el pequeño script que ejecuté:

 echo ${USER} echo hello # Just a sanity test to make sure that echo works :p 

Este es el resultado que obtengo:

 misc. Jenkins stuff... [Website Deploy] $ /bin/sh -xe /tmp/hudson1343134234815638946.sh + echo + echo hello hello Finished: SUCCESS 

Parece que no puede acceder a la información key cargada en ssh-agent porque la secuencia de commands no se está ejecutando bajo el mismo usuario que cargó la key (?)

Cualquier ayuda sería muy apreciada 🙂

Actualizar:

Corrí whoami para ver si eso funcionaría en el guión, y me dio a jenkins como resultado:

 [Website Deploy] $ /bin/bash -xe /tmp/hudson2652666458388248519.sh + whoami jenkins Finished: SUCCESS 

Así que estoy perplejo por qué git no puede recoger la key privada de ssh-agent.

Si bien esto puede haber funcionado para usted, es completamente posible llamar a los commands de git desde contenedores Docker en Jenkins. Simplemente use el complemento de agente SSH al configurar su trabajo de compilation. Esto no solo proporcionará la key SSH que necesita de la tienda de cnetworkingenciales de Jenkins, sino que también configurará y configurará el agente SSH por usted.

Siempre sugiero usar solo keys SSH ya que son más seguras y más difíciles de comprometer.

Además, el complemento de agente SSH también se puede invocar dentro de una secuencia de commands de Jenkins Pipeline. Simplemente envuelva cualquier command que necesite acceso a la key con un bloque sshagent .

Por ejemplo:

 sshagent(cnetworkingentials: ['jenkins-cnetworkingential-id']) { sh 'git clone git@github.com:RIT-EVT/RIT-EVT.github.io.git' sh 'jekyll build' } 

Me di count de lo que estaba mal. Si entro en el contenedor usando docker exec -it jenkins bash , eval `ssh-agent -s` para iniciar el ssh-agent y ssh-add <keyFile> , podría ejecutar el git clone allí mismo en el shell .

Sin embargo, si sale del shell y vuelve a iniciar session ejecutando el mismo command del acoplador, el ssh-agent no se iniciará y no se cargará la key privada, lo que me llevó a creer que el ssh-agent no se estaba ejecutando cuando el La compilation de Jenkins corrió.

Entonces, cambié a usar https con git y a proporcionar un nombre de usuario y una contraseña en la URL del repository utilizando el complemento de enlace de cnetworkingenciales.

Entonces, en esencia, no puedes llamar a los commands de git de los scripts de compilation de Jenkins y esperar poder usar tus keys de SSH.