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?
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.
Il y a deux solutions que j'ai utilisées pour ce scénario dans le passé:
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.
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é:
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'
...
Vous pouvez également utiliser le Build Flow Plugin . C'est tout simplement génial - mais il est déconseillé (développement gelé).
Créer des emplois pour:
en amont (ici build
) créer un artefact unique, par exemple:
echo ${BUILD_TAG} > build.tag
archiver le build.tag
artefact.
build.tag
fichier et enregistre les empreintes digitales, vous pourrez suivre le parent.promotion
a réussi.PARENT_JOB_NAME
et PARENT_BUILD_NUMBER
Copiez les artefacts de la tâche build
en amont à l’aide du Copier le plug-in Artifact
${PARENT_JOB_NAME}
${PARENT_BUILD_NUMBER}
build.tag
Enregistrer les empreintes digitales; c'est crucial.
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".
// 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.
Jenkins a récemment annoncé support de première classe pour le flux de travail.
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.
Les réponses de jason et dnozay sont assez bonnes. Mais si quelqu'un cherche un moyen simple, utilisez simplement plugin JobFanIn .
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.