目錄:
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ǔ)步驟后再介紹流水線的搭建拟赊。
圖中的信息表示為:第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工程的構(gòu)建命令很簡單,配置好pom文件的路徑脓魏,以及所要執(zhí)行的命令就可以了(圖示即為打包為jar的命令)
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ā)一下。不勝感激岳锁!