以下內(nèi)容為我們當(dāng)前環(huán)境主要的構(gòu)建發(fā)布方式,當(dāng)然根據(jù)不同的環(huán)境也會有自己獨(dú)特的構(gòu)建發(fā)布方式。
1. 源碼分支管理規(guī)范
請使用一個常駐分支作為構(gòu)建分支,并且不要在這個常駐分支上私自隨意提交

請查看源圖地址: https://processon.com/view/5bf25121e4b0e9468c29614c?fromnew=1
下圖是針對我們小微項(xiàng)目代碼分支管理的建議流程:

如上,我們一般大多數(shù)的項(xiàng)目都是單分支流水線,在jenkins中我們只會選擇其中一條常駐分支(一般叫Dev分支)進(jìn)行構(gòu)建。所以,當(dāng)我們需要開發(fā)新的功能時,請從master或者dev上checkout新的功能開發(fā)分支進(jìn)行開發(fā),當(dāng)我們本地開發(fā)完成后將其合并到dev分支觸發(fā)DevOps(使用--no-ff, 不要快速合并)
一般規(guī)范的開發(fā)流程都應(yīng)該如此或者比這更加完善,為什么要在這繼續(xù)說呢?原因是我們很多小型項(xiàng)目的開發(fā)方式并不規(guī)范,都在一個分支上甚至master分支上瘋狂commit并提交,這在DevOps上是不合理并不推薦的,因?yàn)槟愕倪@次提交的代碼很可能并不完整,直接運(yùn)行會報錯,這樣我們構(gòu)建,測試,產(chǎn)生的鏡像就沒有任何意義。我們應(yīng)該在自己的分支上將功能做好之后,再合并上去進(jìn)行自動化的構(gòu)建(合并分支最好交給專門的代碼審核人員去管理)
2. 開發(fā)環(huán)境的構(gòu)建
當(dāng)我們按照上面的開發(fā)流程將功能分支合并到dev分支后,自動觸發(fā)或者由開發(fā)人員主動去構(gòu)建部署(當(dāng)前我們是手動觸發(fā))

開發(fā)人員的構(gòu)建流程如上圖所示,登陸jenkins項(xiàng)目開發(fā)者用戶并針對各個源碼分支進(jìn)行構(gòu)建: 拉取代碼 > 編譯代碼 > 構(gòu)建鏡像 > 推送鏡像到harbor倉庫 > 開發(fā)環(huán)境部署 , 如下為一條在Blue Ocean構(gòu)建的流水線:

3. 非開發(fā)環(huán)境的構(gòu)建
非開發(fā)環(huán)境是指uat, 預(yù)發(fā)布,生產(chǎn)等環(huán)境,它們不是從源碼倉庫直接拉取代碼、編譯、測試、部署的。開發(fā)人員開發(fā),修改源碼并不斷觸發(fā)構(gòu)建,當(dāng)這個功能最終比較完善已經(jīng)達(dá)到發(fā)布到uat、生產(chǎn)的級別時,由開發(fā)人員將應(yīng)用和對應(yīng)的版本告知運(yùn)維人員,再由運(yùn)維人員登陸非開發(fā)者用戶進(jìn)行uat、sit、生產(chǎn)等上線構(gòu)建。這就是一次構(gòu)建多次部署。
補(bǔ)充:從這可以看出,我們應(yīng)該不要將配置硬編碼,這樣才能真正的滿足一次構(gòu)建多次部署,如果我們將配置存放到源碼中,我們就不得不在開發(fā)環(huán)境、uat環(huán)境、預(yù)發(fā)布環(huán)境、生產(chǎn)環(huán)境等都進(jìn)行編譯,構(gòu)建鏡像并推送這樣一個完整的過程,而且會影響到方方面面。關(guān)于配置硬編碼的問題,請看我上一篇文檔。
如下為非開發(fā)環(huán)境構(gòu)建的入口:

由運(yùn)維人員輸入開發(fā)人員經(jīng)過構(gòu)建測試的鏡像版本號進(jìn)行上線,這個流水線支持該項(xiàng)目的多個環(huán)境多個應(yīng)用的上線
上線邏輯圖:

如下為Blue Ocean的視圖:

如上,實(shí)際流水線其實(shí)還多了一步"judgeEnv"來判斷環(huán)境在kubernetes集群下的命名空間,但其實(shí)這一步在這條流水線下是多余的,因?yàn)槲覍⒉煌h(huán)境下k8s的清單文件放在不同的目錄下面了,具體可以往下看“流水線源碼管理”這一節(jié)。
4. 回滾
與非開發(fā)環(huán)境一樣,回滾也是都能放在一條流水線下進(jìn)行的。但因?yàn)榘踩脑颍@邊還是分為了兩條流水線,一條給開發(fā)人員作為開發(fā)環(huán)境的回滾,一條給運(yùn)維人員做非開發(fā)環(huán)境的回滾。
-
開發(fā)環(huán)境的回滾邏輯
版本回退
- 選擇準(zhǔn)備回滾的應(yīng)用;
- 選擇準(zhǔn)備回滾的方式(直接回滾到上一個版本還是指定的版本);
- 如果選擇0就直接回退到上個版本,如果選擇1則選擇指定的版本回退。
- 非開發(fā)環(huán)境的回滾
非生產(chǎn)環(huán)境比開發(fā)環(huán)境多了回滾環(huán)境的選擇,如果可以的話其實(shí)可以將開發(fā)環(huán)境也包含進(jìn)來,但因?yàn)榘踩脑?,所以將它們分開了。此處的流程圖不再展示。
如下為非開發(fā)環(huán)境的BlueOcean:

5. 權(quán)限管理
針對項(xiàng)目我主要劃分了兩組權(quán)限:
開發(fā)人員權(quán)限,包含開發(fā)環(huán)境各個應(yīng)用的構(gòu)建和回滾
運(yùn)維人員權(quán)限,包含所有非開發(fā)環(huán)境的項(xiàng)目上線權(quán)限和回滾
項(xiàng)目開發(fā)者流水線界面:

各個應(yīng)用構(gòu)建發(fā)布的流水線和開發(fā)環(huán)境回滾的流水線
運(yùn)維人員非開發(fā)環(huán)境流水線界面:

如上圖,各個項(xiàng)目的uat、生產(chǎn)等環(huán)境的發(fā)布流水線目錄
6. 流水線源碼管理
開發(fā)環(huán)境構(gòu)建的流水線源碼是直接放在對應(yīng)應(yīng)用源碼的根目錄下面
其他都放在單獨(dú)的倉庫下面,包括非開發(fā)環(huán)境的上線流水線源碼和回滾的流水線源碼(包括開發(fā)環(huán)境的回滾)

Uat和Pro分別放的uat和生產(chǎn)環(huán)境的kubernetes資源清單
在上面的第三節(jié)中說過“根據(jù)選擇的環(huán)境檢出指定源碼下的目錄文件”,當(dāng)我們選擇Uat環(huán)境時,流水線只檢出上面Uat目錄下的資源清單,當(dāng)選擇生產(chǎn)環(huán)境時,流水線只檢出Pro目錄下的權(quán)限,等等如果有其他環(huán)境,我們可以繼續(xù)添加。
當(dāng)然,開發(fā)環(huán)境的流水線也可以像這樣集中的管理起來,但是沒有必要,因?yàn)槠浜驮创a密切相關(guān)分開反而不合適。
- 共享庫
jenkins共享庫主要的作用就是將pipeline的具體實(shí)現(xiàn)封裝成方法,可以方便不同的Jenkinsfile調(diào)用,一次封裝,到處使用。(此處不做詳細(xì)介紹)
