web-dev-qa-db-fra.com

Exécution simultanée du travail Jenkins sur tous les nœuds

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.

22
user2406467
  • Rundeck pourrait être un outil mieux adapté à vos besoins. Peut être configuré pour exécuter plusieurs tâches en parallèle et dispose d'un plugin pour Jenkins: http://rundeck.org/
  • Rundeck est conçu pour s'intégrer à de plus grands systèmes. Nous générons le fichier de ressources à partir de notre base de données de gestion de la configuration. Très facile à faire, voir la documentation: http://rundeck.org/docs/administration/node-resource-sources.html
  • De plus, des plugins sont disponibles pour Amazon et/ou des systèmes tels que puppet and chef: http://rundeck.org/plugins
7
Mark O'Connor

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. 

13
gareth_bowles
  1. Installer
  2. Pour le travail que vous souhaitez exécuter, activez Exécutez des générations simultanées si nécessaire
  3. Créez un autre travail en plus du travail que vous souhaitez exécuter sur tous les esclaves et configurez-le
    • Construire> Ajouter une étape de construction> Les déclencheurs/appels s'appuient sur d'autres projets
      • Ajouter ParameterFactories> Tous les noeuds pour Label Factory> Label: l'étiquette des noeuds
12
thSoft

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.

11
Sergey Irisov

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 .enter image description here

9
Amol Manthalkar

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

enter image description here

7

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

6
drubin

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.

 enter image description here

1
eel ghEEz