公司主要要开发本身的paas平台,集成了Jenkins,真的是遇到了不少不少困难,特别是在api调用的权限这一块,这里,把本身遇到的一些坑的解决方法作一下笔记吧。固然,首先要讲的,就是如何在开启安全的状况下进行API调用。html
若是勾选不对,那么Jenkins有可能崩溃掉,亲身经历,以前一直没有勾选安全域,而后受权策略为登陆用户能够作任何事,以后权限这一块就完全崩溃了,重装了又重装,才知道,须要勾选安全域。
前端
同时开启跨站请求伪造保护,Jenkins的一些API须要用到的。
java
Jenkins的用户token能够在用户的设置下面得到,可是这种方式若是须要重装Jenkins的话,就得从新修改一次配置文件
git
通过对Jenkins-client的抓包分析,token能够由username+":"+password,而后进行base64加密组成,以后在token前面加上"Basic "便可,代码以下:
github
在远程API调用的时候,Jenkins对于某些接口的要求不只限于Authorization,还必需要有Jenkins-Crumb,这个东西以前在进行获取的时候,有时候会变来变去,好比用curl命令和f12查看的时候发现不一致,实在受不了,感受毫无规律可言,以后才发现上面的Authorization来直接调用接口获取的才是正确的,再而后想一想,多是以前调用api的时候,没有开启启用安全,再或者是有没有勾选上使用碎片算法。
web
另,附上curl查询Jenkins-Crumb的命令:ajax
curl -s 'http://admin:yourtoken@jenkins-url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
替换掉yourtoken和jenkins-url便可。算法
Jenkins的API设计可谓是独领风骚,能把一个提交设计成这样真实佩服测试以后才发现只要提交个表单,key为json,value为值便可,其余的都不须要,这个设计我也不知道怎么来的,感受超级坑。
shell
因为咱们是将Jenkins集成在咱们本身的平台里面,并不暴露Jenkins给用户,因此,建立一个job的时候,必须由咱们平台的参数往Jenkins里面提交,这一提交,发现的问题很多。
一是Jenkins的整个job的提交是由两步组成的,先是建立job,再提交配置。即:/createItem?name=xxx接口。
二是提交的配置参数,提交的是整个xml,而不是由一个一个参数组成的。对于java来讲,就得使用xstream或者其余来转化,甚是折腾,如图这种转化。
json
在点击当即构建的时候,Jenkins是没有返回任何信息,可是在Jenkins的内部,它是经过放到队列里等待的,若是有空闲,就开始构建,不然等待,这个队列是能够获取获得的,咱们从里面能够获取上一次构建的信息,是成功仍是失败。这种状况下,假设咱们多我的同时点击,这下子就有点慌了,如何获取到具体某我的的构建结果,有点虐心。想了半天,最终得出的事:代码相同,意味着每次构建的结果相同,为何要容许多我的同时点击?就这么解决了:从一个job的构建队列中获取最后一次构建的信息,若是是正在构建,那么不容许构建了,直到构建结果出来。
须要将Jenkins中的构建进度移植到咱们自有的平台,Jenkins的构建进度时经过ajax轮询实现的,获取文本的规则主要从response header里面的两个字段获取
(1)X-More-Data:是否有更多的数据
(2)X-Text-Size:从开始到该次调用的文本大小
咱们是经过websocket来将文本内容推送到前端,使用的stomp协议,部分代码以下:
while (true) { ... String string = response.body().string(); String header = response.header("X-More-Data"); if (!Strings.isNullOrEmpty(header) || start == 0) { template.convertAndSend("/topic/" + uuid, string); String textSize = response.header("X-Text-Size"); if (!Strings.isNullOrEmpty(textSize)) { start = Integer.parseInt(textSize); } TimeUnit.SECONDS.sleep(5); } else { template.convertAndSend("/topic/" + uuid, string); return; } }