jenkins 流水線
jenkins 流水線是一套運(yùn)行于jenkins上的工作流框架纺裁,將原本獨(dú)立運(yùn)行于單個(gè)或者多個(gè)節(jié)點(diǎn)的任務(wù)連接起來诫肠,實(shí)現(xiàn)單個(gè)任務(wù)難以完成的復(fù)雜流程編排與可視化。jenkins 流水線通過 groovy 語法定義欺缘,以下使用 jenkins pipeline groovy 描述 jenkins 流水線定義文件栋豫。
具體可參考官方文檔:
https://jenkins.io/zh/doc/book/pipeline/
yaml
yaml 是一種簡(jiǎn)潔的非標(biāo)記語言。yaml 以數(shù)據(jù)為中心谚殊,使用空白丧鸯,縮進(jìn),分行組織數(shù)據(jù)嫩絮,從而使得表示更加簡(jiǎn)潔易讀丛肢。
具體可參考:
http://www.ruanyifeng.com/blog/2016/07/yaml.html
通過自定義 DSL 簡(jiǎn)化 jenkins 流水線
將 yaml 的簡(jiǎn)單語法做為自定義 DSL 語法,來簡(jiǎn)化 jenkins 流水線 groovy 語法剿干。在此基礎(chǔ)上抽象 jenkins 流水線公共模塊蜂怎,通過幾種配置,形成常用流水線置尔。
根據(jù)軟件發(fā)布環(huán)境階段杠步,抽象構(gòu)建(build)、測(cè)試(test)、聯(lián)調(diào)(mertest )和 生產(chǎn)(prod)等 4個(gè) 階段篮愉。根據(jù) 4個(gè) 階段抽象如下幾個(gè)公共模塊:
- 代碼編譯
- 代碼規(guī)范檢查
- 單元測(cè)試
- 用例測(cè)試
- 部署
通過組裝以上公共模塊腐芍,形成半自由流水線。所謂半自由流水線是指流水線在固定流程上保留一部分自由修改功能试躏。下面以一個(gè) default 配置簡(jiǎn)述半自由流水線猪勇。
1、整體架構(gòu)圖
用以下圖簡(jiǎn)單描述整體架構(gòu)颠蕴,真正的流程可能還稍復(fù)雜泣刹,但不影響下面描述。
用戶通過定義簡(jiǎn)單 yaml 犀被,server 通過將 yaml 與 default 配置生成 jenkins pipeline groovy 文件椅您,其中 groovy 文件描述了 jenkins pipeline 整個(gè)執(zhí)行流程。
2寡键、通過 yaml 定義流水線
用以下 yaml 格式掀泳,來定義 default 流水線。該流水線分為全局西轩、build员舵、test、mertest 和 prod等五部分藕畔。全局包括應(yīng)用全局參數(shù)马僻,build 包括代碼編譯、代碼規(guī)范檢查和單元測(cè)試注服,test 包括部署和用例測(cè)試韭邓,mertest 包括部署和用例測(cè)試,prod 包括部署溶弟。
default 流水線是個(gè)固定流水線女淑,先后的順序已經(jīng)固定,但是部分階段可選可很,比如 test 可以跳過部署诗力,又比如 mertest 可以整體跳過等,因此這種流水線就是半自由流水線我抠。
半自由流水線即符合公司現(xiàn)有流程苇本,又簡(jiǎn)化了用戶使用。還有一部分自由度菜拓,可以通過跳過部分步驟來適應(yīng)其它項(xiàng)目瓣窄,或索性通過新建配置(參考 default 配置)生成另外一種半自由流水線來適應(yīng)更多項(xiàng)目。
configName: default
application: someapp
language: java
description: huifu devops server
gitURL: git@172.31.13.131:devops/someapp.git
packageType: jar
build:
# ------可選
compiler:
cmd: mvn clean install -U -f pom.xml -Pundertow package -Dmaven.test.skip=true
check:
cmd: mvn -f pom.xml pmd:pmd
unittest:
cmd: mvn -f pom.xml cobertura:cobertura-integration-test
# ------
test:
# ------可選
deploy:
area: aliyun #部署區(qū)域
appNames: someapp #應(yīng)用名纳鼎,對(duì)應(yīng) war 或 jar 包名
ips: 192.168.16.19 #服務(wù)器 ip
serverUsername: someapp #服務(wù)器用戶名
# ------
casetest:
ip: 192.168.25.19
# ------可選
mertest:
# ------可選
compiler:
cmd: mvn clean install -U -f pom.xml -Pundertow package -Dmaven.test.skip=true
# ------
deploy:
area: aliyun
appNames: someapp
ips: 192.168.25.19,192.168.25.20
serverUsername: someapp
casetest:
ip: 192.168.25.19
prod:
# ------可選
compiler:
cmd: mvn clean install -U -f pom.xml -Pundertow package -Dmaven.test.skip=true
# ------
delivery_type: deploy
deploy:
area: aliyun
appNames: someapp
ips: 172.19.30.19
serverUsername: someapp
3俺夕、jenkins pipeline groovy
groovy 文件描述了 jenkins pipeline 整個(gè)執(zhí)行流程裳凸,是 jenkins pipeline DSL 靜態(tài)描述,有特定語法劝贸,對(duì)一般用戶并不友好姨谷。為了用戶無需關(guān)注 groovy 語法,通過開放出 yaml 形式 DSL映九,供用戶簡(jiǎn)單使用梦湘。
根據(jù) build、test件甥、mertest 和 prod 等環(huán)境捌议,分別對(duì)應(yīng) jenkins pipeline 4個(gè) 任務(wù),任務(wù)內(nèi)部流程控制通過 jenkins 完成引有,任務(wù)間流程通過 server 調(diào)度實(shí)現(xiàn)瓣颅,從而實(shí)現(xiàn) ci cd 一整條流水線。
優(yōu)缺點(diǎn)
1譬正、優(yōu)點(diǎn):
- 通過 yaml DSL宫补,用戶無需使用 groovy 語法,簡(jiǎn)化 jenkins pipeline 定義
- 通過新建配置导帝,可以生成新的一種半自由流水線守谓,適應(yīng)現(xiàn)有項(xiàng)目 ci cd 流程
2、缺點(diǎn)
- server 維護(hù)代碼編譯您单、代碼規(guī)范檢查、單元測(cè)試荞雏、用例測(cè)試和部署等 5個(gè) 公共模塊虐秦,公共模塊根據(jù)部署環(huán)境、部署二進(jìn)制類型凤优、部署區(qū)域和 ci悦陋、cd等,因此會(huì)有數(shù)倍個(gè)公共模塊筑辨,公共模塊維護(hù)成本太高
- yaml 修改需要重新生成 jenkins pipeline groovy 文件俺驶,無法做到流水線動(dòng)態(tài)化運(yùn)行
未來展望
針對(duì)以上缺點(diǎn),或許可以通過以下新技術(shù)解決:
- 針對(duì)公共模塊維護(hù)成本高的的問題棍辕,利用 docker暮现、kubernetes 等容器化技術(shù),簡(jiǎn)化代碼編譯和部署等公用模塊邏輯楚昭,減少公共模塊數(shù)量栖袋,還能減少 yaml 參數(shù)等,從而更簡(jiǎn)化用戶定義
- 針對(duì)無法動(dòng)態(tài)化運(yùn)行流水線抚太,可以利用 jenkins 共享庫(shared library)塘幅,將公共模塊抽象到 jenkins 共享庫昔案,jenkins 共享庫可以參考 https://jenkins.io/zh/doc/book/pipeline/shared-libraries/
- default 流水線預(yù)計(jì)能適應(yīng)公司大部分項(xiàng)目,但如果新增公用模塊电媳,比如灰度發(fā)布踏揣,需要新增配置來生成新的半自由流水線