2012-05-23 10 views

Respuesta

1

Después de usar Jenkins desde hace un tiempo, encontré que debe utilizar el menor número de empleos posible si desea volver a utilizar el directorio de origen.

La configuración predeterminada en Jenkins es que cada compilación utiliza un directorio diferente como su área de trabajo. Lo que implica que debe hacer una comprobación de SVN completa en cada compilación.Que toma para siempre

Si desea utilizar el mismo directorio de origen para cada compilación, debe preocuparse por la sincronización: solo una compilación a la vez. Por lo que sé, Jenkins no tiene medios de sincronización incorporados. La única forma es usar solo un ejecutor. Incluso entonces no puedes controlar la forma en que el ejecutor elige su próximo trabajo.

Digamos que el trabajo "Actualización SVN" desencadena la tarea "Crear". Alguien inicia "SVN actualización # 33", que se supone que desencadena "Build # 33". Sin embargo, si la función "Poll SCM" de Jenkins programa "Actualización SVN" # 34, no he encontrado una forma de decirle que "Build # 33" debe ejecutarse antes de "SVN update # 34". Por lo tanto, es posible que termine con la "actualización SVN # 34" que se ejecuta antes de "Build # 33", y todo falla. A menos que desactive manualmente el trabajo de sondeo. Y recuerda volver a habilitarlo después, por supuesto.

De todos modos. Después de usar Jenkins durante dos años, cambio mi respuesta a: Nunca utilice múltiples trabajos que comparten recursos (como el directorio de origen), y hornee toda la lógica en scripts de shell (para configuraciones de bucle).

+0

Puede usar el [Bloqueador de compilación de Jenkins] (https://wiki.jenkins-ci.org/display/JENKINS/Build+Blocker+Plugin) -plugin para bloquear el trabajo de "Actualización SVN" mientras el "Build" - el trabajo se está ejecutando. –

8

Use Jenkins Matrix job. Defina uno de los ejes como build_mode con los valores Debug y Release. A continuación, ejecuta CMake que creará ambas configuraciones para la herramienta de compilación que utilizará (XCode, gcc, VisualStudio, etc.). Luego puede usar build_mode como si fuera una variable de entorno y pasarla a los pasos de compilación que hacen la compilación real.

+0

Gracias por su respuesta. Pensé eso, pero me tomó un tiempo aclarar los detalles. –

+1

Si la respuesta fue realmente útil, considere [aceptar] (http://meta.stackexchange.com/a/5235/177981) o [votaciones ascendentes] (http://meta.stackexchange.com/a/130054/177981) eso. –

+0

este trabajo con el cmakeplugin? Puse $ build_type en "Otro tipo de compilación" pero no lo expande. – shenshei

9

Me tomó un tiempo resolver esto. Así es como logré hacerlo.

  1. Crea un trabajo de estilo libre "Pago y envío". Este trabajo va a hacer todo lo que no depende del tipo de configuración (Depuración/Liberación).
  2. En "Gestión de código fuente", seleccione Subversion
  3. Complete la URL del repositorio. Probablemente sea una buena idea hacer que apunte a/trunk.
  4. Establezca el directorio del módulo local en "." (sin comillas)
  5. Como estrategia de pago "Emular limpio" es agradable
  6. Generar desencadenador Poll SCM, configure el programa en "5 * * * *" para verificar cada 5 minutos.
  7. Ahora, bajo Opciones de proyecto avanzadas, marque 'Usar área de trabajo personalizada' y establezca el directorio en, p. Ej. "c:/src". No queremos que Jenkins use su espacio de trabajo interno, porque queremos que otros trabajos puedan acceder a la fuente.
  8. En compilación, agregue el siguiente comando de lote de Windows, que se utiliza para limpiar el directorio de compilación. Por algún motivo, CMake no proporciona una forma de hacerlo.

    cd c:\ 
    rmdir /S /Q build 
    mkdir build 
    cd build 
    
    cmake --version 
    rem optionally: svn info c:\src 
    cmake -G "Visual Studio 10" c:\src 
    
  9. Crear otro trabajo "Construir", esta vez lo convierten en un trabajo "de configuración múltiple". Este trabajo se ejecutará para cada configuración (depuración/versión).

  10. En primer lugar, establece la construcción disparadores para construir tras trabajo "Pedido"
  11. Ahora bajo Matriz de configuración de añadir un eje "configuración" con valores "depuración Release" (espacio en blanco = separador). Lamentablemente, el complemento de compilador CMake para Jenkins no funciona con trabajos de configuración múltiple. Ni siquiera podemos usar cmake --build, porque siempre construye la configuración de depuración. Para construir, tenemos que utilizar otro script por lotes:

    cd c:\build 
    call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" 
    msbuild ALL_BUILD.vcxproj /verbosity:minimal /maxcpucount:1 /property:Configuration=%configuration% 
    

Si usted quiere construir la solución completa, especifique el archivo en lugar de .sln ALL_BUILD.vcxproj. Si sólo desea construir un proyecto específico, utilice

msbuild <solution>.sln /target:<project> 
+1

Hasta donde yo sé, "camke --build". siempre compilará la versión de depuración. Tienes que hacer msbuild Project.sln/m/p: Configuration = Release para el lanzamiento – Lap

+0

Ugh, tienes razón. Cambiaré mi respuesta en consecuencia. –

3

Cuando se utiliza el generador de Visual Studio se puede pasar la configuración de construir a la cmake --build -command:

cmake --build . --config Release 
cmake --build . --config Debug 

Véase también el CMake docs.

+1

Depende del generador que esté utilizando. Esto no tendrá ningún efecto para generadores como Makefile. No debe olvidar pasar la opción CMAKE_BUILD_TYPE para generar el paso: 'cmake -DCMAKE_BUILD_TYPE = Release' –

+0

Como la pregunta era sobre Windows, asumí Visual Studio, editaré mi respuesta. –

Cuestiones relacionadas