Los submódulos de Git no se actualizan en la compilación de Jenkins

85

Tengo un submódulo en un proyecto en Jenkins. He habilitado la configuración avanzada para actualizar submódulos de forma recursiva.

Cuando ejecuto la compilación, veo que el espacio de trabajo tiene los archivos del submódulo. El problema es que parece ser la primera revisión del submódulo. Cuando presiono cambios (repositorio alojado en GitHub), Jenkins no parece actualizar el submódulo para obtener los cambios correctos. ¿Alguien ha visto esto alguna vez?

Ben
fuente

Respuestas:

96

Tenga en cuenta que el complemento Jenkins Git 2.0 tendrá "comportamientos de submódulo avanzados", lo que debería garantizar las actualizaciones adecuadas de los submódulos:

git 2.0

Como se ha comentado por vikramvi:

Advanced sub-modules behavior> " Path of the reference repo to use during submodule update" en este campo, agregue el submódulo git url.

Camino


Owen B menciona en los comentarios :

Para el problema de autenticación, ahora hay una opción "Usar credenciales desde el control remoto predeterminado del repositorio principal".

Visto aquí en JENKINS-20941 :

https://issues.jenkins-ci.org/secure/attachment/33245/Screen%20Shot%202016-07-08%20at%2010.09.17.png

VonC
fuente
6
¿Pero cómo? ¿También puede proporcionar pasos detallados, qué opciones elegir? Gracias.
zavié
8
@ zavié Creo que deberías elegir "Comportamiento avanzado de submódulos" y luego marcar la casilla de verificación "Actualizar submódulos de forma recursiva" que aparecerá, y hacer clic en Guardar.
KajMagnus
9
Esto no funciona del todo si estás usando un repositorio privado.
Erik
1
Funcionó perfectamente para mí con un repositorio privado
davegallant
3
Esto solo funciona si su repositorio no requiere autenticación para leer su submódulo git. Error de Jenkins.
Ernst Kuschke
33

Esto se trata en la documentación del complemento Git en el sitio de Jenkins en la sección: Submódulos recursivos .

extracto

El complemento GIT admite repositorios con submódulos que, a su vez, tienen submódulos. Sin embargo, esto debe estar activado: en Configuración del trabajo -> Sección Gestión de código fuente , Git -> Botón avanzado (en Ramas para construir) -> Actualizar submódulos de forma recursiva .

Ejemplo

Desde la pantalla de configuración de su trabajo, en la sección Administración de código fuente, jale el botón Agregar hacia abajo y seleccione "Comportamiento avanzado de submódulos".

   s1

                                 s2

Luego seleccione "Actualizar submódulos de forma recursiva":

   s3

slm
fuente
1
gracias, pero esto no funcionó en el momento en que probé esto (hace casi 2 años)
Ben
@Ben - Bien, acabo de probar esto y funcionó para mí. Puede estar relacionado con sus versiones.
SLM
1
Esto solo funciona si su repositorio no requiere autenticación para leer su submódulo git.
Ernst Kuschke
@ErnstKuschke: creo que a Jenkins se le puede dar una clave SSH para que también pueda interactuar con repositorios que requieren autenticación.
slm
29

¿Sabe que su repositorio de Git siempre se refiere a una revisión particular de un submódulo? Jenkins no cambiará automáticamente la revisión.

Si desea utilizar una revisión más reciente del submódulo, debe hacerlo en su repositorio local de Git:

cd submoduledir
git pull
cd ..
git add submoduledir
git commit -m 'Updated to latest revision of submoduledir'
git push # Go and watch Jenkins build with the new revision of the submodule

Cuando lo hace así, Jenkins verificará exactamente la misma revisión del submódulo durante la compilación. Jenkins no decide por sí solo qué revisión del submódulo utilizar. Esta es la diferencia fundamental entre los submódulos de Git y los externos de SVN.

Es posible que desee leer una buena referencia sobre submódulos, por ejemplo, http://progit.org/book/ch6-6.html .

sti
fuente
1
El enlace ProGit que dio @sti no está actualizado. Creo que este es el equivalente actual https://git-scm.com/book/en/v2/Git-Tools-Submodules
Stevel
El enlace está roto (¿relacionado con HTTPS?) - "502 Bad Gateway" .
Peter Mortensen
17

Finalmente tropecé con una forma de hacer esto y es simple.

La cuestión:

La clonación inicial con credenciales funciona bien, pero la submoduleclonación posterior falla con credenciales incorrectas.

  1. Clonación automática avanzada de submódulos Source Code Management >> Additional Behaviours >> Advanced sub-modules behaviours: da como resultado un error de credencial.
  2. git submodule update --initen la Execute Shellsección también falla con error de credenciales.

La solución:

Estoy usando jenkins-1.574.

  1. Marque la Build Environment >> SSH Agentcasilla.
  2. Seleccione las credenciales correctas (probablemente las mismas que las seleccionadas en la Source Code Managementsección
  3. Actualizar submódulos en la Execute Shellsección

    git submodule sync
    git submodule update --init --recursive
    

Aquí hay una captura de pantallaingrese la descripción de la imagen aquí

potencia
fuente
3
Ya no existe esa casilla de verificación.
adi518
11

Parece que encontré una solución:

Agregué un paso de compilación para ejecutar los siguientes comandos de shell:

git submodule foreach git checkout master
git submodule foreach git pull
Ben
fuente
Sin embargo, después de ejecutar esos comandos, es posible que deba realizar la confirmación en el superproyecto, ya que HEAD en sus submódulos se habrá actualizado.
Slacy
Hola Ben, ¿podrías compartir tu solución con un poco más de detalle? Yo quiero hacer lo mismo. Además, solo para confirmar, su solución git submodule actualizará los submódulos de un proyecto en el WORKSPACE, ¿no?
Kim Stacks
no hay muchos más detalles que eso. Acabo de agregar esas 2 líneas a mi proceso de compilación y siempre extrae la última versión del submódulo.
Ben
10
Como dice @sti en otra respuesta aquí, parece que está tratando de usar submódulos de Git como los externos de SVN. En lugar de agregar estos comandos a Jenkins, sería mejor enviar las versiones adecuadas del submódulo a su repositorio principal de Git. Jenkins siempre verificará la misma versión de los submódulos cuando compile una versión particular de su proyecto. Las construcciones reproducibles son algo bueno.
Cody Casterline
4
@ben Encontré este comando que podría resultarle más útil, especialmente si no está utilizando la rama maestra en el submódulo git submodule update --init --recursive
Corey Scott
7

Si está utilizando el módulo Jenkins Git, puede configurarlo en "Limpiar el espacio de trabajo antes de compilar", de esta manera siempre obtendrá el submódulo correcto.

Amin Y
fuente
2

Estoy usando canalización con script con el complemento de pago. Si desea que los submódulos sean los mismos que en su repositorio, simplemente desactive la opción trackingSubmodules de esta manera:

checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: false, reference: '', trackingSubmodules: false]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '[myCredentials]', url: 'https://git.myRepo.git']]])
Jochen Gunzelmann
fuente