單應用變更持續(xù)交付最佳實踐
本文主要介紹微服務架構(gòu)下,單應用獨立開發(fā)、集成測試、持續(xù)交付最佳實踐。
適用場景
微服務架構(gòu)下,每個應用服務獨立開發(fā)、獨立發(fā)布,小步快跑,持續(xù)快速交付業(yè)務需求。多人協(xié)同開發(fā)同一個應用時,分支開發(fā)模式是一個適合的協(xié)同方案。該模式下一個需求或任務通常對應一個 feature 分支,多個需求一起合并到 release 分支進行集成測試驗證并發(fā)布。期間可能遇到以下問題:
痛點1:當開發(fā)同學領到一個需求時,怎么為這個需求快速的拉一個 feature 分支?
痛點2:當多個相關需求一起發(fā)布時,多個 feature 分支怎么高效自動化的合并到 release 分支?
痛點3:當其中一個 feature 分支沒有經(jīng)過測試驗證時,怎么“阻止”它發(fā)布到生產(chǎn)環(huán)境避免漏測引起故障?
痛點4:當其中一個 feature 分支做了測試驗證,但是發(fā)現(xiàn)有嚴重問題,怎樣可以“退出”本次發(fā)布而不影響其他需求正常發(fā)布?
痛點5:當一個需求 feature 分支提交測試了、發(fā)布上線了,怎么自動、及時的更改相應需求狀態(tài),便于相關業(yè)務、產(chǎn)品、測試同學跟蹤進度?
云效解決方案
云效應用交付平臺 AppStack 提供變更持續(xù)交付解決方案,涉及核心概念如下:
應用:一個軟件的最小發(fā)布單元,聚合代碼、環(huán)境、版本等軟件資產(chǎn),以及研發(fā)流程定義。最小發(fā)布單元意味著無法解耦的一個或者多個服務的組合,這個服務組合會通過一個流程進行統(tǒng)一交付。
變更:變更是對應用的一次特性改變(引入新的特性或改變已有特性),源于需求,終于交付。通常一個需求或任務對應一個變更,對應一個 feature 分支。
研發(fā)流程:應用完成一次變更的過程和約束,包括開發(fā)、測試、發(fā)布上線的完整流程,由多個階段的多條流水線承載,依次在不同環(huán)境進行測試、構(gòu)建、部署,最終審批通過后發(fā)布生產(chǎn)環(huán)境。
云效操作實踐
以下實踐,以一個spring-boot應用的“圖書館管理系統(tǒng)”為例,開發(fā)“圖書借閱功能”、“圖書歸還功能”、“圖書到期續(xù)借功能”三個需求,一起發(fā)布上線。
作為應用負責人
作為應用負責人,需要編排應用構(gòu)建、部署流程,通過流水線工具自動化起來;需要定義應用生產(chǎn)發(fā)布準則,來規(guī)范應用研發(fā)流程降低發(fā)布風險。
新建應用
新建應用,輸入應用名稱,應用模板選擇「變更持續(xù)交付模式」。
代碼源配置
應用設置,配置應用代碼源,設置默認分支。
配置研發(fā)流程
(研發(fā)流程配置操作步驟變更持續(xù)交付模式。)
本應用的研發(fā)流程可以分為測試階段、預發(fā)階段、生產(chǎn)階段:
測試階段:由Java單元測試、Java代碼掃描、構(gòu)建、部署測試環(huán)境等步驟組成。用于日常測試驗證。
預發(fā)階段:由構(gòu)建、部署預發(fā)環(huán)境等步驟組成。用于預發(fā)布驗證。
生產(chǎn)階段:由構(gòu)建、生產(chǎn)發(fā)布審批(人工卡點)、部署生產(chǎn)環(huán)境、合并主干、關閉變更等步驟組成。
生產(chǎn)發(fā)布審批通過后,部署生產(chǎn)環(huán)境。
生產(chǎn)環(huán)境部署驗證通過后,表明本次發(fā)布成功,可以將發(fā)布release 分支合并回主干 master,并自動關閉相關變更。
設置變更集成方式和準入規(guī)則
本示例各階段都選擇「添加變更集成」方式,在運行階段流水線時可以選擇多個變更分支集成到release分支進行構(gòu)建部署驗證。
測試階段:無準入規(guī)則。
預發(fā)階段:配置準入規(guī)則為:「測試階段-執(zhí)行結(jié)果」等于「成功」,避免沒有經(jīng)過測試驗證的分支直接進入預發(fā)。
生產(chǎn)階段:配置準入規(guī)則為:「測試階段-執(zhí)行結(jié)果」等于「成功」,「預發(fā)階段-執(zhí)行結(jié)果」等于「成功」,避免沒有經(jīng)過預發(fā)驗證的分支直接進入生產(chǎn)階段。
作為一線開發(fā)
“需求1:圖書借閱功能”、“需求2:圖書歸還功能”、“需求3:圖書到期續(xù)借功能”三個需求分別分配給開發(fā)小張、小明、小強開發(fā)。
第1步,為一個需求新建一個變更拉一個 feature 分支
小張創(chuàng)建一個變更「變更1-實現(xiàn)圖書借閱功能」,選擇新建分支輸入 feature001,則可自動為該需求拉取一個分支(解決上述痛點1)。依次類推,小明創(chuàng)建一個變更「變更2-實現(xiàn)圖書歸還功能」,自動新建分支feature002。小強創(chuàng)建一個變更「變更3-實現(xiàn)到期續(xù)借功能」,自動新建分支feature003。
第2步,開發(fā)代碼提交到 feature 分支
小張開發(fā)好圖書借閱相關代碼后,提交代碼到feature001上,小明開發(fā)圖書歸還相關代碼后,提交代碼到feature002分支上。
第3步,選擇變更集成,部署測試環(huán)境驗證
小張和小明,一借一還,需要一起部署到測試環(huán)境進行聯(lián)調(diào)驗證。進入應用研發(fā)流程頁,選擇變更1和變更2一起集成測試,云效會自動將 feature001 和 feature002 合并到自動生成的 release/xxx_n 分支(解決上述痛點2),使用該 release 分支做構(gòu)建,并部署環(huán)境。環(huán)境部署成功即可進行測試驗證。
第4步,提交變更進行預發(fā)布
測試環(huán)境驗證通過,進入「預發(fā)階段」,選擇變更1和變更2進行集成,勾選自動合并上一階段集成的分支,會自動生成新的 release/xxx_m 集成分支,自動合并上一階段 feature001、feature002、release/xxx_n 分支,使用新的 release/xxx_m 分支構(gòu)建并部署預發(fā)環(huán)境。預發(fā)部署成功后即可進行預發(fā)驗證。
此時若在預發(fā)階段選擇變更1、變更2、變更3一起集成,則經(jīng)過變更準入卡點時會校驗失敗,因為變更3沒有在測試環(huán)境部署驗證過,即保證了沒有經(jīng)過測試驗證的需求不可發(fā)布(解決上述痛點3)。
變更3因沒有測試驗證通過,不滿足發(fā)布條件,團隊本次決定圖書續(xù)借功能不上線,只上線變更1和變更2,則可再次運行預發(fā)階段流水線,將變更3踢出集成區(qū),退出本次發(fā)布(解決上述痛點4)。
第5步,提交變更進行生產(chǎn)發(fā)布
預發(fā)驗證通過后,即可進入生成發(fā)布階段。選擇待發(fā)布的變更1和變更2,運行生產(chǎn)流水線,發(fā)布審批通過后,即可部署生產(chǎn)環(huán)境。生產(chǎn)環(huán)境部署完成,可配置自動關閉變更,并將發(fā)布 release/xxx_k 分支合并入主干 master,至此即完成了一次完整的需求發(fā)布上線。
作為業(yè)務產(chǎn)品同學
變更發(fā)布完成了,我作為PD同學怎么知道需求發(fā)布了呢?云效AppStack變更和Projex工作項做了狀態(tài)聯(lián)動,支持變更發(fā)布完成自動將需求狀態(tài)置為「已發(fā)布」,這樣PD同學可及時看到需求進展(解決上述痛點5)。具體配置方式如下:進入Projex項目-項目設置-自動化規(guī)則,選擇「支持工作項與變更狀態(tài)的聯(lián)動」模板,配置當產(chǎn)品類需求關聯(lián)的全部變更狀態(tài)為「已發(fā)布」時,將需求狀態(tài)置為「已完成」。
至此,本方案完成了從應用配置、到需求開發(fā)、多變更集成測試、發(fā)布上線的完整流程,滿足了變更分支自動創(chuàng)建、變更分支自動合并集成測試、發(fā)布準入卡點控制等訴求,支持變更關聯(lián)業(yè)務需求和狀態(tài)聯(lián)動,完整追溯需求的全生命周期流程。