【问题标题】:How to pass parameter in curl while calling Jenkins job without using buildWithParameters如何在不使用 buildWithParameters 的情况下调用 Jenkins 作业时在 curl 中传递参数
【发布时间】:2020-02-04 18:42:50
【问题描述】:

我的 Jenkins 管道作业没有参数化,但在从管道脚本调用作业时,我可以提供在当前作业中使用的参数。

我想使用 curl 命令从外部传递这些参数。我尝试了以下选项,但尚未成功。

curl -i -X POST 'https://<USERNAME>:<API_TOKEN>@JENKINS_URL/job/DS_JOB1/build?token=remotejob' --data-urlencode json='{"parameter": [{"PLATFORM":"Value1", "PROJECT": "Project_Type"}]}' 

这不起作用,因为我无法获取被调用作业中的参数。

curl -i -X POST 'https://<USERNAME>:<API_TOKEN>@JENKINS_URL/job/DS_JOB1/buildWithParameters?token=remotejob&TestProject=NewCurlTesting'

此调用崩溃,因为我当前的作业 DS_JOB1 未参数化。

我想知道是否有人已经使用过这样的工作并解决了这个问题。

举个例子,我提供了 2 个简单的 jenkinsfiles,它们在 jenkins 管道实现方式中运行良好。

node('LABEL_NAME') {
    timestamps {
        try {
            stage("Calling Downstream Job") {
                job_downstream = build(job: "DS_JOB1",
                             parameters: [[$class: 'StringParameterValue', name: 'PLATFORM', value: "pf-1"],
                                          [$class: 'StringParameterValue', name: 'PROJECT', value: "Dummy1"]],
                             propagate: false,
                             wait: true)
                if(job_downstream?.result.toString() == 'FAILURE') {
                    currentBuild.result = job_downstream?.result.toString()
                    println("Downstream job for PLATFORM: ${PLATFORM}")
                }
            }
        }
        catch (err) {
            println(err)
            currentBuild.result = 'FAILURE'
        }
        finally {
            stage('Post build actions') {
                // Mailer notification
                step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: '<GroupMail_ID>', sendToIndividuals: false])
                deleteDir()
            }
        }
    }
}

从上述作业调用的作业 DS_JOB1 的 Jenkinsfile 是:

node('LABEL_NAME') {
    stage('Trigger Testlauncher') {

        if("${PLATFORM}" == "pf-1")
        {
            <Take some action>
        }
        else if("${PROJECT}" == "Dummy1")
        {
            < Take some action>
        }
        else
        {
            <Take something>
        }
    }
}

【问题讨论】:

    标签: jenkins curl parameters jenkins-pipeline


    【解决方案1】:

    我的 Jenkins 管道作业没有参数化,但在从管道脚本调用作业时,我可以提供在当前作业中使用的参数。

    为了确认我理解正确,即使 DS_JOB1 作业未参数化,您的管道脚本也能够“成功”调用 DS_JOB1 传递参数?

    您使用的是什么版本的 Jenkins?我在 Jenkins 版本 2.146 上快速进行了测试,但它对我来说不起作用,因为它说它无法识别下游作业中的属性 PLATFORM。

    您是否能够参数化您的 DS_JOB1 作业,然后您应该能够使用 curl 调用

    curl -X POST JENKINS_URL/job/JOB_NAME/build \
      --user USER:TOKEN \
      --data-urlencode json='{"parameter": [{"PLATFORM":"Value1", "PROJECT": "Project_Type"}]}'
    

    【讨论】:

    • 我正在使用 Jenkins 版本 2.89.2,它工作得非常好。我正在寻找一个选项,它应该允许我在不更改 DS_JOB1 作业 Jenkinsfile 的情况下传递参数。但是现在我只能想到你提到的一个选项并且我已经测试过 - 我必须修改 DS_JOB1 以获得参数。这将使我能够使用“buildWithParameters”选项进行卷曲
    【解决方案2】:

    在 DS_JOB1 Jenkinsfile 中添加了以下代码。

    properties(
        [
            parameters(
            [
                string(defaultValue: 'PF-1', description: 'Project repo name to checkout for static analysis', name: 'PLATFORM'),
                string(defaultValue: 'Dummy1', description: 'Project branch to be used', name: 'PROJECT')
            ])
        ])
    

    添加后,我可以使用以下 curl 命令运行该作业。

    curl -i -X POST 'https://<user>:<Token>@JENKINS_URL/job/DS_JOB1/buildWithParameters?token=remotejob&PLATFORM=NewCurlTesting&PROJECT=Test1'
    

    如果有人在不更改“DS_JOB1”的情况下有任何线索,请分享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多