使用Jersey REST和JSON参数启动Jenkins参数化构建

使用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”},{“名称”

我必须使用Jersey REST API以编程方式启动Jenkins参数化构建,参数值必须作为JSON对象提供。任何提示或示例都是欢迎的。

因此,似乎您自己还没有尝试过。我可以给你一个5分钟的快速解决方案,它应该被修改为清晰而不那么难看,但它是有效的:)


根据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();