流水線設(shè)計(jì)和編排
云計(jì)算團(tuán)隊(duì) 2020-03-16
對于DevOps流水線,主要是由各類任務(wù)串聯(lián)起來,而對于任務(wù)本身又分為兩張類型,一種是自動(dòng)化任務(wù),一種是人工執(zhí)行任務(wù)。具體如下:
1. 自動(dòng)化任務(wù):包括了代碼靜態(tài)檢查,構(gòu)建,打包,部署,單元測試,環(huán)境遷移,自定義腳本運(yùn)行等。
2. 人工任務(wù):人工任務(wù)主要包括了檢查審核,打標(biāo)簽基線,組件包制作等類似工作。
而通常我們看到的流水線基本都由上述兩類任務(wù)組合編排而成,一個(gè)流水線可以是完全自動(dòng)化執(zhí)行,也可以中間加入了人工干預(yù)節(jié)點(diǎn),在人工干預(yù)處理后再繼續(xù)朝下執(zhí)行。比如流水線中到了測試部署完成后,可以到測試環(huán)境人工驗(yàn)證環(huán)節(jié),只有人工驗(yàn)證通過再流轉(zhuǎn)到遷移發(fā)布到生產(chǎn)環(huán)境動(dòng)作任務(wù)。
DevOps流水線實(shí)際上和我們原來經(jīng)常談到的持續(xù)集成最佳實(shí)踐是相當(dāng)類似的,較大的一個(gè)差異點(diǎn)就在于引入了容器化技術(shù)來實(shí)現(xiàn)自動(dòng)化部署和應(yīng)用托管。至于在DevOps實(shí)踐中,是否必須馬上將項(xiàng)目切換到微服務(wù)架構(gòu)框架模式,反而不是必須得。
在整個(gè)DevOps流水線中,我們實(shí)際上強(qiáng)調(diào)個(gè)一個(gè)關(guān)鍵點(diǎn)在于一套Docker鏡像文件+多套環(huán)境配置+多套構(gòu)建版本標(biāo)簽做法。以確保我們最終構(gòu)建和測試通過的版本就是我們部署到生產(chǎn)環(huán)境的版本。構(gòu)建操作只有一次,而后面到測試環(huán)境,到UAT環(huán)境,到生產(chǎn)環(huán)境,都屬于是鏡像的環(huán)境遷移和部署。而不涉及到需要再次重新打包的問題。這個(gè)是持續(xù)集成,也是DevOps的基本要求。
對流水線編排本身的靈活性進(jìn)一步思考:
構(gòu)建操作:構(gòu)建我們通常采用Maven進(jìn)行自動(dòng)化構(gòu)建,構(gòu)建完成輸出一個(gè)或多個(gè)Jar包或War包。注意常規(guī)方式下構(gòu)建完執(zhí)行進(jìn)行部署操作,部署操作一般就是將構(gòu)建的結(jié)果拷貝到我們的測試環(huán)境服務(wù)器,同時(shí)對初始化腳本進(jìn)行啟動(dòng)等。而在DevOps下,該操作會(huì)變成兩個(gè)操作,即一個(gè)打包,一個(gè)部署。打包是將構(gòu)建完成的內(nèi)容制作為鏡像,部署是將鏡像部署到具體的資源池和指定集群。
打包操作:實(shí)際上即基于構(gòu)建完成的部署包來生成鏡像。該操作一般首先基于一個(gè)基礎(chǔ)鏡像文件基礎(chǔ)上進(jìn)行,在基礎(chǔ)鏡像文件上拷貝和寫入具體的部署包文件,同時(shí)在啟動(dòng)相應(yīng)的初始化腳本。
那么首先要考慮構(gòu)建操作和打包操作如何松耦合開,打包操作簡單來就是就是一個(gè)鏡像制作,需要的是構(gòu)建操作產(chǎn)生的輸出。我們可以對其輸出和需要拷貝的內(nèi)容在構(gòu)建的時(shí)候進(jìn)行約定。而打包任務(wù)則是一個(gè)標(biāo)準(zhǔn)化的鏡像制作任務(wù),我們需要考慮的僅僅是基于:
1) 基于哪個(gè)基礎(chǔ)鏡像
2) 中間件容器默認(rèn)目錄設(shè)置
3) 初始化啟動(dòng)命令
即在實(shí)際的打包任務(wù)設(shè)計(jì)的時(shí)候,我們不會(huì)指定具體的部署包和部署文件,這個(gè)完全由編排的時(shí)候由上游輸入。
部署操作:部署操作相當(dāng)更加簡單,重點(diǎn)就是將鏡像部署到哪個(gè)資源池,哪個(gè)集群節(jié)點(diǎn),初始化的節(jié)點(diǎn)配置等。具體部署哪個(gè)鏡像不要指定,而是由上游任務(wù)節(jié)點(diǎn)輸入。
■ 任務(wù)節(jié)點(diǎn)間松耦合設(shè)計(jì)的意義
這種松耦合設(shè)計(jì)才能夠使流水線編排更加靈活。比如我們在進(jìn)行了構(gòu)建打包后,我們希望同時(shí)將打包內(nèi)容部署到開發(fā)環(huán)境和測試環(huán)境。那么則是打包動(dòng)作完成后需要對接兩個(gè)應(yīng)用部署任務(wù)。這兩個(gè)部署任務(wù)都依托上面的打包結(jié)果進(jìn)行自動(dòng)化部署,可以并行進(jìn)行。
對于測試環(huán)境部署完成后,我們需要進(jìn)行測試人員手工驗(yàn)證測試,如果測試通過,我們打標(biāo)簽后希望能夠直接發(fā)布到UAT環(huán)境。而這種操作我們也希望通過一個(gè)流水線來設(shè)計(jì)和完成。這樣我們更加容易在持續(xù)集成看板上看到整個(gè)版本構(gòu)建和遷移的完整過程。如果這是在一個(gè)大流水線里面,那么對于UAT環(huán)境部署任務(wù)就需要一直去追溯流水線上的最近的一個(gè)打包任務(wù)節(jié)點(diǎn),同時(shí)取該任務(wù)節(jié)點(diǎn)產(chǎn)生的輸出來進(jìn)行相應(yīng)的環(huán)境部署操作。
在談DevOps的時(shí)候,一個(gè)重點(diǎn)就是和QAQC的協(xié)同,因此在流水線編排的時(shí)候一定要考慮各類測試節(jié)點(diǎn),包括靜態(tài)代碼檢查,自動(dòng)化的單元測試,人工的測試驗(yàn)證。同時(shí)最好基于持續(xù)集成實(shí)踐,能夠?qū)y試過程和整個(gè)自動(dòng)化構(gòu)建過程緊密結(jié)合起來。
簡單來說,測試人員發(fā)現(xiàn)build1.0.0001版本4個(gè)bug并提交,那么在下次自動(dòng)化構(gòu)建完成并單元測試通過后,測試人員能夠很清楚的看到哪些Bug已經(jīng)修改并可以在新構(gòu)建的版本進(jìn)行驗(yàn)證。只有這樣才能夠形成閉環(huán),整個(gè)流水線作業(yè)才能夠更好的發(fā)揮協(xié)同作用。