11.4. Associer une tâche de build avec un esclave ou un groupe d'esclaves

Dans la section précédente, nous avons vu comment attribuer des libellés à vos noeuds esclaves. C'est un moyen commode pour grouper vos esclaves en fonction de caractéristiques telles que le système d'exploitation, l'environnement cible, le type de base de données, ou tout autre critère pertinent dans votre processus de build. Une application commune de cette pratique est d'exécuter des tests fonctionnels spécifiques à un OS sur des noeuds esclaves dédiés, ou de réserver une machine particulière aux tests de performance).

Une fois que vous avez affecté vos libellés à vos noeuds esclaves, vous devez aussi dire à Jenkins où il peut exécuter les tâches de build. Par défaut, Jenkins utilisera simplement le premier noeud esclave disponible, ce qui offre généralement le meilleur temps de traitement global. Si vous avez besoin d'attacher une tâche de build à une machine ou un groupe de machines particulier, vous devez cocher la case “Resteindre les emplacements où ce projet peut s'exécuter” dans la page de configuration du build (voir Figure 11.15, “Exécuter une tâche de build sur un noeud esclave particulier”). Ensuite, entrez le nom de la machine, ou un libellé identifiant un groupe de machines, dans le champ Expression de libellé. Jenkins fournira une liste déroulante dynamique montrant les noms de machines et libellés de au fur et à mesure que vous tapez.

Exécuter une tâche de build sur un noeud esclave particulier

Figure 11.15. Exécuter une tâche de build sur un noeud esclave particulier


Ce champ admet aussi des expressions booléennes, ce qui vous permet de définir des contraintes plus compliquées spécifiant où votre build devrait s'exécuter. Le plus simple pour expliquer comment utiliser ces expressions est de montrer des exemples. Supposez que vous avez une ferme de construction avec des noeuds esclaves Windows et Linux (identifiés par les libellés “windows” et “linux”), distribués sur trois sites (“sydney”, “sanfrancisco”, et “london”). Votre application nécessite aussi d'être testée sur différentes bases de données (“oracle”, “db2”, “mysql”, et “postgres”). Vous pouvez aussi utiliser des libellés pour distinguer les noeuds esclaves utilisés pour déployer vers différents environnements (test, test d'acceptation, production).

L'utilisation la plus simple des expressions de libellés est de définir où une tâche de build peut ou ne peut pas être exécutée. Si vos tests web nécessitent Internet Explorer, par exemple, vous aurez besoin de les exécuter sur une machine Windows. Vous pourriez exprimer cela en indiquant simplement le libellé suivant :

windows

Sinon, vous pourriez vouloir exécuter vos tests sur Firefox, mais seulement sur des machines Linux. Vous pourriez exclure les machines Windows de l'éventails des noeuds candidats en utilisant l'opérateur ! :

!windows

Vous pouvez aussi utiliser les opérateurs et (&&) et ou (!!) pour combiner les expressions. Par exemple, supposez que la base Postgres soit uniquement testée pour Linux. Vous pourriez dire à Jenkins d'exécuter une tâche de build particulière seulement sur les machines Linux sur lesquelles est installé Postgres en utilisant l'expression suivante :

linux && postgres

Ou vous pourriez spécifier qu'une tâche de build particulière doit uniquement tourner sur l'environnement de test d'acceptation utilisateur de Sydney ou Londres :

uat && (sydney || london)

Si votre nom de machine contient des espaces, vous devrez les entourer de double quotes :

"Windows 7" || "Windows XP"

Il y a aussi deux opérateurs logiques plus avancés que vous pourriez trouver utile. L'opérateur implique (=>) vous permet de définir une contrainte logique de la forme “si A est vrai, alors B doit aussi être vrai.” Par exemple, supposez que vous ayez une tâche de build qui peut s'exécuter sur n'importe quelle distribution Linux, mais que si c'est une machine Windows, ce doit être Windows 7. Vous pourriez exprimer cette contrainte comme suit :

windows -> "Windows 7"

L'autre opérateur logique est l'opérateur si-et-seulement-si (<=>. Cette opération vous permet de définir des contraintes plus fortes de la forme "Si A est vrai, alors B doit être vrai, mais si A est faux, alors B doit être faux". Par exemple, supposez que les tests Windows 7 doivent uniquement être exécutés sur l'environnement de tests d'acceptation utilisateur, et que seuls les tests Windows 7 doivent être exécutés dans l'environnement de tests d'acceptation. Vous pourriez exprimer cela comme montré ici :

"Windows 7" <-> uat