wake-up-neo.com

Wie löse ich einen Jenkins aus, der mit einem Pipeline-Plugin auf bestimmten Knoten aufgebaut wird?

Ich habe einen Jenkins-Pipeline-Job namens "TestPipeline". Ich möchte einen Build auf 2 verschiedenen Slaves auslösen, die mit "tester1" und "tester2" beschriftet sind. Das Pipeline-Skript ist hier ganz einfach:

node('tester1') {
    build 'test_job'
}
node('tester2') {
    build 'test_job'
}

Beim Ausführen des TestPipeline-Jobs wird der "test_job" jedoch nicht auf den Knoten ausgeführt, die ich zugewiesen habe. Laufen Sie stattdessen auf einem zufälligen Knoten. 

Ich frage mich, ob ich in meinem "test_job" "Beschränken, wo dieses Projekt ausgeführt werden kann" setzen soll. Also habe ich es auf "Tester" gesetzt (das Label "Tester" enthält sowohl Knoten "Tester1" als auch "Tester2"). Wenn ich den Pipeline-Job jedoch erneut ausführen, wird der "test_job" zweimal auf "tester2" ausgeführt. Ich sollte erwarten, dass der Job zuerst auf "tester1" und dann auf "tester2" ausgeführt wird. Warum das? Liegt es daran, dass der "Knoten" -Schritt keine Rolle spielt, auf welchen Knoten der Build-Schritt aufgebaut werden soll?

22
Andy Wang

Bitte sehen Sie den Fehler hier . Die Lösung lautet wie folgt.

  1. Installieren Sie das Node- und Label-Parameter-Plugin
  2. Wählen Sie in der Konfiguration von test_job 'This build is parametrized' aus, fügen Sie einen Label-Parameter hinzu und setzen Sie den Parameternamen auf 'node'.
  3. Verwenden Sie im Pipeline-Skript den Code:
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester1']]
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester2']]

Und der Job wird so gebaut, wie ich wollte.

Allerdings, ich denke, es ist nur ein Workaround. Ich glaube immer noch, dass dies ein Fehler ist. Weil der Node-Schritt seinen Job erledigen sollte, anstatt andere Plugins dafür zu lassen.

21
Andy Wang

Ich tat dasselbe, aber unter Verwendung des Node-Parameters, so dass ich Knotenlisten-Job direkt oder Pipeline ausführen kann (in Pipeline verwende ich Choice-Parameter, um eine Liste verfügbarer Knoten zu haben). Also in meinem Fall:

  1. Installieren Sie das Node- und Label-Parameter-Plugin
  2. Wählen Sie in der Konfiguration von test_job 'This build is parametrized' aus, fügen Sie einen Node-Parameter hinzu und setzen Sie den Parameternamen auf node_name.
  3. Fügen Sie im Pipeline-Parameter "Choice" den Namen node hinzu und geben Sie die möglichen Optionen ein. Wenn Sie die Pipeline ausführen, können Sie auswählen, auf welchem ​​Knoten sie ausgeführt werden soll.

Code zum Einfügen in ein Pipeline-Skript:

build job: 'my_job', 
  parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
6
Grysik

So habe ich es zum Laufen gebracht

  1. erstellen Sie einen 'Job' 'Test_job' mit dem Parametertyp 'Label', Name 'Node', der Wert kann eine beliebige Zeichenfolge sein. (Dies ist der Job, der ausgelöst werden soll.) . Legen Sie 'Beschriften, wo dieses Projekt ausgeführt werden kann' auf den Labelwert fest 

  2. erstellen Sie eine 'Pipeline' mit dem Parametertyp "Node". Verwenden Sie im Abschnitt "Pipeline" das folgende Skript

Beachten Sie, dass das Label für test_job $ {env.NODE_NAME} ist. Dieses Label wird von der Pipeline je nach Wahl des Benutzers festgelegt 

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
              echo 'Building..'
              script {
                build job: 'test_job', parameters: [
                [$class: 'LabelParameterValue', name: 'node', label: "${env.NODE_NAME}" ]
                ]
}}}}}
 

0
cannie

Ich habe es gerade bei meiner Installation getestet und es hat jedes Skript auf jedem Knoten korrekt ausgeführt. Vielleicht möchten Sie überprüfen, ob Sie Ihre Slaves richtig konfiguriert haben. Ich glaube, die Dokumentation besagt, dass sie über die Einstellung "Slave-Agenten über Java Web Start starten" verfügen müssen. Sie können dies überprüfen.

0
Alex Haynes