hudson - online - jenkins project
Implementando una compilaciĆ³n para un compromiso en Jenkins/Hudson (6)
Aún no, hay una solicitud de función que cubre este tipo de compilación, pero todavía está abierta: Issue 673
Usamos Jenkins para hacer compilaciones incrementales de nuestro proyecto en cada compromiso con el SCM. Nos gustaría obtener versiones separadas para cada compromiso. Sin embargo, el enfoque ingenuo (configurar SCM y usar enganches posteriores a la confirmación para desencadenar una compilación) presenta un problema en el siguiente escenario:
- La construcción se desencadena.
- Mientras se lleva a cabo la compilación (puede llevar varios minutos), dos desarrolladores realizan dos compromisos separados para el SCM.
- Una nueva compilación se activa. Recibe cambios de ambas confirmaciones, realizadas durante la construcción previa.
Esta "condición de carrera" complica la búsqueda de cuál de las confirmaciones ha roto las advertencias de compilación / presentación.
La solución empleada actualmente es verificar cambios en un trabajo ("trabajo del planificador") y desencadenar otro trabajo para hacer el pago y la construcción reales.
¿Hay alguna solución adecuada a este problema?
Como señaló alguien en el Issue 673 , podrías intentar comenzar una construcción parametrizada con el parámetro que es la confirmación real de git que quieres construir. Esto en combinación con un gancho de compromiso de VCS.
No creo que lo que te gustaría hacer sea posible. El "período de silencio" mencionado por Daniel Kutik en realidad se utiliza para decirle a Hudson / Jenkins cuánto tiempo esperar, para permitir que otros compromisos para el mismo proyecto sean recogidos. Es decir, si configuras este valor en 60 segundos y has realizado una confirmación, esperará un minuto antes de comenzar una nueva compilación, lo que permitirá que también se recojan otras confirmaciones (durante ese minuto).
Si usas la regla " NO COMPROMETERSE en una compilación rota" y la llevas a su conclusión lógica, en realidad terminas con "No comprometer una compilación rota o una compilación en progreso", en cuyo caso el problema que describes desaparece .
Dejame explicar. Si tiene dos desarrolladores trabajando en el mismo proyecto y ambos intentan comprometerse (o presionar si está usando DVCS). Uno de ellos tendrá éxito y los otros fallarán y deberán actualizarse antes de la confirmación.
El desarrollador que tuvo que hacer la actualización sabe por el historial de confirmaciones, que el otro compromiso fue reciente y, por lo tanto, una compilación en progreso (incluso si aún no se ha desprotegido). No saben si esa compilación aún está rota, por lo que la única opción segura es esperar y ver.
Lo único que le impediría utilizar el enfoque anterior es si la compilación demora tanto, en cuyo caso es posible que sus desarrolladores nunca tengan la oportunidad de comprometerse (siempre está aumentando). Este es entonces un controlador para dividir su compilación en una cartera de varios pasos, de modo que el trabajo Postcomit no tome más de 5 minutos, pero idealmente es 1 minuto.
Tal vez se pierda el punto, pero tenemos un proceso de construcción bastante bueno que se ejecuta aquí.
- Usamos git como nuestro sistema de control de fuente
- Usamos Gerrit como nuestra herramienta de revisión
- Usamos el activador gerrit para ejecutar compilaciones en nuestro servidor jenkins
- Comprobamos los cambios en la rama de desarrollo para ejecutar jenkins cuando se fusiona un conjunto de cambios
En resumen, el día ideal para desarrolladores es como este
- desarrollador 1 protagoniza una nueva sucursal para hacer sus cambios, en función de nuestra rama principal de desarrollo
- El desarrollador 1 se compromete con la frecuencia que le gusta
- el desarrollador 1 cree que terminó su trabajo, combina sus cambios en un cambio y lo empuja a gerrit
- Se crea un nuevo cambio gerrit y jenkins intenta construir exactamente este cambio
- Cuando no hay errores durante la compilación, se realiza una revisión de este cambio
- Cuando se envía la revisión, el conjunto de cambios se fusiona en la rama de desarrollo del repositorio principal (ningún cambio se fusiona en la rama de desarrollo, sin revisión)
- Jenkins construye la versión fusionada para asegurarse de que no hay errores de fusión
ningún desarrollador 2 se une a la fiesta e intenta hacer algo de trabajo
el proceso es exactamente el mismo, ambos empiezan a funcionar, allí hay ramas. El desarrollador 1 es más rápido y sus cambios se fusionan en la rama de desarrollo. Ahora, antes de que el desarrollador 2 pueda publicar sus cambios, debe volver a establecer sus cambios en base a los cambios realizados por el desarrollador 1.
Así que estamos seguros de que el proceso de compilación se activa para cada cambio realizado en nuestra base de código.
Usamos esto para nuestro desarrollo de C # - en Windows no en Linux
Creo que lo que podría ayudar es establecer el Periodo de silencio (Jenkins> Gestionar Jenkins> Configurar sistema) en 0
y el sondeo SCM en muy poco tiempo. Pero incluso durante ese corto intervalo podría haber dos commits. A partir de ahora, Jenkins no tiene la función de dividir compilación en compilaciones simples en múltiples compromisos SVN.
Aquí hay un tutorial sobre ese tema: Característica de período de silencio .