jenkins 如何在声明式管道中使用NodeLabel参数插件

7xllpg7q  于 2023-10-17  发布在  Jenkins
关注(0)|答案(4)|浏览(208)

我试图将我的自由式作业转换为声明性管道作业,因为管道提供了更大的灵活性。我不知道如何在管道中使用NodeLabel参数插件(https://wiki.jenkins.io/display/JENKINS/NodeLabel+Parameter+Plugin)。

pipeline {
agent any

parameters {
    // Would like something like LabelParameter here
}

stages {
    stage('Dummy1') {
        steps {
            cleanWs()
            sh('ls')
            sh('pwd')
            sh('hostname')
        }
    }
    stage('Dummy2') {
        steps {
            node("comms-test02") {
                sh('ls')
                sh('pwd')
                sh('hostname')
            }
        }
    }
}

我基本上只需要一种方法来启动作业使用一个参数,指定在哪里建立作业(使用从属标签)。
Jenkins需要一个代理字段,我将其设置为“any”。但似乎没有一个标签参数可用?
作为替代方法,我尝试使用“node”命令(jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#-node- allocate node)。但这给我留下了两个运行的工作,而工作,看起来不那么漂亮。
任何人都可以使用NodeLabel参数插件吗?还是有人有更好的办法

*我需要能够在不同的节点上运行作业。在通过参数触发作业时,应决定运行的节点。节点标签插件完美地做到了这一点。但是,我无法在管道中重现此行为。

fhg3lkii

fhg3lkii1#

下面是一个完整的例子:

pipeline {
    parameters {
        choice(name: 'node', choices: [nodesByLabel('label')], description: 'The node to run on') //example 1: just listing all the nodes with label
        choice(name: 'node2', choices: ['label'] + nodesByLabel('label'), description: 'The node to run on') //example 2: add the label itself as the first choice to make "Any of the nodes" the default choice
    }
    
    agent none
    stages {
        stage('Test') {
            agent { label params.node}
            stages {
                stage('Print environment settings') {
                    steps {
                        echo "running on ${env.NODE_NAME}"
                        sh 'printenv | sort'
                    }
                }
            }
        }
    }
}
vbopmzt1

vbopmzt12#

假设您使用管道上的NodeLabel插件添加了参数(例如名为slaveName)。现在需要提取slaveName的值并将其输入到agent->node->label字段中。
可以使用代理内的node属性指定节点。像这样-

agent
{
    node
    {
        label "${slaveName}"
    }
}
wfsdck30

wfsdck303#

下面的脚本可以让我在不同的Node上运行多个作业。
我从构建步骤插件文档中引用了参考资料。
https://www.jenkins.io/doc/pipeline/steps/pipeline-build-step/

def build_one() 
{
        parallel  one: { 
            stage('XYZ') {
                        catchError(buildResult: 'SUCCESS', stageResult:'FAILURE') {
                        
 build job: 'yourDownStreamJob', parameters: [[$class: 'NodeParameterValue', name: 'NodeToRun',labels: ['nodeName'], nodeEligibility: [$class: 'AllNodeEligibility']], string(name: 'ParentBuildName', value: "XX"), string(name: 'Browser', value: 'chrome'), string(name: 'Environment', value: 'envName')]
                        }
            }
        },
        two : { 
            stage('SecondArea') {
                        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                         build job: 'yourDownStreamJob', parameters: [[$class: 'NodeParameterValue', name: 'NodeToRun',labels: ['Your'], nodeEligibility: [$class: 'AllNodeEligibility']], string(name: 'ParentBuildName', value: "XYX"), string(name: 'Browser', value: 'firefox'), string(name: 'Environment', value: 'envName')]
                        }
            }
        }
        
} 

build_one()
zy1mlcev

zy1mlcev4#

要在声明式管道中使用Node and Label parameter plug-in,您需要执行以下操作:

properties([
  parameters([
    booleanParam(name: 'TEST', defaultValue: false, description: 'Trigger CI tests'),
    choice(name: 'ENV', choices: ['dev','prod']),
    [
      $class: 'NodeParameterDefinition',
      allowedSlaves: ['ALL (no restriction)'],
      defaultSlaves: ['master'],
      description: 'What node to run the build on:',
      name: 'NODELABEL',
      nodeEligibility: [$class: 'IgnoreOfflineNodeEligibility'],
      triggerIfResult: 'allowMultiSelectionForConcurrentBuilds'
    ]
  ])
])

pipeline {
  agent { label env.NODELABEL }

  options {
    ansiColor('xterm')
    timestamps()
  }

  stages {
    stage('Print the Values') {
      steps {
        echo "Trigger CI: ${params.TEST}"
        echo "Environment: ${params.ENV}"
        echo "Node name: ${env.NODELABEL}"
      }
    }
  }
}

相关问题