web-dev-qa-db-fra.com

Comment faire en sorte qu'un travail Jenkins démarre après la réussite de plusieurs travaux en amont simultanés?

Afin d'obtenir le retour le plus rapide possible, nous souhaitons parfois que les tâches Jenkins soient exécutées en parallèle. Jenkins a la capacité de démarrer plusieurs tâches en aval (ou de "répartir" le pipeline) à la fin d'une tâche. Cependant, Jenkins ne semble pas avoir aucun moyen de faire en aval un travail que le démarrage de toutes les branches de cette fourche (ou "rejoindre" la fourche ensemble).

Jenkins a un bouton "Construire après que d'autres projets soient construits", mais j'interprète cela comme "démarre ce travail quand n'importe lequel le travail en amont se termine" (pas "commence ce travail quand tous travaux en amont réussissent ").

Voici une visualisation de ce dont je parle. Est-ce que quelqu'un sait s'il existe un plugin pour faire ce que je recherche? Build Pipeline


Modifier:

Lorsque j'ai initialement posté cette question en 2012, la réponse de Jason (les plugins Join et Promoted Build) était la meilleure et la solution que j'ai choisie.

Cependant, la réponse de dnozay (le plugin Build Flow) a été rendue populaire environ un an après cette question, ce qui est une bien meilleure réponse. Pour ce que cela vaut, si les gens me posent cette question aujourd'hui, je le recommande maintenant.

70
Jay Spang

Il y a deux solutions que j'ai utilisées pour ce scénario dans le passé:

  1. Utilisez le Join Plugin sur votre travail "déployer" et spécifiez "promouvoir" comme travail ciblé. Vous devez spécifier "Tests fonctionnels" et "Tests de performance" en tant que tâches jointes et les démarrer d'une manière ou d'une autre, post-build. Le plugin de déclenchement paramétré est bon pour cela.

  2. Utilisez le plugin Builds Builds sur votre travail "deploy", spécifiez une promotion qui fonctionne lorsque les travaux en aval sont terminés et spécifiez des travaux de test fonctionnels et de performances. Dans le cadre de l'action de promotion, déclenchez le travail "promouvoir". Vous devez toujours démarrer les deux jobs de test à partir de "deploy"

Il y a un aspect CRITIQUE dans ces deux solutions: les empreintes digitales doivent être utilisées correctement. Voici ce que j'ai trouvé:

  1. Le travail de "construction" doit ORIGINER un nouveau fichier à empreinte digitale. En d'autres termes, il doit prendre l'empreinte de certains fichiers qui, selon Jenkins, ont été créés par le travail initial. Vérifiez le lien "Voir les empreintes digitales" du travail pour le vérifier.
  2. Tous les travaux liés en aval (dans le cas présent "déployer", "tests fonctionnels" et "tests de performance") doivent obtenir et identifier ce même fichier par empreinte digitale. Le plugin Copy Artifacts est idéal pour ce genre de chose.
  3. Gardez à l'esprit que certains plug-ins vous permettent de modifier l'ordre des empreintes digitales et le démarrage des travaux en aval. dans ce cas, la prise d'empreinte DOIT avoir lieu avant qu'une tâche en aval empreigne le même fichier afin de s'assurer que l'origine de l'empreinte est correctement définie.
27
Jason Swager

Plugin Pipeline

Vous pouvez utiliser le Pipeline Plugin (anciennement workflow-plugin).

Il est livré avec plusieurs exemples , et vous pouvez suivre ceci tutoriel .

par exemple.

// build
stage 'build'
...

// deploy
stage 'deploy'
...

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

// promote artifacts
stage 'promote'
...

Créer un plugin de flux

Vous pouvez également utiliser le Build Flow Plugin . C'est tout simplement génial - mais il est déconseillé (développement gelé).

Mise en place des emplois

Créer des emplois pour:

  • construire
  • déployer
  • des tests de performance
  • tests fonctionnels
  • promotion

Mise en place de l'amont

  1. en amont (ici build) créer un artefact unique, par exemple:

    echo ${BUILD_TAG} > build.tag
    
  2. archiver le build.tag artefact.

  3. enregistrer les empreintes digitales pour suivre l'utilisation des fichiers; si un travail copie le même build.tag fichier et enregistre les empreintes digitales, vous pourrez suivre le parent.
  4. Configurez-le pour obtenir une promotion lorsque la tâche promotion a réussi.

Mise en place des travaux en aval

  1. J'utilise 2 paramètres PARENT_JOB_NAME et PARENT_BUILD_NUMBER
  2. Copiez les artefacts de la tâche build en amont à l’aide du Copier le plug-in Artifact

    • Nom du projet = ${PARENT_JOB_NAME}
    • Quelle version = ${PARENT_BUILD_NUMBER}
    • Artefacts à copier = build.tag
  3. Enregistrer les empreintes digitales; c'est crucial.

Mise en place du travail de promotion en aval

Procédez comme ci-dessus pour établir une relation amont-aval. Il ne nécessite aucune étape de construction. Vous pouvez effectuer des actions post-construction supplémentaires telles que "hé QA, à vous de jouer".

Créer un travail de construction

// 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)

bonne chance.

30
dnozay

Jenkins a récemment annoncé support de première classe pour le flux de travail.

11
Andrew Gray

Le plugin Multijob fonctionne parfaitement pour ce scénario. Il est également utile si vous souhaitez qu'un seul travail "parent" lance plusieurs travaux "enfants" tout en pouvant exécuter chacun des enfants manuellement. Cela fonctionne en créant des "phases", auxquelles vous ajoutez 1 à n travaux. La génération ne se poursuit que lorsque la phase entière est terminée. Par conséquent, si une phase est composée de plusieurs tâches, elles doivent toutes être terminées avant l'exécution des tâches restantes. Naturellement, il est possible de configurer si la construction continue en cas d'échec dans la phase.

8
tbradt

Les réponses de jason et dnozay sont assez bonnes. Mais si quelqu'un cherche un moyen simple, utilisez simplement plugin JobFanIn .

3
Yogesh

Je crois que le plug-in de flux de travail s'appelle maintenant Pipeline Plugin et constitue la solution préférée (actuelle) à la question d'origine, inspirée du plug-in Build Flow. Il existe également un tutoriel de démarrage dans GitHub.

2
geipel