Ich habe eine große Gruppe von Knoten mit demselben Label. Ich möchte in Jenkins einen Job ausführen können, der auf all der Knoten mit demselben Label ausgeführt wird, und dies gleichzeitig.
Ich habe einen Vorschlag zur Verwendung der Matrixkonfigurationsoption in Jenkins gesehen, aber ich kann mir nur eine Achse vorstellen (die Etikettengruppe). Wenn ich versuche, den Job auszuführen, wird er scheinbar nur einmal statt 300 mal ausgeführt (1 für jeden Knoten in dieser Etikettengruppe).
Was soll meine andere Achse sein? Oder ... gibt es ein Plugin dafür? Ich hatte das NodeLabel Parameter Plugin ausprobiert und die Option "Auf allen verfügbaren Online-Knoten ausführen" ausgewählt, aber es scheint, dass die Jobs nicht gleichzeitig ausgeführt werden.
Der Matrix-Build wird funktionieren. Verwenden Sie "Slaves" als Achse und erweitern Sie die Liste "Einzelne Knoten", um alle Knoten auszuwählen.
Beachten Sie, dass Sie die Auswahl jedes Mal aktualisieren müssen, wenn Sie einen Slave hinzufügen oder entfernen.
Um eine wartungsfähigere Lösung zu erhalten, können Sie mit dem Job DSL-Plugin einen Seed-Job einrichten, der die Vorlage für den Build enthält. Anschließend wird jeder Slave durchlaufen und ein neuer Job mit dem Build-Label auf den Namen erstellt der Sklave.
Es gibt zwei Plugins, die Sie benötigen: Paramitrized Trigger Plugin , um andere Jobs als Erstellungsschritt Ihres Hauptjobs auslösen zu können, und NodeLabel Plugin (lesen Sie den Abschnitt BuildParameterFactory, um zu beschreiben, was Sie benötigen) Beschriftung angeben.
Der beste und einfachste Weg, dies zu erreichen, ist die Verwendung von Elastic Axis plugin.
1. Installieren Sie die Pulgin .
2. Erstellen Sie einen Multi-Configuration-Job (Installation, falls nicht vorhanden)
3. In der Auftragskonfiguration können Sie die neue Achse als elastische Achse hinzufügen. Fügen Sie das Etikett wie unten gezeigt hinzu, damit der Job auf mehreren Slaves ausgeführt werden kann .
Verstanden - Kein spezielles Plugin nötig!
Ich habe einen übergeordneten Job erstellt, der einen anderen Build auslöst. Wenn ich ihn anrufe, übergebe ich ihm das Label , an dem ich den untergeordneten Job nicht ausführen möchte.
Grundsätzlich löst also der übergeordnete Job Nur den Job aus, den ich brauche.... Und der untergeordnete Job wird so oft ausgeführt wie die Anzahl der Slaves in Label (In meinem Fall 4 Mal).
Nehmen Sie einige der obigen Antworten und passen Sie sie für die 2.0-Serie an.
Sie können jetzt alle Jobs auf allen Knoten starten.
// 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 }
}
Aus dem Code entnommen https://jenkins.io/doc/pipeline/examples/#trigger-job-on-all-nodes
Aktivieren Sie This project is parameterized
, fügen Sie einen Parameter des Typs Label
hinzu, geben Sie einen beliebigen Namen für das Label ein und wählen Sie einen Standardwert aus, z. B. ein Label, das eine Anzahl von Knoten enthält, oder eine Verbindung (&&) solcher Labels. Aktivieren Sie Run on all nodes matching the label
, behalten Sie Run regardless of result
und behalten Sie Node eligibility
bei All nodes
.