Jenkins是如何與外圍系統集成的呢?

當咱們經過Jenkins完成了持續交付流水線的實施後,咱們可能須要在流水線中去與其餘系統交互。例如代碼管理系統、代碼質量平臺、需求管理平臺等外圍系統交互。咱們如何來實現呢? html

簡單的說下docker的組件分爲docker-cli、docker-api、docker-daemon。docker-cli是咱們常常在shell命令行中使用的docker命令,相似於docker run、docker images等等。docker-api是用於接收docker-cli的請求,能夠用來與守護程序進行通訊並指示其操做的接口。docker-daemon長期運行的程序,建立和管理Docker對象,例如image,container,network和volume。git

Jenkins是如何與外圍系統集成的呢?

咱們能夠總結爲docker-cli經過腳本或CLI命令來控制docker-api與docker-daemon進行交互。咱們知道了docker引擎的組成和交互方式。咱們能夠按照這個例子來實現流水線中與其餘系統間的交互。今天的實例是:在流水線中操做gitlab系統建立一個分支。docker

1.1 研究GitLAB系統API

首先咱們須要找到gitlab系統的接口文檔,打開地址https://docs.gitlab.com/ce/api/README.html。 咱們找到左側菜單Resources 而後找到Branches以下圖所示咱們找到了接口。shell

Jenkins是如何與外圍系統集成的呢?

查看右側導航,找到建立分支的接口。api

Jenkins是如何與外圍系統集成的呢?

OK,找到了建立分支的接口了。咱們能夠看到這個文檔很是詳細,主要告訴咱們幾個信息。 接口地址、參數列表、請求模板、響應模板。 接口地址就是咱們要發送請求的地址,參數就是咱們要發送請求時傳遞的參數。請求模板和響應模板是官方給的接口使用方法。 curl

Jenkins是如何與外圍系統集成的呢?

1.3 使用HttpRequests封裝接口

咱們經過上面的實例能夠看到,使用的是curl命令完成的整個請求。 固然咱們也是能夠直接使用shell 命令curl完成的。此次咱們推薦使用httprequest方法來完成。既然要使用httprequest方法,咱們得學習一下使用的方式。 首先咱們在jenkins中安裝插件Httprequests。(插件中搜索關鍵字requests)。ide

Jenkins是如何與外圍系統集成的呢?

咱們來分析一下官方給的demo工具

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=master"

###
--request指定請求模式
--header 指定請求中的頭部信息
後面的url就是api地址

而後咱們進入到流水線語法、片斷生成器、找到httpRequest方法的使用。須要填寫信息: gitlab

#API地址:
url :https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=master

#請求模式
httpmode: POST

#頭部信息
Custom headers: PRIVATE-TOKEN: <your_access_token>"

Jenkins是如何與外圍系統集成的呢?

最後生成Jenkinsfile學習

httpRequest acceptType: 'APPLICATION_JSON_UTF8', contentType: 'APPLICATION_JSON_UTF8', customHeaders: [[maskValue: false, name: 'PRIVATE-TOKEN', value: '${gitlabtoken}']], httpMode: 'POST', responseHandle: 'NONE', url: 'https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=master', wrapAsMultipart: false

能夠看到圖片最後一部分,header我使用的是一個變量${gitalabtoken}。 這裏其實存放的是gitlab的token,屬於敏感信息因此咱們建立一個gitlab用戶token,而後保存到jenkins的憑據中。咱們使用的是secure text類型的憑據。最後在流水線中讀取憑據。

withCredentials([string(credentialsId: '你的tokenid', variable: 'gitlabtoken')]) {
     httpRequest acceptType: 'APPLICATION_JSON_UTF8', 
                 contentType: 'APPLICATION_JSON_UTF8', 
                 customHeaders: [[maskValue: false, 
                                  name: 'PRIVATE-TOKEN', 
                                  value: '${gitlabtoken}']], 
                 httpMode: 'POST', 
                 responseHandle: 'NONE', 
                 url: 'https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=master', 
                 wrapAsMultipart: false

}

注意看上面的customHeaders部分,須要將 '${gitlabtoken}'中的單引號替換成雙引號,由於單引號沒法解析變量。

withCredentials([string(credentialsId: '你的tokenid', variable: 'gitlabtoken')]) {
     httpRequest acceptType: 'APPLICATION_JSON_UTF8', 
                 contentType: 'APPLICATION_JSON_UTF8', 
                 customHeaders: [[maskValue: false, 
                                  name: 'PRIVATE-TOKEN', 
                                  value: "${gitlabtoken}"]], 
                 httpMode: 'POST', 
                 responseHandle: 'NONE', 
                 url: 'https://gitlab.example.com/api/v4/projects/5/repository/branches?branch=newbranch&ref=master', 
                 wrapAsMultipart: false

}

ok,這樣的一個請求就封裝 完成了。想想咱們是否會對gitlab更多的操做 呢? 例如建立文件、獲取分支、刪除分支、獲取項目等等。因此咱們來優化一下,咱們單獨的封裝一個httpReq方法來完成。

//封裝HTTP請求
def HttpReq(reqType,reqUrl,reqBody){
    def gitServer = "http://192.168.1.200:30088/api/v4"
    withCredentials([string(credentialsId: 'gitlab-token', variable: 'gitlabtoken')]) {
      result = httpRequest customHeaders: [[maskValue: true, name: 'PRIVATE-TOKEN', value: "${gitlabtoken}"]], 
                httpMode: reqType, 
                contentType: "APPLICATION_JSON",
                consoleLogResponseBody: true,
                ignoreSslErrors: true, 
                requestBody: reqBody,
                url: "${gitServer}/${reqUrl}"
                //quiet: true
    }
    return result
}

//建立分支
def CreateBranch(projectId,refBranch,newBranch){
    branchApi = "projects/${projectId}/repository/branches?branch=${newBranch}&ref=${refBranch}"
    response = HttpReq("POST",branchApi,'').content
    branchInfo = readJSON text: """${response}"""
}

最後jenkinsfile就變成了這樣了。上面咱們使用了readJSON工具完成了響應數據的解析。

1.4 總結

回到流水線中,我把交互過程分紅了3個步驟:研究外圍系統API使用、使用HttpRequest方法封裝HTTP請求、使用readJSON方法解析數據。本篇文章講解是一個思路,後期若有與其餘系統例如需求管理平臺jira集成,也能夠參考此步驟來完成。但願對你有所幫助!


基於Jenkins的DevOps流水線實踐教程已上線,感興趣的同窗點擊連接獲取哦! https://edu.51cto.com/sd/36f6e

相關文章
相關標籤/搜索