Jenkins與持續(xù)集成流水線

目錄:

1.序言

2.job的基本配置

---2.1 源碼管理

---2.2 構(gòu)建命令配置

---2.3 構(gòu)建觸發(fā)配置(何時開始構(gòu)建)

3.插件及常用功能

---3.1 構(gòu)建后操作:觸發(fā)下個構(gòu)建

---3.2 構(gòu)建后操作:郵件通知及附件

---3.3 構(gòu)建后操作:單元測試報(bào)告展示

4.流水線配置

5.結(jié)語

1.序言

當(dāng)傳統(tǒng)工業(yè)的大部分工作都交由軟件控制時贯涎,軟件生產(chǎn)商還有什么理由人工處理機(jī)械性的工作呢拢军?

當(dāng)我們提交了一部分修改完成的代碼后韧衣,我們總是希望可以快速功戚、持續(xù)地得到直觀且有效的反饋,以達(dá)到我們持續(xù)快速交付的目的。持續(xù)集成也是敏捷開發(fā)的好伙伴。Jenkins工具則是我們達(dá)到目的的利器。

我們在平時的工程中宰睡,總有一部分工作是相對機(jī)械化,易出錯的(例如部署气筋,打包)拆内,把這部分工作較給機(jī)器來做,我們僅需要輕輕地點(diǎn)一下鼠標(biāo)泡杯咖啡就能讓自己輕松地完成工作宠默,豈不是美滋滋麸恍?

簡單地說,使用自動化持續(xù)集成工具的目的是為了搀矫,讓我們僅僅去關(guān)注我們最核心的功能(用戶需求的代碼編寫)抹沪。

先來介紹什么是一條流水線(骨架),然后再一步步完善每一個步驟(血肉)瓤球。過程中會介紹兩種常用的構(gòu)建工具融欧,gradle(Android工程)與maven,還有常用的插件卦羡、功能噪馏。

不妨先梳理一下日常工作的步驟:

1.編寫功能(程序猿的核心價值)

2.使用IDE編譯 ? ? ? //gradlew build & mvn complile?

3.運(yùn)行單元測試用例(遵循TDD的良好開發(fā)習(xí)慣)//gradlew test & mvn test

4.運(yùn)行集成測試/功能測試(如果有的話.....) //? gradlew integration (自己配置的job 可以參考gradle in action) & mvn integration-test

5.部署/打包 ?// gradlew assembleDebug & mvn package?

6.@#¥%……&*()

步驟2-5則是機(jī)械性的重復(fù)工作,若交由工具完成绿饵,可以讓我們專注于其他核心價值欠肾。先貼一張流水線(pipeline)的圖,介紹完基礎(chǔ)步驟后再介紹流水線的搭建拟赊。

流水線(綠色:通過刺桃,紅色:失敗,藍(lán)色:未執(zhí)行要门,黃色:不穩(wěn)定的)

圖中的信息表示為:第254次構(gòu)建-->客戶端代碼編譯及風(fēng)格檢查-->運(yùn)行單元測試用例-->運(yùn)行集成測試用例-->打測試環(huán)境包(部署到測試環(huán)境)-->打正式環(huán)境的包(手動啟動虏肾,前四步為自動執(zhí)行)

我們可以通過流水線的一次構(gòu)建廓啊,來快速地知道我們是否在哪個環(huán)節(jié)有錯誤欢搜,如果沒有錯誤,我們就可以很自信地交給QA或部署谴轮。

我們再回頭看一眼我們的工作步驟及括號中的命令炒瘟,其實(shí)每一步都是在運(yùn)行構(gòu)建工具執(zhí)行一條命令。而Jenkins的核心也就是代替人工一條條地去執(zhí)行工程中約定好的命令第步,并且對每一條命令進(jìn)行反饋疮装。所以配置Job無外乎配置所需要執(zhí)行的命令缘琅。

2.一個Job的基本配置

點(diǎn)開流水線中的任意一個job的配置項(xiàng),我們可以看到如下圖

紅色框框出了大體的配置思路的目錄廓推,可以說是非常友好了刷袍。

general:基本配置,job名樊展、描述等

源碼管理:git or svn 用戶名及密碼 ?亦或是上游工程的源代碼

pre setep:構(gòu)建命令執(zhí)行前的操作

build:構(gòu)建命令

構(gòu)建操作:包括對測試覆蓋率的收集等

構(gòu)建后操作:構(gòu)建后發(fā)送郵件呻纹、是否把某個文件發(fā)布到workspace、配置下游job等

我們從大方向說起

2.1 源碼管理

在這里介紹兩種常用的來源

1.Git:通常為pipeline的第一個job的來源专缠,從遠(yuǎn)程代碼庫拉取代碼即可雷酪,配置如圖,包括倉庫地址涝婉、賬號哥力、分支就夠了

2.clone workspace:該選項(xiàng)的意思是,克隆某一個workspace(這TM不廢話)墩弯,兄弟你先別急吩跋。選擇了clone workspace就可以直接使用上游構(gòu)建的代碼庫,可以省去一次執(zhí)行build命令的時間最住,并且保證本次pipleline的構(gòu)建使用的都是統(tǒng)一的代碼庫钞澳。通常使用在非第一個的job。

使用clone workspace時候有一個需要注意的地方涨缚,就是上游“構(gòu)建后操作”必須添加如下配置轧粟,不然你無法拉取到上游的workspace

2.2 BUILD 構(gòu)建命令配置

maven工程

maven工程的構(gòu)建命令很簡單,配置好pom文件的路徑脓魏,以及所要執(zhí)行的命令就可以了(圖示即為打包為jar的命令)

Android工程

gradle命令作為構(gòu)建工具依舊簡單兰吟,只需要配置gradle版本,需要執(zhí)行的命令即可(圖示為運(yùn)行android的測試用例茂翔,并且生成測試覆蓋率報(bào)告)

2.3 構(gòu)建觸發(fā)器

構(gòu)建觸發(fā)器就是說何時開始構(gòu)建混蔼,比如當(dāng)jenkins檢測到git上有新的代碼提交就進(jìn)行構(gòu)建,又或者是2小時輪詢一次珊燎,發(fā)現(xiàn)有新代碼就進(jìn)行一次構(gòu)建惭嚣。

圖示的配置項(xiàng)即為通過輪詢方式進(jìn)行構(gòu)建,每2分鐘進(jìn)行一次源碼變化的檢查悔政,如果有新的提交晚吞,則構(gòu)建,否則不作操作谋国。

通常配置為:第一個job進(jìn)行輪詢槽地,后續(xù)的job的觸發(fā)方式由上游job build成功后自動觸發(fā)


由上述的3個步驟就可以配置出一個獨(dú)立的job,但是它遠(yuǎn)遠(yuǎn)無法達(dá)到持續(xù)集成的目的。

但是一個持續(xù)集成的流水線正是由數(shù)個job配合工作的產(chǎn)物捌蚊。

下面我們來完善我們流水線中的細(xì)節(jié)集畅。

我們始終要記得持續(xù)集成中的主體思路

1.編寫功能(程序猿的核心價值)

2.使用IDE編譯 ? ? ? //gradlew build & mvn complile

3.運(yùn)行單元測試用例(遵循TDD的良好開發(fā)習(xí)慣)//gradlew test & mvn test

4.運(yùn)行集成測試/功能測試(如果有的話.....) //? gradlew integration (自己配置的job 可以參考gradle in action) & mvn integration-test

5.部署/打包 ?// gradlew assembleDebug & mvn package

步驟2-5均為一個job,每個job都需要前面已經(jīng)介紹過的配置缅糟,才能運(yùn)行起來挺智,但是每個job都有各自不同的地方。

通常步驟2即為一個pipeline的起點(diǎn)窗宦。當(dāng)編譯結(jié)束后逃贝,我們應(yīng)該運(yùn)行單元測試(進(jìn)入步驟3,進(jìn)入下一個job)迫摔,如何做沐扳?

你還記得構(gòu)建后操作嗎?

3.插件及常用功能

3.1.1 構(gòu)建后操作:自動觸發(fā)下一個job

圖示即為構(gòu)建后的觸發(fā)器句占,意思是沪摄,構(gòu)建成功后自動觸發(fā)另一個job(運(yùn)行單元測試的job)

3.1.2 構(gòu)建后操作:手動觸發(fā)下一個job

集成測試也成功后我們想發(fā)布到正式環(huán)境(我只是想想,如果你有足夠的自信你也可以發(fā))纱烘,但是我們并不是每一次有提交代碼都要發(fā)布到正式環(huán)境杨拐,我們可以周期性地發(fā)布,那么這一步肯定不能由上游構(gòu)建觸發(fā)擂啥,這里需要我們手動觸發(fā)哄陶。當(dāng)QA也覺得當(dāng)前分支的代碼沒有問題的時候,由QA手動地去點(diǎn)擊(出事就讓QA背鍋)哺壶。配置如下


那么構(gòu)建后還有能哪些操作屋吨?

包括單元測試覆蓋率的report的發(fā)布、構(gòu)建成功/失敗的郵件通知山宾、構(gòu)建下一個工程至扰、把構(gòu)建結(jié)果發(fā)布到workspace等等等等。

那么構(gòu)建失敗怎么辦资锰?發(fā)郵件通知一下研發(fā)是一個好的解決方法敢课,或者發(fā)給你們的老大?绷杜?直秆?嘿嘿嘿

3.2 構(gòu)建后操作:郵件通知

Attachments為添加一個附件,附件的路徑參數(shù)參考這里

failure - any ? sent to:失敗后給XX發(fā)郵件鞭盟。

通常配置為:發(fā)布前的所有job僅在失敗時發(fā)送郵件通知開發(fā)人員圾结,發(fā)布的job在成功打包后把產(chǎn)物發(fā)給有關(guān)人員。

第一個編譯job算是基本完成

單元測試job:既然是單元測試懊缺,我們就希望能有一個單元測試覆蓋率的反饋疫稿,通常使用的是jenkins中的 jacoco插件完成

3.3 構(gòu)建后操作:單元測試覆蓋率報(bào)告

圖示為通過jacoco插件實(shí)現(xiàn)的單元測試覆蓋率的報(bào)告。

path to exec file:jacoco所收集到報(bào)告文件的路徑(可配置)鹃两,jacoco的測試報(bào)告是一個exec文件

path to class directories:生成的.class文件目錄

path to source directories:源碼目錄

inclusions/exclusions:包括/排除哪些類

下面就是分支遗座、行、方法俊扳、類等覆蓋率的配置途蒋,那些值由你們的TL或者技術(shù)經(jīng)理或者朝廷下發(fā)的標(biāo)準(zhǔn)設(shè)置。如果勾選了紅框馋记,那么你的覆蓋率不達(dá)標(biāo)的時候号坡,會將本次的構(gòu)建置為失敗,那么你的技術(shù)經(jīng)理就會收到郵件梯醒,你的技術(shù)經(jīng)理就會和你徹夜聊人生和理想宽堆,你會發(fā)現(xiàn)徹夜聊天PY會痛。茸习。畜隶。。号胚。

這是單元測試的job中最核心的內(nèi)容籽慢,構(gòu)建成功后觸發(fā)集成測試,配置相似猫胁,此處略過箱亿。

Jenkins不僅僅局限于上述的插件功能,還可以執(zhí)行shell弃秆、ant届惋、gradle腳本、對代碼進(jìn)行checkstyle檢查菠赚、對代碼進(jìn)行findbugs等盼樟,這些都是比較常用的插件,如果你要使用到其中某個插件锈至,你可以聯(lián)系你們的負(fù)責(zé)人晨缴,讓他安裝上插件,就可以使用了峡捡,在這里不再詳細(xì)地展開了击碗。

小結(jié):按照上述步驟,就基本可以配置出一個持續(xù)集成的流水線了们拙。你們的流水線可以允許你們快速地對客戶的需求進(jìn)行快速反饋稍途。

4.構(gòu)建一個流水線

我們在前面一直提到過流水線。流水線的概念和傳統(tǒng)手工業(yè)的流水線概念一模一樣砚婆,唯一不同的地方在于械拍,產(chǎn)物由實(shí)體變成了軟件突勇。

搭建流水線的方式也非常的簡單,如果你配置一個job的時候坷虑,在“構(gòu)建后操作:構(gòu)建其他的job”一欄中也有配置甲馋,那么流水線就算配置完成了。

下圖即為一個流水線的配置迄损,配置好initial job定躏,選擇你的第一個job即可,該配置項(xiàng)通常配置為執(zhí)行構(gòu)建操作的job芹敌。

點(diǎn)擊保存痊远,我們就可以開始配置pipeline了。

我們要給我們的job起一個好名字氏捞,一個規(guī)范化的好名字碧聪,是一個好項(xiàng)目的開端。

客戶端的job可以統(tǒng)一為01_client_工程名_操作內(nèi)容(如build/UT等)

根據(jù)我們的流程液茎,job01的主要工作應(yīng)該是build矾削,在job01的“構(gòu)建后操作:構(gòu)建其他job” 中我們選擇job02(UT),接著在job02的“構(gòu)建后操作:構(gòu)建其他job”我們選擇job03(集成測試)以此類推...

那么我們的流水線就算搭建起來了豁护,當(dāng)你提交代碼后哼凯,會從第一個job開始依次執(zhí)行到最后一個job。是不是很簡單楚里?

5.結(jié)語

正因?yàn)閖enkins的強(qiáng)大断部,可以執(zhí)行各式各樣的功能,所以我們有的時候會把大量的構(gòu)建代碼寫在jenkins中班缎,但是這并不是一個最佳實(shí)踐蝴光。

軟件開發(fā)的過程中,時時刻刻都強(qiáng)調(diào)解耦达址。如果大量的腳本寫在jenkins中蔑祟,那么我們就說工程和jenkins是耦合在一起的。但是別忘記了沉唠,如果哪一天jenkins掛了疆虚,或者說服務(wù)器要遷移到一個更好的集成工具中,這部分的工作量也是非常巨大的满葛。

所以將所要執(zhí)行的腳本語言獨(dú)立到一個文件中径簿,在jenkins中執(zhí)行這個文件不失為一個良好的實(shí)踐。

在本篇分享中嘀韧,我們先分享了所有job都需要配置的部分悬钳,之后再介紹各個job不同的部分说敏,更多的是介紹了配置jenkins的思維過程患朱,希望對你能有所幫助。如果有任何疑問曼月,歡迎在評論中提出,或直接聯(lián)系我柔昼,qq493243390

如果你覺得對你有幫助哑芹,請幫忙點(diǎn)個贊或者轉(zhuǎn)發(fā)一下。不勝感激岳锁!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹦魔,隨后出現(xiàn)的幾起案子激率,更是在濱河造成了極大的恐慌,老刑警劉巖勿决,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乒躺,死亡現(xiàn)場離奇詭異,居然都是意外死亡低缩,警方通過查閱死者的電腦和手機(jī)嘉冒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咆繁,“玉大人讳推,你說我怎么就攤上這事⊥姘悖” “怎么了银觅?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坏为。 經(jīng)常有香客問我究驴,道長,這世上最難降的妖魔是什么匀伏? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任洒忧,我火速辦了婚禮,結(jié)果婚禮上够颠,老公的妹妹穿的比我還像新娘熙侍。我一直安慰自己,他們只是感情好履磨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布核行。 她就那樣靜靜地躺著,像睡著了一般蹬耘。 火紅的嫁衣襯著肌膚如雪芝雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天综苔,我揣著相機(jī)與錄音惩系,去河邊找鬼位岔。 笑死,一個胖子當(dāng)著我的面吹牛堡牡,可吹牛的內(nèi)容都是我干的抒抬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼晤柄,長吁一口氣:“原來是場噩夢啊……” “哼擦剑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芥颈,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤惠勒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后爬坑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纠屋,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年盾计,在試婚紗的時候發(fā)現(xiàn)自己被綠了售担。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡署辉,死狀恐怖族铆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哭尝,我是刑警寧澤骑素,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站刚夺,受9級特大地震影響献丑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侠姑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一创橄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莽红,春花似錦妥畏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鬼店,卻和暖如春网棍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妇智。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工滥玷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氏身,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓惑畴,卻偏偏與公主長得像蛋欣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子如贷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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