如何远程触发Jenkins构建并传递参数

99

我正在远程调用 Jenkins 任务,使用的命令是:

wget http://<ServerIP>:8080/job/Test-Jenkins/build?token=DOIT

这里调用了Test-Jenkins作业,并且我使用了DOIT作为安全令牌。

现在我需要向该作业的build.xml文件传递一些参数,即Test-Jenkins

我还没有弄清楚如何传递这些变量。

10个回答

110

请查看Jenkins文档:可参数化构建

以下是您感兴趣的那一行:

http://server/job/myjob/buildWithParameters?token=TOKEN&PARAMETER=Value

8
但它会触发构建。而且你需要实际进行 POST 调用。我想提供带有默认参数值的链接,例如 GET http://<ServerIP>:8080/job/Test-Jenkins/build?some_param=xyz,应该打开一个带有 some_param 设置为值 xyz 的网页。然后用户可以点击“Build”按钮。 - Kamil Dziedzic
令人困惑的是,股票版本不支持此功能,需要使用插件。 - Craig Ringer
2
有没有一个插件可以处理这个帖子?我想要一个链接,用户点击它就可以触发一个特定的参数化构建作业。 - Petra Kahn
触发构建后是否有任何方法可以获取预定的构建作业ID? - Kasun Siyambalapitiya
链接已更新:https://plugins.jenkins.io/parameterized-trigger/ - fmdaboville

80
在您的 Jenkins 作业配置中,勾选名为“This build is parameterized”的框,点击“Add Parameter”按钮,并选择“String Parameter”下拉值。
现在定义您的参数 - 例如: Enter image description here 现在,您可以在作业/构建管道中使用您的参数 - 例如: Enter image description here 接下来触发具有自定义参数的构建,请调用以下 URL(使用 POST 或 GET):
http://JENKINS_SERVER_ADDRESS/job/YOUR_JOB_NAME/buildWithParameters?myparam=myparam_value

11
最新的Jenkins文档指出,由于安全原因,GET已经被弃用,因此应该优先考虑使用POST。 - Roman
2
我的URL中缺少了“job”。 - Benjamin Castor
1
对于多分支项目呢? - Learner
@Learner,你找到多分支项目的解决方案了吗? - jhagege

17

补充一下这个问题,我发现您不必使用/buildWithParameters端点。

在我的场景中,我有一个脚本触发Jenkins在部署后运行测试。其中一些测试需要有关部署的额外信息才能正确工作。

如果我尝试在不期望参数的作业上使用/buildWithParameters,该作业将无法运行。我不想编辑每个作业以要求虚假参数只是为了使作业运行。

相反,我发现可以像这样传递参数:

curl -X POST --data-urlencode "token=${TOKEN}" --data-urlencode json='{"parameter": [{"name": "myParam", "value": "TEST"}]}' https://jenkins.corp/job/$JENKINS_JOB/build
使用这个json=...,每次调用时它将传递参数myParam的值为TEST给作业。但是,即使作业不期望参数myParam,Jenkins作业仍然会运行。唯一不涵盖的情况是,如果作业有一个在json中未传递的参数。即使作业为参数设置了默认值,也将无法运行作业。在这种情况下, 当您调用/build时,将遇到以下错误消息/堆栈跟踪: java.lang.IllegalArgumentException: No such parameter definition: myParam 我意识到这个答案已经迟了几年,但我希望这可能对其他人有用! 注意:我正在使用Jenkins v2.163

也许应该将 POST 请求发送到 buildWithParameters 而不是 build?根据 CloudBees 的文章,如果使用前者,则会使用默认值。这是文章链接:https://support.cloudbees.com/hc/en-us/articles/204279870-How-to-submit-a-parameterized-build-request-using-CURL-that-used-the-default-parameter-values- - haridsv
1
如果您将此脚本用于可能触发既带参数又不带参数构建的情况下,buildWithParameters 将在未设置参数的作业上失败,而 build 不会在任何作业上失败。 - Kyle Pittman
谢谢澄清!我猜这很重要,如果脚本非常通用,并且不是为这个特定的工作编写的。 - haridsv
不仅仅是关于泛型,还包括在管道作业中声明但尚未运行的参数。它可以工作,但有一个缺点(根据您的使用情况可能很重要),在这种情况下,响应位置不包含队列项URL,该URL可用于跟踪构建或解决构建URL。 - LoganMzz

3

您可以使用Jenkinsfile轻松尝试。创建一个Jenkins作业,并使用以下流水线脚本。

pipeline {
    agent any

    parameters {
        booleanParam(defaultValue: true, description: '', name: 'userFlag')
    }

    stages {
        stage('Trigger') {
            steps {
                script {
                    println("triggering the pipeline from a rest call...")
                }
            }
        }
        stage("foo") {
            steps {
                echo "flag: ${params.userFlag}"
            }
        }

    }
}

首先需要手动构建一次,以便进行配置,之后只需创建一个http POST请求到Jenkins作业即可。

格式如下:http://server/job/myjob/buildWithParameters?PARAMETER=Value

curl http://admin:test123@localhost:30637/job/apd-test/buildWithParameters?userFlag=false --request POST

4
如何使用此脚本添加身份验证令牌? - Luv33preet

3

2023年更新

Jenkins现在已经更改了身份验证方式。
您需要传递2个令牌才能远程执行作业。
您需要:

  1. apiToken用于验证您的身份。此值是从JENKINS_URL/me/configure创建的。还可以查看此处的文档。
  2. 另一个作业身份验证令牌,当您启用“远程触发构建”时创建。

以下是一个示例,您可以调整它以完成操作。

PARAM1_VALUE=<param1_value>
PARAM2_VALUE=<param2_vale>
USERNAME=dummy_user_name
JENKINS_URL="http://10.xxx.x.xxx:8080"
JOB_TOKEN="<value>" # you create this token when you enable Job>Configure>Build Triggers>Trigger builds remotely
LOGIN_API_TOKEN="<value>" #get this value from JENKINS_URL/me/configure 

curl -g -L --user $USERNAME:$LOGIN_API_TOKEN "$JENKINS_URL/job/JobName/buildWithParameters?token=$JOB_TOKEN&param1_name=$PARAM1_VALUE&param2_name=$PARAM2_VALUE"

-g或--globoff可避免在使用curl传递带有“'”或括号的参数时出现问题


非常感谢! 这就是窍门。 也许你在curl中还需要一个“-X POST”。 - gratinierer

2
要传递/使用变量,首先在Jenkins的配置部分创建参数。您可以使用的参数类型可以是文本、字符串、文件等。
创建它们后,在要使用的字段中使用变量引用。
例如:我已经为“Email-subject”和“Email-recipentList”配置/创建了两个变量,并且我已在“EMail-ext”插件中使用了它们的引用(附加截图)。
(保留HTML标签,请参照原文返回结果)

// 你能展示一下使用API实现这个的方法吗? - Nathan Basanese
我使用了像POST或GET这样简单的HTTP调用。 例如:RESTCallsUtility.invokePostMethod(auth,“<host>/Services/job/Jira2BugDB/buildWithParameters?token=jira2bugdb_remote&Operation=create-single&Argument=”+projectKey,“data”) - Hari Kiran Mutyala

1
当我们需要向Jenkins作业发送多个触发器参数时,可以使用以下命令。
curl -X POST -i -u "auto_user":"xxxauthentication_tokenxxx" "JENKINS_URL/view/tests/job/helloworld/buildWithParameters?param1=162&param2=store"

0
curl -X POST -u Admin:<api_token> http://localhost:8080/job/<job_name>/buildWithParameters\?ColorValue\=sddddsd

2
请阅读[答案]并[编辑]您的答案,以包含有关此代码实际解决问题的说明。请记住,您不仅要解决问题,还要教育OP和任何未来读者。 - Adriaan

0
curl -H "Jenkins-Crumb: <your_crumb_data>" -u "<username>:<password>" "http://<your_jenkins_url>?buildWithParameters?token=<your_remote_api_name>?<parameterA>=<val_parameter_A>&<parameterB>=<val_parameterB>"

您可以根据需要更改以下参数:

<your_crumb_data>
<username>
<password>
<your_jenkins_url>
<your_remote_api_name>
<parameterA>
<parameterB>
<val_parameter_A>
<val_parameter_B>

注意:使用双引号可能很关键。请注意。


0
您可以使用以下查询远程触发Jenkins构建并传递参数。
JENKINS_URL/job/job-name/buildWithParameters?token=TOKEN_NAME&param_name1=value&param_name1=value

JENKINS_URL(可以)= https://<您的域名或服务器地址>

可以使用配置选项卡创建TOKE_NAME


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接