当咱们经过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
咱们能够总结为docker-cli经过脚本或CLI命令来控制docker-api与docker-daemon进行交互。咱们知道了docker引擎的组成和交互方式。咱们能够按照这个例子来实现流水线中与其余系统间的交互。今天的实例是:在流水线中操做gitlab系统建立一个分支。docker
首先咱们须要找到gitlab系统的接口文档,打开地址https://docs.gitlab.com/ce/api/README.html。 咱们找到左侧菜单Resources
而后找到Branches
以下图所示咱们找到了接口。shell
查看右侧导航,找到建立分支的接口。api
OK,找到了建立分支的接口了。咱们能够看到这个文档很是详细,主要告诉咱们几个信息。 接口地址、参数列表、请求模板、响应模板。 接口地址就是咱们要发送请求的地址,参数就是咱们要发送请求时传递的参数。请求模板和响应模板是官方给的接口使用方法。 curl
咱们经过上面的实例能够看到,使用的是curl命令完成的整个请求。 固然咱们也是能够直接使用shell 命令curl完成的。此次咱们推荐使用httprequest方法来完成。既然要使用httprequest方法,咱们得学习一下使用的方式。 首先咱们在jenkins中安装插件Httprequests
。(插件中搜索关键字requests)。ide
咱们来分析一下官方给的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>"
最后生成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工具完成了响应数据的解析。
回到流水线中,我把交互过程分红了3个步骤:研究外围系统API使用、使用HttpRequest方法封装HTTP请求、使用readJSON方法解析数据。本篇文章讲解是一个思路,后期若有与其余系统例如需求管理平台jira集成,也能够参考此步骤来完成。但愿对你有所帮助!