jenkins提供了一些api可以让我们远程对jenkins进行操作,
这里说一些jenkins关于安全相关的一些坑
1.跨域访问:
跨域访问我们需要通过get请求获取到/crumbIssuer/api/json,然后再请求头中添加crumbRequestField值为crumb的头信息
2.登录验证信息,一些需要登录才能操作的需要我们添加校验信息:
headers.add("Authorization", "Basic YWxsZW46YWxsZW4=");
3。token api
高版本的jenkins中,提倡使用token api ,这样我们可以通过管理token来管理对外的api权限
,在postman中我们可以直接post请求http://tokenapi:[email protected]:8080/job/allen-jenkins/build就可以进行任务构建,
这里tokenapi是用户名信息,而不是tokenid,token是创建tokenapi的时候返回的字符串
但是在web应用中,这样是行不通的,不管怎么调用都会返回No valid crumb was included in the request,加了登录验证,加了
Crumb,加了tokenapi:110d30bafe99e2e6c21658f655c5899f98都不行。
最后通过fiddler来拦截请求发现,postman的请求最后也是加了一串Authorization头信息,
Authorization: Basic YWxsZW46MTEwZDMwYmFmZTk5ZTJlNmMyMTY1OGY2NTVjNTg5OWY5OA==
也就是说,我们加在请求中的tokenapi:110d30bafe99e2e6c21658f655c5899f98在postman中会自动转为头信息,
但是在RestTemplate中就不会,我们吧RestTEmplate中也将tokenapi:110d30bafe99e2e6c21658f655c5899f98转为Authorization头,发现,最终调用成功。
如果使用jenkins-rest库进行请求,则只需
JenkinsClient client = JenkinsClient.builder()
.endPoint("http://localhost:8080")
.credentials("allen:110d30bafe99e2e6c21658f655c5899f98")
.build();
就可以直接进行接口调用了
最后是版本依赖问题:
我使用springboot 2.2.6.RELEASE版本
jenkins-rest的任何版本都无法与之兼容,后面查看依赖jar包,发现是gson的冲突,原因是jenkins-rest使用的gson版本较低,springboot使用的gson版本较高,高低版本之间有些不一样,程序启动就会出问题,低版本的无法适应springboot,高版本的不能
适应jenkins-rest,这就需要找到一个双方都能满足的中间版本
解决方法是,使用最高版本的jenkins-rest这里使用的是0.0.25(使用的gson版本是2.6),使用的springboot版本是2.2.6.RELEASE ,
gson版本是2.8.6, 然后我们在jenkins-rest依赖中排除gson,单独引入gson:
经测试,问题解决