Java 调用jenkins api ,调用build方法,403
问题描述:
使用
com.offbytwo.jenkins.JenkinsServer;
com.offbytwo.jenkins.client.JenkinsHttpClient;
com.offbytwo.jenkins.model.Job;
创建Jenkins job,并构建
发现创建job 成功,但调用build方法报403错误
背景介绍
搭建的Jenkins,是在windows环境下,使用tomcat部署
- idea ,报错信息:c.h.demo.common.GlobalExceptionHandler : status code: 403
- tomcat ,通过执行窗口,可以看见详细报错“No valid crumb was included in request for /jenkins/job/aitest_start_job99/b…"
经过度娘
发现是部署的jenkins 需要配置关闭跨站请求伪造保护,但是由于2.2以上高版本,Jenkins界面不再提供这个选项,所以需要修改jenkins的配置文件,由于我的背景是tomcat部署的Jenkins,网上提供了很多方法都是jenkins单独部署,又是一顿查阅后,最终找到解决方案
解决方案
windows:
在C:\你的路径\apache-tomcat-9.0.41\bin下
找到catalina.bat 增加一行内容
set "JAVA_OPTS=%JAVA_OPTS% -server -Xms5120m -Xmx10240m -XX:PermSize=640M -XX:MaxPermSize=2560m -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
如图,我添加在文件的第二行
linux
JAVA_OPTS="-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
重新启动Jenkins, 可以在manager Jenkins->Security->Configure Global Security->CSRF Protection 中查看到增加了一句话
This configuration is unavailable because the System property hudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION is set to true.
如图
再次执行java代码,不再报403错误
附Java代码如下
import com.alibaba.fastjson.JSONObject;
import com.hogwartsmini.demo.common.UserBaseStr;
import com.hogwartsmini.demo.dto.RequestInfoDto;
import com.hogwartsmini.demo.dto.ResultDto;
import com.hogwartsmini.demo.dto.TokenDto;
import com.hogwartsmini.demo.dto.jenkins.OperateJenkinsJobDto;
import com.hogwartsmini.demo.entity.HogwartsTestJenkins;
import com.hogwartsmini.demo.entity.HogwartsTestTask;
import com.hogwartsmini.demo.entity.HogwartsTestUser;
import com.offbytwo.jenkins.JenkinsServer;
import com.offbytwo.jenkins.client.JenkinsHttpClient;
import com.offbytwo.jenkins.model.Job;
import org.apache.commons.lang.StringUtils;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.core.io.ClassPathResource;
import sun.awt.SunToolkit;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
public class JenkinsUtil {
public static ResultDto<HogwartsTestUser> build(OperateJenkinsJobDto operateJenkinsJobDto) throws URISyntaxException, IOException {
//获取构建Jenkins的相关参数
TokenDto tokenDto=operateJenkinsJobDto.getTokenDto();
HogwartsTestJenkins hogwartsTestJenkins=operateJenkinsJobDto.getHogwartsTestJenkins();
HogwartsTestUser hogwartsTestUser=operateJenkinsJobDto.getHogwartsTestUser();
Map<String,String> params=operateJenkinsJobDto.getParams();
//读取创建job xml文件
ClassPathResource classPathResource =new ClassPathResource("JenkinsConfigDir/hogwarts_start_jenkins_show.xml");
InputStream inputStream=classPathResource.getInputStream();
String jobConfiXml=FileUtil.getText(inputStream);
//替换创建job xml里的参数
//todo 增加非空等校验
String baseUrl=hogwartsTestJenkins.getUrl();
String userName=hogwartsTestJenkins.getUserName();
String password=hogwartsTestJenkins.getPassword();
System.out.println("jenkins请求地址"+baseUrl+"\n"+
"用户名"+userName+"\n"+
"密码"+password);
//如果当遇见,jenkins并没有提供用户名密码,而是提供授权的方式,可以通过token当密码,进行唤起jenkins client
//获取jenkins客户端对象,并获取版本号
JenkinsHttpClient jenkinsHttpClient=new JenkinsHttpClient(new URI(baseUrl),userName,password);
String jenkinsVersion=jenkinsHttpClient.getJenkinsVersion();
System.out.println("jenkins的版本号"+jenkinsVersion);
//获取jenkin 里的jobs,并创建job
JenkinsServer jenkinsServer=new JenkinsServer(jenkinsHttpClient);
String jobName = "aitest_start_job"+hogwartsTestUser.getId();
//执行测试job名称, 不为空时表示已经创建job
if(StringUtils.isEmpty(hogwartsTestUser.getStartTestJobName())){
jenkinsServer.createJob(jobName,jobConfiXml,true);
hogwartsTestUser.setStartTestJobName(jobName);
}else{
jenkinsServer.updateJob(jobName,jobConfiXml,true);
}
Map<String, Job> jobMap=jenkinsServer.getJobs();
//根据job名称获取Jenkins上的job信息
Job job=jobMap.get(jobName);
//为构建参数赋值
Map<String, String> map=params;
//开始有参构建
job.build(map,true); //就执行到这里报403错误
return ResultDto.success("成功",hogwartsTestUser);
}
public static StringBuilder getUpdateTaskStatusUrl(RequestInfoDto requestInfoDto, HogwartsTestTask hogwartsTestTask){
StringBuilder updateStatusUrl=new StringBuilder();
updateStatusUrl.append("curl -X PUT ");
updateStatusUrl.append("\""+requestInfoDto.getBaseUrl()+"/task/status \" ");
updateStatusUrl.append("-H \"Content-Type: application/json\" ");
updateStatusUrl.append("-H \"token:"+requestInfoDto.getToken()+"\" ");
updateStatusUrl.append("-d ");
JSONObject json=new JSONObject();
json.put("taskId",hogwartsTestTask.getId());
json.put("status", UserBaseStr.STATUS_THREE);
json.put("buildUrl","${BUILD_URL}");
updateStatusUrl.append("'"+json.toJSONString()+"'");
return updateStatusUrl;
}
}