jenkins rest api调用中的一些坑

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:


            com.cdancy
            jenkins-rest
            0.0.20
            
            
                com.google.code.gson
                gson
            

        

       

       
       
         com.google.code.gson
         gson
         2.5
      

经测试,问题解决

你可能感兴趣的:(问题总结)