¿Cómo puedo hacer que un trabajo de Jenkins comience después de que varios trabajos ascendentes simultáneos tengan éxito?


Para obtener la retroalimentación más rápida posible, ocasionalmente queremos que los trabajos de Jenkins se ejecuten en Paralelo. Jenkins tiene la capacidad de iniciar múltiples trabajos descendentes (o 'bifurcar' la canalización) cuando finaliza un trabajo. Sin embargo, Jenkins no parece tener ninguna manera de hacer que un trabajo descendente solo comience con éxito todas las ramas de esa bifurcación (o 'unir' la bifurcación de nuevo).

Jenkins tiene un botón" Build after other projects are built", pero lo interpreto como " start this job when cualquier trabajo ascendente finaliza" (no "inicie este trabajo cuando todos los trabajos ascendentes tengan éxito").

Aquí hay una visualización de lo que estoy hablando. ¿Alguien sabe si existe un plugin para hacer lo que busco? Construir Tubería


Editar:

Cuando originalmente publiqué esta pregunta en 2012, la respuesta de Jason (los complementos Join y Promoted Build) fue la mejor, y la solución con la que opté.

Sin embargo, la respuesta de dnozay (El plugin Build Flow) se hizo popular un año o así que después de esta pregunta, que es una respuesta mucho mejor. Por si sirve de algo, si la gente me hace esta pregunta hoy, ahora recomiendo que en su lugar.

Author: Captain Man, 2012-01-26

6 answers

Hay dos soluciones que he utilizado para este escenario en el pasado:

  1. Utilice el complemento Join en su trabajo "deploy" y especifique "promote" como el trabajo objetivo. Tendría que especificar " Pruebas Funcionales "y" Pruebas de Rendimiento " como los trabajos unidos e iniciarlos a través de alguna manera, post build. El complemento de Disparador parametrizado es bueno para esto.

  2. Use el complemento de Compilaciones promocionadas en su trabajo "deploy", especifique una promoción esto funciona cuando se completan los trabajos posteriores y se especifican los trabajos de prueba funcionales y de rendimiento. Como parte de la acción de promoción, activar el trabajo "promover". Todavía tiene que iniciar los dos trabajos de prueba desde "deploy"

Hay un aspecto CRÍTICO en ambas soluciones: las huellas dactilares deben utilizarse correctamente. Esto es lo que encontré:

  1. El trabajo "build" debe ORIGINAR un nuevo archivo de huellas dactilares. En otras palabras, tiene que tomar las huellas de algún archivo que Jenkins piensa que era originado por el trabajo inicial. Vuelva a comprobar el enlace "Ver huellas dactilares" del trabajo para verificar esto.
  2. Todos los trabajos vinculados hacia abajo (en este caso, "deploy", "Functional Tests" y "Performance tests") necesitan obtener y tomar huellas dactilares de este mismo archivo. El plugin Copiar artefactos es genial para este tipo de cosas.
  3. Tenga en cuenta que algunos complementos le permiten cambiar el orden de la huella digital y el inicio del trabajo descendente; en este caso, la huella digital DEBE ocurrir antes de una job imprime el mismo archivo para asegurarse de que el ORIGEN de la huella dactilar esté configurado correctamente.
 26
Author: Jason Swager,
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
2012-02-08 18:15:40

Plugin de canalización

Puede usar el complemento de canalización (anteriormente workflow-plugin).

Viene con muchos ejemplos, y usted puede seguir este tutorial.

Por ejemplo

// build
stage 'build'
...

// deploy
stage 'deploy'
...

// run tests in parallel
stage 'test'
parallel 'functional': {
  ...
}, 'performance': {
  ...
}

// promote artifacts
stage 'promote'
...

Plugin de flujo de compilación

También puedes usar el plugin Build Flow. Es simplemente impresionante - pero está en desuso (desarrollo congelado).

Configurar los trabajos

Crear puestos de trabajo por:

  • construir
  • desplegar
  • pruebas de rendimiento
  • pruebas funcionales
  • promoción

Configurando el upstream

  1. En el upstream (aquí build) crear un artefacto único, por ejemplo:

    echo ${BUILD_TAG} > build.tag
    
  2. Archive el artefacto build.tag.

  3. registrar huellas dactilares para rastrear el uso del archivo; si cualquier trabajo copia el mismo archivo build.tag y registra huellas dactilares, podrá rastrear el padre.
  4. Configure para ser promovido cuando el trabajo promotion se realice correctamente.

Configurando los trabajos descendentes

  1. Utilizo 2 parámetros PARENT_JOB_NAME y PARENT_BUILD_NUMBER
  2. Copie los artefactos del trabajo upstream build usando el complemento Copy Artifact

    • Nombre del proyecto = ${PARENT_JOB_NAME}
    • Que build = ${PARENT_BUILD_NUMBER}
    • Artefactos a copiar = build.tag
  3. Grabar huellas dactilares; eso es crucial.

Configurar el trabajo de promoción descendente

Haga lo mismo que lo anterior, para establecer una relación aguas arriba-aguas abajo. No necesita ningún paso de construcción. Puedes realizar acciones adicionales post-build como "hey QA, es tu turno".

Crear un trabajo de flujo de compilación

// start with the build
parent = build("build")
parent_job_name = parent.environment["JOB_NAME"]
parent_build_number = parent.environment["BUILD_NUMBER"]

// then deploy
build("deploy")

// then your qualifying tests
parallel (
    { build("functional tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) },
    { build("performance tests",
          PARENT_BUILD_NUMBER: parent_build_number,
          PARENT_JOB_NAME: parent_job_name) }
)

// if nothing failed till now...
build("promotion",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

// knock yourself out...
build("more expensive QA tests",
    PARENT_BUILD_NUMBER: parent_build_number,
    PARENT_JOB_NAME: parent_job_name)

Buena suerte.

 30
Author: dnozay,
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
2016-07-01 23:25:25

Jenkins recientemente anunció soporte de primera clase para workflow.

 11
Author: Andrew Gray,
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
2015-01-01 06:49:07

El complemento Multijob funciona muy bien para ese escenario. También es útil si desea que un solo trabajo "padre" inicie varios trabajos "hijos" pero aún así pueda ejecutar cada uno de los hijos manualmente, por sí mismos. Esto funciona mediante la creación de "fases", a la que se añade 1 a n trabajos. La compilación solo continúa cuando se realiza toda la fase, por lo que si una fase como varios trabajos, todos deben completarse antes de que se ejecuten el resto. Naturalmente, es configurable si la construcción continúa si hay un fallo dentro de la fase.

 8
Author: tbradt,
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
2013-06-11 15:42:57

Las respuestas de jason & dnozay son suficientemente buenas. Pero en caso de que alguien esté buscando una manera fácil, simplemente use JobFanIn plugin .

 3
Author: Yogesh,
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
2016-04-01 05:01:53

Creo que el Complemento de Flujo de trabajo ahora se llama el Complemento de Canalización y es la solución preferida (actual) a la pregunta original, inspirada en el Complemento Build Flow. También hay un Tutorial de Introducción en GitHub.

 1
Author: geipel,
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
2016-02-14 19:39:15