Jenkins的一些筆記

公司主要要開發本身的paas平臺,集成了Jenkins,真的是遇到了不少不少困難,特別是在api調用的權限這一塊,這裏,把本身遇到的一些坑的解決方法作一下筆記吧。固然,首先要講的,就是如何在開啓安全的狀況下進行API調用。html

1、在全局安全配置中

1.1 啓用安全

若是勾選不對,那麼Jenkins有可能崩潰掉,親身經歷,以前一直沒有勾選安全域,而後受權策略爲登陸用戶能夠作任何事,以後權限這一塊就完全崩潰了,重裝了又重裝,才知道,須要勾選安全域。
前端

1.2 跨域

同時開啓跨站請求僞造保護,Jenkins的一些API須要用到的。
java

2、獲取TOKEN

2.1 TOKEN

Jenkins的用戶token能夠在用戶的設置下面得到,可是這種方式若是須要重裝Jenkins的話,就得從新修改一次配置文件
git

通過對Jenkins-client的抓包分析,token能夠由username+":"+password,而後進行base64加密組成,以後在token前面加上"Basic "便可,代碼以下:
github

3、獲取Jenkins-Crumb

在遠程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便可。算法

4、值得注意的事

4.1 API設計

Jenkins的API設計可謂是獨領風騷,能把一個提交設計成這樣真實佩服測試以後才發現只要提交個表單,key爲json,value爲值便可,其餘的都不須要,這個設計我也不知道怎麼來的,感受超級坑。
shell

4.2 生成構建job

因爲咱們是將Jenkins集成在咱們本身的平臺裏面,並不暴露Jenkins給用戶,因此,建立一個job的時候,必須由咱們平臺的參數往Jenkins裏面提交,這一提交,發現的問題很多。
一是Jenkins的整個job的提交是由兩步組成的,先是建立job,再提交配置。即:/createItem?name=xxx接口。
二是提交的配置參數,提交的是整個xml,而不是由一個一個參數組成的。對於java來講,就得使用xstream或者其餘來轉化,甚是折騰,如圖這種轉化。
json

4.3 構建的隊列

在點擊當即構建的時候,Jenkins是沒有返回任何信息,可是在Jenkins的內部,它是經過放到隊列裏等待的,若是有空閒,就開始構建,不然等待,這個隊列是能夠獲取獲得的,咱們從裏面能夠獲取上一次構建的信息,是成功仍是失敗。這種狀況下,假設咱們多我的同時點擊,這下子就有點慌了,如何獲取到具體某我的的構建結果,有點虐心。想了半天,最終得出的事:代碼相同,意味着每次構建的結果相同,爲何要容許多我的同時點擊?就這麼解決了:從一個job的構建隊列中獲取最後一次構建的信息,若是是正在構建,那麼不容許構建了,直到構建結果出來。

4.4 構建進度的查看

須要將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;
            }
        }

參考:
1.經過jenkins API去build一個job
2.Jenkins Remote API

相關文章
相關標籤/搜索