利用自定義 DSL 簡(jiǎn)化 jenkins 流水線

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ā)布踏揣,需要新增配置來生成新的半自由流水線
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匾乓,隨后出現(xiàn)的幾起案子呼伸,更是在濱河造成了極大的恐慌,老刑警劉巖钝尸,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件括享,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡珍促,警方通過查閱死者的電腦和手機(jī)铃辖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猪叙,“玉大人娇斩,你說我怎么就攤上這事⊙妫” “怎么了犬第?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芒帕。 經(jīng)常有香客問我歉嗓,道長,這世上最難降的妖魔是什么背蟆? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任鉴分,我火速辦了婚禮,結(jié)果婚禮上带膀,老公的妹妹穿的比我還像新娘志珍。我一直安慰自己,他們只是感情好垛叨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布伦糯。 她就那樣靜靜地躺著,像睡著了一般嗽元。 火紅的嫁衣襯著肌膚如雪敛纲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天还棱,我揣著相機(jī)與錄音载慈,去河邊找鬼。 笑死珍手,一個(gè)胖子當(dāng)著我的面吹牛办铡,可吹牛的內(nèi)容都是我干的辞做。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼寡具,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秤茅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起童叠,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤框喳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后厦坛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體五垮,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年杜秸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放仗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撬碟,死狀恐怖诞挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呢蛤,我是刑警寧澤惶傻,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站其障,受9級(jí)特大地震影響银室,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜静秆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一粮揉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抚笔,春花似錦、人聲如沸侨拦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狱从。三九已至膨蛮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間季研,已是汗流浹背敞葛。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留与涡,地道東北人惹谐。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓持偏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氨肌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸿秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 2016年11月份的技術(shù)雷達(dá)中給出了一個(gè)簡(jiǎn)明的定義:流水線即代碼 (Pipeline as Code) 通過編碼而...
    lambeta閱讀 982評(píng)論 0 4
  • 本文是2017年3月13日晚9點(diǎn)在“AHA面對(duì)面”線上分享的“單件流的力量-伍斌_Ben面對(duì)面”的操練步驟,這里是...
    程序員吾真本閱讀 3,685評(píng)論 3 14
  • 文/鄢倩 2016年11月份的技術(shù)雷達(dá)中給出了一個(gè)簡(jiǎn)明的定義:流水線即代碼(Pipeline as Code)通過...
    ThoughtWorks閱讀 1,320評(píng)論 3 6
  • 前言 Jenkins就不用做多余的介紹了怎囚,作為CI/CD首選的開源解決方案卿叽,持續(xù)集成 (Continous Int...
    王奧OX閱讀 3,121評(píng)論 1 13
  • 1.animate通過過渡來實(shí)現(xiàn) 2.運(yùn)動(dòng)效果 3.鏈?zhǔn)秸{(diào)用改變css樣式 4.不用queue改變背景無效 5.q...
    frankisbaby閱讀 380評(píng)論 0 0