J'ai un grand groupe de nœuds avec la même étiquette. J'aimerais pouvoir exécuter un travail dans Jenkins qui s'exécute sur tous des noeuds portant le même libellé, tout en le faisant simultanément.
J'ai vu une suggestion d'utiliser l'option de configuration de la matrice dans Jenkins, mais je ne peux penser qu'à un seul axe (le groupe d'étiquettes). Lorsque j'essaie d'exécuter le travail, il semble qu'il ne s'exécute qu'une fois au lieu de 300 (1 pour chacun des nœuds de ce groupe d'étiquettes).
Quel devrait être mon autre axe? Ou ... y a-t-il un plugin pour faire ça? J'avais essayé le plugin NodeLabel Parameter Plugin et choisi "exécuter sur tous les noeuds en ligne disponibles", mais il ne semble pas exécuter les travaux simultanément.
La construction de la matrice fonctionnera; utilisez "Esclaves" comme axe et développez la liste "Nœuds individuels" pour sélectionner tous vos nœuds.
Notez que vous devrez mettre à jour la sélection chaque fois que vous ajoutez ou supprimez un esclave.
Pour une solution plus facile à gérer, vous pouvez utiliser le plug-in Job DSL pour configurer un travail initial contenant le modèle pour la construction, puis passer en boucle sur chaque esclave et créer un nouveau travail avec le libellé défini sur le nom de L'esclave.
Vous avez besoin de deux plug-ins: Plug-in de paramétrage pour pouvoir déclencher d'autres travaux en tant qu'étape de création de votre travail principal, et Plug-in NodeLabel (lisez la section BuildParameterFactory pour obtenir la description de ce dont vous avez besoin) spécifiez l'étiquette.
La meilleure et la plus simple méthode consiste à utiliser Elastic Axis plugin.
1. Installez la puline .
2. Créez un travail de configuration multiple. (Installer si non présent)
3. Dans la configuration du travail, vous pouvez trouver un nouvel axe ajouté en tant qu'axe élastique. Ajoutez l'étiquette comme indiqué ci-dessous pour que le travail soit exécuté sur plusieurs esclaves .
Compris - Pas besoin de plugin spécial!
J'ai créé un travail parent qui déclenche/appelle une autre version, .__ Et lorsque je l'appelle, je lui passe le Label que je ne souhaite pas utiliser pour le travail enfant.
Donc, fondamentalement, le travail parent déclenche uniquement le travail dont j'ai besoin, Et le travail enfant s'exécutera autant de fois que le nombre d'esclaves dans ce Label (Dans mon cas, 4 fois).
Prendre quelques-unes des réponses ci-dessus et les ajuster pour la série 2.0.
Vous pouvez maintenant lancer tous les travaux sur tous les nœuds.
// The script triggers PayloadJob on every node.
// It uses Node and Label Parameter plugin to pass the job name to the payload job.
// The code will require approval of several Jenkins classes in the Script Security mode
def branches = [:]
def names = nodeNames()
for (int i=0; i<names.size(); ++i) {
def nodeName = names[i];
// Into each branch we put the pipeline code we want to execute
branches["node_" + nodeName] = {
node(nodeName) {
echo "Triggering on " + nodeName
build job: 'PayloadJob', parameters: [
new org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterValue
("TARGET_NODE", "description", nodeName)
]
}
}
}
// Now we trigger all branches
parallel branches
// This method collects a list of Node names from the current Jenkins instance
@NonCPS
def nodeNames() {
return jenkins.model.Jenkins.instance.nodes.collect { node -> node.name }
}
Extrait du code https://jenkins.io/doc/pipeline/examples/#trigger-job-on-all-nodes
Activez This project is parameterized
, ajoutez un paramètre de type Label
, entrez un nom arbitraire pour le libellé et sélectionnez une valeur par défaut, telle qu’un libellé couvrant plusieurs nœuds ou une conjonction (&&) de ces libellés. Activez Run on all nodes matching the label
, gardez Run regardless of result
, gardez Node eligibility
à All nodes
.