Java 调用jenkins api ,调用build方法,403

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部署

  1. idea ,报错信息:c.h.demo.common.GlobalExceptionHandler : status code: 403
  2. 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;

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值