Obtener GitLab CI para clonar repositorios privados


Tengo GitLab y GitLab CI configurados para alojar y probar algunos de mis repositorios privados. Para mis módulos composer bajo este sistema, tengo Satis configurados para resolver mis paquetes privados.

Obviamente estos paquetes privados requieren una clave ssh para clonarlos, y esto funciona en la terminal - puedo ejecutar composer install y obtener estos paquetes, siempre y cuando tenga la clave agregada con ssh-add en el shell.

Sin embargo, al ejecutar mis pruebas en GitLab CI, si un proyecto tiene alguno de estos dependencias las pruebas no se completarán ya que mi instancia de GitLab necesita autenticación para obtener el deps (obviamente), y la prueba falla diciendo Host key verification failed.

Mi pregunta es ¿cómo configuro esto para que cuando el corredor ejecute la prueba pueda autenticarse en gitlab sin contraseña? He intentado poner una clave ssh sin contraseña en mi carpeta runners ~/.ssh, sin embargo la compilación ni siquiera agrega la clave, "eval ssh-agent -s" seguido de ssh-add parece fallar diciendo que el agente no se está ejecutando...

Author: CSchulz, 2014-09-05

7 answers

Estoy publicando esto como una respuesta ya que otros no fueron completamente claros y/o detallados en MI humilde opinión

A partir de GitLab 8.12+, asumiendo que el repositorio del submódulo está en el mismo servidor que el que lo solicita, ahora puede:

  1. Configura el repositorio con submódulos de git como de costumbre (git submodule add git@somewhere:folder/mysubmodule.git)

  2. Modifique su archivo .gitmodules de la siguiente manera

    [submodule "mysubmodule"]
      path = mysubmodule
      url = ../../group/mysubmodule.git
    

    Donde `../../ group / mysubmodule.git ' es una ruta relativa desde tu repositorio hasta el submódulo una.

  3. Añadir las siguientes líneas a gitlab-ci.yml

    variables:
      GIT_SUBMODULE_STRATEGY: recursive
    

    Para indicar al corredor que obtenga todos los submódulos antes de la compilación.

Advertencia: si su corredor parece ignorar la directiva GIT_SUBMODULE_STRATEGY, probablemente debería considerar actualizarla.

(fuente: https://docs.gitlab.com/ce/ci/git_submodules.html)

 12
Author: Marco A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-14 11:01:34

Aquí un howto completo:

Diseño general

  • generando un par de claves SSH
  • agregar la privada como variable de entorno seguro de su proyecto
  • hacer que el privado esté disponible para sus scripts de prueba en GitLab-CI
  • agregar la pública como clave de despliegue en cada una de sus dependencias privadas

Generando un par de claves SSH públicas y privadas

Generar un par de claves SSH públicas y privadas sin contraseña:

ssh-keygen -b 4096 -C "<name of your project>" -N "" -f /tmp/name_of_your_project.key

Añadiendo la clave SSH privada a tu proyecto

Debe agregar la clave como una variable de entorno seguro a su proyecto como siguiente:

  • examinar https://<gitlab_host>/<group>/<project_name>/variables
  • haga clic en"Agregar una variable"
  • rellene el campo de texto Key con SSH_PRIVATE_KEY
  • rellene el campo de texto Value con la propia clave privada SSH
  • haga clic en"Guardar cambios"

Exponiendo la clave SSH privada a sus scripts de prueba

Con el fin de haga que su clave privada esté disponible para sus scripts de prueba que necesita agregar lo siguiente a su archivo .gitlab-ci.yml:

before_script:
  # install ssh-agent
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  # run ssh-agent
  - eval $(ssh-agent -s)
  # add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  # disable host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
  # WARNING: use only in docker container, if you use it with shell you will overwrite your user's ssh config
  - mkdir -p ~/.ssh
  - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

El fragmento de código proviene de la documentación de GitLab

Agregar la clave pública SSH como clave de despliegue a todas sus dependencias privadas

Debe registrar la clave SSH pública como clave de despliegue para todos sus datos privados dependencias como sigue:

  • examinar https://<gitlab_host>/<group>/<dependency_name>/deploy_keys
  • haga clic en"Nueva clave de despliegue"
  • rellene el campo de texto Title con el nombre de su proyecto
  • rellene el campo de texto Key con la propia clave SSH pública
  • haga clic en"Crear clave de despliegue"
 34
Author: toch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-04 16:15:03

Solucionado esto agregando la clave a los hosts conocidos con ssh-keyscan -H 'localgitlab.co.uk' >> ~gitlab_ci_runner/.ssh/known_hosts

 4
Author: danbroooks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-06 16:40:21

Si no desea jugar con las claves o submódulos ssh, puede anular el repositorio en la configuración de git para autenticarse con el token de trabajo en su lugar (en gitlab-ci.yml):

before_script:
  - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/group/repo.git".insteadOf [email protected]:group/repo.git
 2
Author: a544jh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-25 13:35:29

Utilicé deploy tokens para resolver este problema, ya que la configuración de claves SSH para un corredor de prueba parece un poco larga.

git clone http://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git

Los tokens de implementación son por proyecto y son de solo lectura.

 1
Author: Juddling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-11 14:49:22

Tuve un escenario en el que tuve que usar mi clave ssh en 3 scripts diferentes, así que puse las cosas de la clave ssh en un solo script de shell y lo llamé primero, antes que los otros 3 scripts. Esto terminó sin funcionar, creo que debido a que ssh-agent no persistía entre scripts de shell, o algo en ese sentido. Terminé simplemente enviando la clave privada al archivo ~/.ssh/id_rsa, que seguramente persistirá en otros scripts.

.gitlab-ci.yml

script:
    - ci/init_ssh.sh
    - git push # or whatever you need ssh for

Ci/init_ssh.sh

# only run in docker:
[[ ! -e /.dockerenv ]] && exit 0

mkdir -p ~/.ssh
echo "$GITLAB_RUNNER_SSH_KEY" > ~/.ssh/id_rsa
chmod 400 ~/.ssh/id_rsa
echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > /.ssh/config

It funciona como un encanto!

 0
Author: user3246077,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-15 21:08:55

Parece que finalmente hay una solución razonable.

En resumen, a partir de GitLab 8.12, todo lo que necesita hacer es usar rutas relativas en el .submodules, y el git submodule update --init simplemente funcionará

 0
Author: Eri Rubin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 01:58:06