Multinode selection in buildWithParamater call

I need to build the same job in several different nodes and for this I used this plugin: Node and Label parameter
It allows to make a multi selection of available nodes to build the job on.

If I try to use API to build job with parameters I am not able to get the default value parameter, because API response returns to me only the first entry of selection.
For example, if I selected the following:


Only the first selected one returns from the request to get the list of parameters:
jenkinsUrl/pathToJob/api/json?tree=actions[parameterDefinitions[[[*]]]]

{
    "_class": "hudson.model.FreeStyleProject",
    "actions": [
        {
            "_class": "hudson.model.ParametersDefinitionProperty",
            "parameterDefinitions": [
                {
                    "_class": "org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterDefinition",
                    "defaultParameterValue": {
                        "_class": "org.jvnet.jenkins.plugins.nodelabelparameter.NodeParameterValue",
                        "name": "",
                        "value": "winAUT_1"
                    },
                    "description": null,
                    "name": "",
                    "type": "NodeParameterDefinition"
                },
                {
                    "_class": "hudson.model.BooleanParameterDefinition",
                    "defaultParameterValue": {
                        "_class": "hudson.model.BooleanParameterValue",
                        "name": "UTILITYJOB",
                        "value": true
                    },
                    "description": "Adds the job to a special group of Utility jobs",
                    "name": "UTILITYJOB",
                    "type": "BooleanParameterDefinition"
                }
            ]
        },
        {},
        {},
        {
            "_class": "org.jenkinsci.plugins.displayurlapi.actions.JobDisplayAction"
        },
        {
            "_class": "com.cloudbees.plugins.credentials.ViewCredentialsAction"
        }
    ]
}

Is there a way to get all the values and then trigger the job using the parameter with its values instead of the first one only?

Alternatively, is there another way (compatible with API triggering) to run the same jobs on several nodes with one call only?

Thank you in advance for support.

Jenkins setup:

Jenkins: 2.440.2
OS: Linux - 5.15.0-76-generic
Java: 11.0.22 - Ubuntu (OpenJDK 64-Bit Server VM)
---
PrioritySorter:5.1.0
ansicolor:1.0.4
ant:497.v94e7d9fffa_b_9
antisamy-markup-formatter:162.v0e6ec0fcfcf6
apache-httpcomponents-client-4-api:4.5.14-208.v438351942757
bootstrap5-api:5.3.2-3
bouncycastle-api:2.30.1.77-225.v26ea_c9455fd9
branch-api:2.1148.vce12cfcdf090
build-timeout:1.32
build-user-vars-plugin:1.9
caffeine-api:3.1.8-133.v17b_1ff2e0599
checks-api:2.0.2
cloudbees-folder:6.901.vb_4c7a_da_75da_3
command-launcher:107.v773860566e2e
commons-lang3-api:3.13.0-62.v7d18e55f51e2
commons-text-api:1.11.0-95.v22a_d30ee5d36
conditional-buildstep:1.4.3
credentials:1319.v7eb_51b_3a_c97b_
credentials-binding:657.v2b_19db_7d6e6d
date-parameter:0.0.4
display-url-api:2.200.vb_9327d658781
durable-task:550.v0930093c4b_a_6
echarts-api:5.4.3-2
email-ext:2.104
environment-script:1.2.6
font-awesome-api:6.5.1-2
generic-webhook-trigger:2.0.0
git:5.2.1
git-client:4.6.0
github:1.38.0
github-api:1.318-461.v7a_c09c9fa_d63
github-branch-source:1772.va_69eda_d018d4
gradle:2.10
groovy:457.v99900cb_85593
gson-api:2.10.1-15.v0d99f670e0a_7
http_request:1.18
instance-identity:185.v303dc7c645f9
ionicons-api:56.v1b_1c8c49374e
jackson2-api:2.16.1-373.ve709c6871598
jakarta-activation-api:2.0.1-3
jakarta-mail-api:2.0.1-3
javax-activation-api:1.2.0-6
javax-mail-api:1.6.2-9
jaxb:2.3.9-1
jdk-tool:73.vddf737284550
jjwt-api:0.11.5-77.v646c772fddb_0
joda-time-api:2.12.7-29.v5a_b_e3a_82269a_
jquery3-api:3.7.1-1
json-path-api:2.9.0-33.v2527142f2e1d
junit:1259.v65ffcef24a_88
ldap:711.vb_d1a_491714dc
locale:431.v3435fa_8f8445
mailer:463.vedf8358e006b_
matrix-auth:3.2.1
matrix-project:822.824.v14451b_c0fd42
mina-sshd-api-common:2.12.0-90.v9f7fb_9fa_3d3b_
mina-sshd-api-core:2.12.0-90.v9f7fb_9fa_3d3b_
msbuild:1.30
multiple-scms:0.8
nodelabelparameter:1.12.0
okhttp-api:4.11.0-172.vda_da_1feeb_c6e
pam-auth:1.10
parameter-separator:166.vd0120849b_386
parameterized-trigger:787.v665fcf2a_830b_
pipeline-build-step:540.vb_e8849e1a_b_d8
pipeline-github-lib:42.v0739460cda_c4
pipeline-graph-analysis:202.va_d268e64deb_3
pipeline-groovy-lib:704.vc58b_8890a_384
pipeline-input-step:491.vb_07d21da_1a_fb_
pipeline-milestone-step:111.v449306f708b_7
pipeline-model-api:2.2175.v76a_fff0a_2618
pipeline-model-definition:2.2175.v76a_fff0a_2618
pipeline-model-extensions:2.2175.v76a_fff0a_2618
pipeline-rest-api:2.34
pipeline-stage-step:305.ve96d0205c1c6
pipeline-stage-tags-metadata:2.2175.v76a_fff0a_2618
pipeline-stage-view:2.34
plain-credentials:143.v1b_df8b_d3b_e48
plugin-util-api:3.8.0
postbuild-task:1.9
ranorex-integration:1.0.2
resource-disposer:0.23
role-strategy:689.v731678c3e0eb_
run-condition:1.7
scm-api:683.vb_16722fb_b_80b_
script-security:1326.vdb_c154de8669
slack:684.v833089650554
snakeyaml-api:2.2-111.vc6598e30cc65
ssh-credentials:308.ve4497b_ccd8f4
ssh-slaves:2.948.vb_8050d697fec
sshd:3.322.v159e91f6a_550
structs:337.v1b_04ea_4df7c8
throttle-concurrents:2.14
timestamper:1.26
token-macro:400.v35420b_922dcb_
trilead-api:2.133.vfb_8a_7b_9c5dd1
uno-choice:2.8.1
variant:60.v7290fc0eb_b_cd
workflow-aggregator:596.v8c21c963d92d
workflow-api:1291.v51fd2a_625da_7
workflow-basic-steps:1042.ve7b_140c4a_e0c
workflow-cps:3867.v535458ce43fd
workflow-durable-task-step:1331.vc8c2fed35334
workflow-job:1400.v7fd111b_ec82f
workflow-multibranch:773.vc4fe1378f1d5
workflow-scm-step:415.v434365564324
workflow-step-api:657.v03b_e8115821b_
workflow-support:865.v43e78cc44e0d
ws-cleanup:0.45
xframe-filter-plugin:1.2

Hi @markigno976,

The Node and Label Parameter plugin does not seem to support returning all selected nodes via the API. :thinking:

I have not tested it, but from your experiments, it looks like it only returns the first selected node as the default value. This is likely a limitation of the plugin itself. :person_shrugging:

As an alternative, you could maybe use the Jenkins Pipeline and the build step to trigger the same job on multiple nodes. :crossed_fingers:

You could pass the node names as a parameter to the pipeline, and then iterate over the nodes in the pipeline script. Yes, it does look fishy…

Here’s an untested example of how you could maybe do this:

pipeline {
    agent any
    parameters {
        string(name: 'NODES', defaultValue: 'node1,node2,node3', description: 'Comma-separated list of nodes')
    }
    stages {
        stage('Build') {
            steps {
                script {
                    // Split the NODES parameter into a list of nodes
                    def nodes = params.NODES.split(',')

                    // Iterate over the nodes
                    for (node in nodes) {
                        // Trigger the job on the current node
                        build job: 'your-job-name', parameters: [string(name: 'NODE', value: node)]
                    }
                }
            }
        }
    }
}

Thank you @poddingue for your reply.
I expected that was the limitation, but I hoped to find a workaround for it.
I trigger those jobs using another application that interacts with Jenkins through api/json.
I get the jobs details including parameters and their default values. End user input/select the values for parameters using the app UI and then click ok to trigger the build.
In this case I expected to have the list of available nodes and I expected to be able to trigger the jobs for the selected nodes.
I found two issues:

  1. the NodeParameterDefinition plugin does not provide the full list of default nodes
  2. it is not possible to trigger a job (using REST api) with parameters setting more than a value for the same parameter (i.e. ?nodeList=val1,val2&…)

So, if I used a pipeline, I would have some doubts:
a) should I hardcode the nodes names into the pipeline script?
b) how should I get the list of parameters needed by jobs to be triggered? Should I configure them in the pipeline as parameterized values one by one?
c) should I create a pipeline for each job? Is there a way to create a sort of “interface” to do that? I have different jobs with different parameters but all of them should build on ALL nodes or SOME of them.

Thank you in advance for further suggestions you all guys will be able to provide.