使用Jersey REST和JSON参数启动Jenkins参数化构建
我必须使用Jersey REST API以编程方式启动Jenkins参数化构建,参数值必须作为JSON对象提供。任何提示或示例都是欢迎的。因此,似乎您自己还没有尝试过。我可以给你一个5分钟的快速解决方案,它应该被修改为清晰而不那么难看,但它是有效的:)使用Jersey REST和JSON参数启动Jenkins参数化构建,json,rest,jenkins,Json,Rest,Jenkins,我必须使用Jersey REST API以编程方式启动Jenkins参数化构建,参数值必须作为JSON对象提供。任何提示或示例都是欢迎的。因此,似乎您自己还没有尝试过。我可以给你一个5分钟的快速解决方案,它应该被修改为清晰而不那么难看,但它是有效的:) 根据Jenkins wiki的说法,为了使用RESTAPI进行参数化构建,您应该使用POST而不是get。举个例子。确保您发送的json符合文档中的说明。 以这个json为例: {“参数”:[{“名称”:“id”,“值”:“123”},{“名称”
根据Jenkins wiki的说法,为了使用RESTAPI进行参数化构建,您应该使用POST而不是get。举个例子。确保您发送的json符合文档中的说明。 以这个json为例:
{“参数”:[{“名称”:“id”,“值”:“123”},{“名称”:“详细”,“值”:“高”}]} 您有两个参数,每个参数都有名称和值。如果我使用@stanjer在前面的答案中所写的内容,json应该是这样的: {“参数”:[{“名称”:“对象”,“值”:“测试”}]} 除此之外,还有一个很好的讨论 我不建议使用USER:PASSWORD,而是使用可以在Jenkins作业UI中配置的令牌。下面是一个类,它实现了带/不带参数的生成器模式
import java.util.Map;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class JenkinsTrigger {
private String host;
private String jenkinsToken;
private String jobParams;
private MultivaluedMap<String,String> queryParams = new MultivaluedMapImpl();
private Client client = Client.create();
private WebResource webResource;
private JenkinsTrigger(JenkinsTriggerBuilder jenkinsTriggerBuilder){
this.host = jenkinsTriggerBuilder.host;
this.jenkinsToken = jenkinsTriggerBuilder.jenkinsToken;
this.jobParams = getJobParams(jenkinsTriggerBuilder.jobParams);
webResource = client.resource(this.host);
queryParams.add("token", jenkinsToken);
}
public void trigger(){
ClientResponse response = webResource.path(this.host).queryParams(queryParams)
.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
.header("Content-type", "application/x-www-form-urlencoded")
.post(ClientResponse.class, jobParams);
if (response.getStatus() != 201) {
throw new RuntimeException("Failed : HTTP error code : "
+ response.toString());
} else {
System.out.println("Job Trigger: " + host);
}
}
private String getJobParams(Map<String,String> jobParams){
StringBuilder sb = new StringBuilder();
sb.append("json={\"parameter\":[");
jobParams.keySet().forEach(param -> {
sb.append("{\"name\":\""+param+"\",");
sb.append("\"value\":\""+ jobParams.get(param) + "\"},");
});
sb.setLength(sb.length() - 1);
sb.append("]}");
System.out.println("Job Parameters:" + sb.toString());
return sb.toString();
}
public static class JenkinsTriggerBuilder {
private String host;
private String jenkinsToken;
private Map<String,String> jobParams = null;
public JenkinsTriggerBuilder(String host, String jenkinsToken){
this.host = host;
this.jenkinsToken = jenkinsToken;
}
public JenkinsTriggerBuilder jobParams(Map<String,String> jobParams){
this.jobParams = jobParams;
return this;
}
public JenkinsTrigger build(){
return new JenkinsTrigger(this);
}
}
}
import java.util.Map;
导入javax.ws.rs.core.MediaType;
导入javax.ws.rs.core.MultivaluedMap;
导入com.sun.jersey.api.client.client;
导入com.sun.jersey.api.client.ClientResponse;
导入com.sun.jersey.api.client.WebResource;
导入com.sun.jersey.core.util.MultivaluedMapImpl;
公共类詹金斯触发器{
私有字符串主机;
私有字符串令牌;
私有字符串jobParams;
private MultivaluedMap queryParams=new MultivaluedMapImpl();
私有客户端=Client.create();
私有网络资源;
私有JenkinsTrigger(JenkinsTriggerBuilder JenkinsTriggerBuilder){
this.host=jenkinsTriggerBuilder.host;
this.jenkinsToken=jenkinsTriggerBuilder.jenkinsToken;
this.jobParams=getJobParams(jenkinsTriggerBuilder.jobParams);
webResource=client.resource(this.host);
添加(“令牌”,jenkinsToken);
}
公共无效触发器(){
ClientResponse response=webResource.path(this.host).queryParams(queryParams)
.type(MediaType.APPLICATION\u FORM\u URLENCODED\u type)
.header(“内容类型”、“应用程序/x-www-form-urlencoded”)
.post(ClientResponse.class、jobparms);
if(response.getStatus()!=201){
抛出新的RuntimeException(“失败:HTTP错误代码:”
+response.toString());
}否则{
System.out.println(“作业触发器:+host”);
}
}
私有字符串getJobParams(映射jobParams){
StringBuilder sb=新的StringBuilder();
sb.append(“json={\”参数\“:[”);
jobParams.keySet().forEach(参数->{
sb.追加(“{\”名称\“:\”+param+“\”,”);
sb.append(“\”value\”:\“”+jobParams.get(param)+“\”},”);
});
sb.setLength(sb.length()-1);
某人附加(“]}”);
System.out.println(“作业参数:+sb.toString());
使某人返回字符串();
}
公共静态类JenkinsTriggerBuilder{
私有字符串主机;
私有字符串令牌;
私有映射jobParams=null;
公共JenkinsTriggerBuilder(字符串主机,字符串jenkinsToken){
this.host=host;
this.jenkinsToken=jenkinsToken;
}
public Jenkins TriggerBuilder作业参数(映射作业参数){
this.jobParams=jobParams;
归还这个;
}
公共触发器生成(){
返回新的Jenkins触发器(此);
}
}
}
下面是使用示例:
Map<String, String> params = new HashMap<>();
params.put("ENV", "DEV103");
JenkinsTrigger trigger = new JenkinsTriggerBuilder("https://JENKINS_HOST/job/JOB_NAME/buildWithParameters","JOB_TOKEN").jobParams(params).build();
trigger.trigger();
Map params=newhashmap();
参数put(“ENV”、“DEV103”);
JenkinsTrigger=新建JenkinsTriggerBuilder(“https://JENKINS_HOST/job/JOB_NAME/buildWithParameters,“JOB_TOKEN”).jobParams(params.build();
trigger.trigger();
祝你好运嗨,Stanjer,我测试了这个例子,但有两个问题:1。get方法只接受一个类参数和2。Jenkins抛出以下例外:由以下原因引起:java.lang.IllegalArgumentException:索引88处查询中的非法字符:{“param0”:“value0”}。此作业有一个名为param0的参数,并从仪表板中的值0开始。一切正常。
Map<String, String> params = new HashMap<>();
params.put("ENV", "DEV103");
JenkinsTrigger trigger = new JenkinsTriggerBuilder("https://JENKINS_HOST/job/JOB_NAME/buildWithParameters","JOB_TOKEN").jobParams(params).build();
trigger.trigger();