vivo 制品管理在 CICD 落地實踐
一、前言
隨著軟件開發(fā)的不斷發(fā)展,DevOps已經(jīng)成為了一種流行的軟件開發(fā)實踐方式。在DevOps實踐中,制品管理是一個重要的組成部分,它可以幫助團隊快速交付高質(zhì)量、高可靠性的軟件,本文將介紹vivo制品管理在CICD的演進過程與落地實踐,希望能為讀者提供一些實踐經(jīng)驗和思路。
名稱解釋
制品:在廣義上指軟件開發(fā)過程中生成的各種產(chǎn)物,包括軟件代碼、文檔、報告、測試結(jié)果等,在狹義上,指軟件開發(fā)過程中生成的最終產(chǎn)物,如編譯產(chǎn)物、打包產(chǎn)物、鏡像等。
制品庫:制品庫即管理制品的中央倉庫,用來存儲和管理不同格式的軟件制品,如源代碼,編譯后的程序,鏡像,配置文件,第三方庫和依賴,版本信息等。制品庫一般包含存儲,版本管理,權(quán)限控制,安全掃描,依賴分析等功能,是一種企業(yè)處理軟件開發(fā)過程中產(chǎn)生的所有包類型的標準化方式。
二、vivo CICD制品管理演進
隨著DevOps行業(yè)的蓬勃發(fā)展,行業(yè)內(nèi)越來越關(guān)注制品能力的建設(shè);在不斷的實踐摸索中,vivo CICD制品管理能力也越來越完善,vivo CICD的制品管理發(fā)展一共經(jīng)歷了4個階段,包括手工管理階段、腳本管理階段、平臺管理 1.0 階段和平臺管理 2.0 階段。
- 手工管理階段:本地構(gòu)建制品,手動上傳到部署機器,進行手動部署。純手工時代,需要耗費大量人力和時間,出錯率高,無法保證一致性和可重復(fù)性。
- 腳本管理階段:使用腳本化管理工具自動化構(gòu)建、部署過程。通過Jenkins構(gòu)建制品,上傳到文件存儲器,shell腳本從文件存儲器(FTP)下載后進行部署。這一階段初步實現(xiàn)構(gòu)建、部署過程的自動化,并且保證了一致性和可重復(fù)性,但需要手動編寫腳本,維護成本較高。
- 平臺管理1.0階段:基于Jenkins ,Spinnaker自研CICD平臺,加速軟件的構(gòu)建、測試、部署和發(fā)布過程 。在這個階段流水線比較完善,實現(xiàn)構(gòu)建、測試、部署過程自動化,并且可以自動化地觸發(fā)測試和部署操作,從而提高軟件交付的速度和質(zhì)量;但是制品管理能力有限,僅在流水線范圍內(nèi)保證一致性和可重復(fù)性。
- 平臺管理2.0階段:隨著平臺能力全面發(fā)展,為了提高研發(fā)效率和軟件質(zhì)量,降低運維成本,我們進一步完善了制品管理能力,實現(xiàn)制品的版本控制、存儲、晉級和安全管理等,從而提高軟件開發(fā)效率、簡化軟件交付流程、提高軟件交付質(zhì)量和可靠性。
當前CICD 制品管理處在平臺管理2.0階段,這一階段制品管理具有如下優(yōu)勢:
- 多類型制品支持:制品庫支持一個項目同時存在Generic、Maven、NPM、PyPI、Docker、Helm等多種常見類型,滿足多技術(shù)棧研發(fā)團隊的訴求。
- 制品統(tǒng)一管理:將軟件研發(fā)過程中所有制品進行版本管理、集成、協(xié)同和發(fā)布管理等,從而提高研發(fā)效率和質(zhì)量,支持持續(xù)交付和DevOps實踐,提升企業(yè)競爭力和創(chuàng)新能力。
- 制品溯源追蹤:基于制品元數(shù)據(jù)和準入準出規(guī)則,進行制品晉級,以制品維度記錄從需求到發(fā)布的過程數(shù)據(jù),實現(xiàn)需求、編碼、構(gòu)建、測試、質(zhì)量和部署全生命周期過程的強管控,實現(xiàn)可信追溯與安全審計。
- 制品安全掃描:檢測制品中的潛在安全漏洞和風險,提高系統(tǒng)和應(yīng)用程序的安全性和可靠性,避免信息泄露和惡意攻擊,從而保護企業(yè)數(shù)字資產(chǎn)的安全。
- 降低運維成本:統(tǒng)一管理制品,減少重復(fù)建設(shè),降低運維、研發(fā),測試溝通成本。
- 制品極速分發(fā):支持多地數(shù)據(jù)中心上傳下載,實現(xiàn)多地數(shù)據(jù)中心集群部署。
制品管理是軟件開發(fā)和交付過程中不可或缺的環(huán)節(jié),通過制品管理,可以提高軟件交付效率、質(zhì)量和可靠性,降低成本和風險,促進團隊協(xié)作和溝通,提高管理效率和決策能力,從而提高企業(yè)的生產(chǎn)力和競爭力。
三、vivo CICD制品管理介紹
3.1 vivo CICD 制品管理概況
1)目前制品庫支持:
- 元數(shù)據(jù)管理:對制品的屬性信息進行有效管理和保護,包括編譯產(chǎn)生的元數(shù)據(jù),用戶自定義的元數(shù)據(jù),cicd平臺生成的元數(shù)據(jù)等。
- 制品統(tǒng)一管理:統(tǒng)一管理制品生命周期,提供存儲,溯源追蹤,上傳下載,版本管理,權(quán)限控制,回收,部署等多項功能。
- 制品晉級:不同環(huán)境中的配置和參數(shù)可能會有所不同,對制品進行適當?shù)男薷暮投ㄖ苹?,以滿足不同環(huán)境的需求,也是針對不同需求設(shè)置制品準入門禁。
- 極速分發(fā):靈活地適應(yīng)不同的部署需求和架構(gòu)模式,將制品快速、可靠地分發(fā)到各地數(shù)據(jù)中心。
- 安全掃描:對制品進行全方位的漏洞,合規(guī)掃描(包含源代碼,依賴,文件,鏡像等),識別制品安全等級,提前規(guī)避問題。
2)制品生命周期
3)制品在研發(fā)流程中所起的作用
對于CICD流水線而言,制品起到一個承上啟下的關(guān)鍵作用,它是持續(xù)集成CI的終點,也是持續(xù)交付CD的起點,是研發(fā)流程關(guān)鍵組成部分。
3.2 制品管理系統(tǒng)架構(gòu)
3.3 核心功能介紹
3.3.1 制品統(tǒng)一管理
制品統(tǒng)一管理,顧名思義在軟件研發(fā)和部署過程中,對產(chǎn)生的各種制品進行整體的統(tǒng)一管理。主要包含元數(shù)據(jù)管理,統(tǒng)一存儲,制品生成,制品晉級,制品部署,制品掃描,制品老化,權(quán)限管控幾大功能的管理。
(1)元數(shù)據(jù)管理
制品元數(shù)據(jù)是指對制品本身的描述和補充信息,與制品密切相關(guān),是制品管理的一個重要部分。
目前管理的元數(shù)據(jù)有:
制品名稱(MD5/鏡像標簽)、版本、類型、制品大小、來源信息、源代碼、可部署環(huán)境、存儲地址、掃描報告、依賴信息、制品作者、描述、老化日期,老化狀態(tài)等。
通過制品元數(shù)據(jù)對制品有了全方位了解,可以幫助研發(fā),測試,運維等角色快速定位識別制品、進行版本回溯,追蹤問題的引入,及時修復(fù)安全漏洞等。
(2)統(tǒng)一存儲
按照使用場景,制品一般分為三類,統(tǒng)一管理存儲在對應(yīng)的存儲器上。
(3)制品生成
平臺制品的來源分為三類類:手動上傳制品,流水線構(gòu)建、公網(wǎng)引入
(4)制品晉級
制品晉級流程
在整個研發(fā)流程中,研發(fā)團隊一般都有開發(fā),測試,預(yù)發(fā),壓測,生產(chǎn)環(huán)境,而對于不同環(huán)境可部署條件是不一樣的,即不同的環(huán)境對于制品有不同的準入門禁,制品需要通過晉級來達到準入標準。
經(jīng)過代碼掃描,編譯后制品生成 → 部署開發(fā)環(huán)境 → 經(jīng)過安全掃描 → 部署測試環(huán)境 → 測試通過,并分發(fā)到線上倉庫之后 → 部署預(yù)發(fā)環(huán)境 → 部署預(yù)發(fā)后,驗收通過,并提交上線審批工單之后部署生產(chǎn)環(huán)境。
目前制品晉級規(guī)則比較簡單,為了幫助研發(fā)團隊有效且直觀地區(qū)分制品版本的成熟度情況,提高交付效率和安全性,后續(xù)將支持自定義制品等級和晉級規(guī)則。
制品分發(fā)
在制品晉級的過程中,制品等級越高,越需要支持跨網(wǎng)絡(luò)/數(shù)據(jù)中心使用,制品分發(fā)將生成的制品快速、準確和可靠地分發(fā)出去,供不同地區(qū)開發(fā)人員或用戶使用,為企業(yè)提供更為高效和便捷的全球化業(yè)務(wù)支持。
(5)制品部署
制品部署是將軟件制品部署到各個環(huán)境的過程,制品部署是軟件開發(fā)的最后一步,也是最關(guān)鍵的一步,如果部署失敗,將會導(dǎo)致業(yè)務(wù)中斷或嚴重故障,保障部署制品版本正確至關(guān)重要。 平臺目前有支持三種方式部署:構(gòu)建部署一鍵運行,制品庫選擇制品,選擇上線工單部署。
- 構(gòu)建部署一鍵運行:用戶選擇代碼版本進行構(gòu)建,構(gòu)建后制品直接部署到對應(yīng)環(huán)境。
- 制品庫選擇制品:選擇歷史制品進行部署,為了保障用戶選擇到正確的制品版本,制品選擇會展示元數(shù)據(jù)方便用戶核對,且線上環(huán)境只能選已晉級制品進行部署。
- 選擇上線工單部署:線上部署前需要提交上線工單,經(jīng)過管理員、安全管理員,執(zhí)行人等審批通過之后,選擇工單部署對應(yīng)制品至線上環(huán)境。
(6)制品掃描
制品包含的是在應(yīng)用程序開發(fā)過程中產(chǎn)生的各種文件,從源代碼到編譯后的二進制文件、測試結(jié)果和部署配置文件,甚至到生產(chǎn)環(huán)境中使用的數(shù)據(jù)。一旦這些制品受到攻擊或被竊取,會嚴重影響整個應(yīng)用程序或系統(tǒng)的安全性和可靠性,安全掃描是制品管理中重要一環(huán),有助于保障系統(tǒng)穩(wěn)定性和安全性,平臺對制品進行全方位的漏洞/合規(guī)掃描(包含源代碼,依賴,文件,鏡像等),提前識別制品安全等級,提前規(guī)避問題。這一部分將在3.2中重點介紹。
(7)制品老化
合理制定制品生命周期管理策略,定期清除無效制品,減少存儲空間占用,可以提高系統(tǒng)性能,提供更安全、穩(wěn)定、整潔的制品庫。
- 自動化清理:制品生成后,平臺會根據(jù)保留策略計算制品的銷毀時間,然后根據(jù)制品銷毀時間,自動定時清理過期制品。
- 保留策略:一般情況下,線下制品保留60天,線上制品保留90天,正在部署或者部署中制品不會被清理;支持定制化保留時間,對于迭代頻繁或自動化程度高的項目,制品數(shù)量繁多,可以縮短制品保留時間,而像一些穩(wěn)定的運維系統(tǒng),可以延長保留時間。
- 清理白名單:對于一些特殊制品或項目,不能隨意清理,可以申請清理白名單;白名單支持制品和項目兩個維度;特殊制品可以申請清理白名單,延長保留時間或永不清理,項目也可以按項目維度申請白名單,為項目下所有制品申請清理白名單。
- 恢復(fù)策略:直接清理制品,具有一定的風險性,平臺支持恢復(fù)老化制品;清理的制品,短期內(nèi)平臺會進行備份,已清理制品平臺支持基于制品元數(shù)據(jù)(代碼信息,編譯環(huán)境等)重新生成制品,從而保障制品安全性。
- 標準化流程:為保證不清理掉與業(yè)務(wù)相關(guān)的重要信息或數(shù)據(jù),對業(yè)務(wù)產(chǎn)生不利影響,必須按照規(guī)范的流程進行清理和記錄,以下是整個清理流程:
(8)權(quán)限控制
制品權(quán)限控制是制品管理流程中非常重要的一部分,它可以確保制品在構(gòu)建、存儲、分發(fā)和部署等環(huán)節(jié)中,僅有經(jīng)過授權(quán)的人員才能訪問、修改、上傳和下載制品。通過制品權(quán)限控制,大大降低公司潛在安全風險,防止機密信息和敏感數(shù)據(jù)的泄漏。
- 身份驗證+角色控制:通過單點登錄(SSO)確定用戶身份信息,項目成員才能訪問、修改、上傳和下載制品;同時為了保障生產(chǎn)環(huán)境的穩(wěn)定性和安全性,經(jīng)過管理員審批的制品才能部署到線上環(huán)境。
- 項目隔離:為了確保項目之間資源不會互相干擾,保證項目制品的安全性,項目間的制品是隔離的,項目內(nèi)的制品只能在項目中使用。
- 制品權(quán)限控制:針對制品進行單獨的權(quán)限分配(設(shè)置制品可操作空間、可操作用戶/用戶組)。
3.3.2 制品安全掃描
(1)制品存在哪些安全風險
- 制品/依賴組件存在安全漏洞:未經(jīng)過掃描的制品,制品或者制品中的依賴組件存在一些安全漏洞,黑客可以利用這些漏洞入侵系統(tǒng)。
- 制品中可能存在惡意代碼:未經(jīng)過掃描的制品, 可能存在惡意代碼,部署這類制品會使整個系統(tǒng)處于風險之中。
- 制品中可能存在濫用SQL:濫用SQL帶來SQL注入風險,敏感數(shù)據(jù)泄露,邏輯漏洞等風險。
- 制品中敏感文件存在泄露風險:制品中存在一些敏感/機密數(shù)據(jù),若沒有進行適當?shù)募用芑蛟L問控制等措施,將使這些機密信息被黑客竊取或篡改。
制品安全掃描是提前發(fā)現(xiàn)和規(guī)避這些風險的有效措施,通過制品安全掃描保障應(yīng)用程序安全,減少安全風險造成的損失,保護公司機密數(shù)據(jù)。
(2)全方位安全掃描
平臺對制品進行全方位安全掃描,從源碼→構(gòu)建→制品→部署全流程進行掃描和管控,保障系統(tǒng)的安全性。
以上各種掃描(源碼掃描,構(gòu)建掃描,制品掃描)都會形成掃描報告,掃描結(jié)果也會記入制品元數(shù)據(jù),作為制品的安全屬性和制品晉級準入條件,進行部署管控,用戶也可以在制品庫查看制品的安全性與掃描報告。部署不安全制品時,線上線下環(huán)境會采取不同措施進行干預(yù):
- 線下環(huán)境部署不安全制品,提示安全風險,進行處理指導(dǎo),跟蹤處理進展。
- 線上環(huán)境部署不安全制品,一般情況下,平臺會自動檢測制品安全性,不允許不安全制品上傳;如果特殊情況必須上線,必須提前分析上線風險以及問題處理措施,經(jīng)過安全團隊審批,才能上線。
(3)組件準入規(guī)則
組件準入規(guī)則能夠提前規(guī)避問題,保障整個應(yīng)用程序或系統(tǒng)的安全性和可靠性,是軟件開發(fā)和部署過程中必不可少的一環(huán)。組件準入分為二方依賴和三方依賴的準入,下圖詳細展示了組件準入規(guī)則。
圖中名詞解釋:
- 內(nèi)網(wǎng)中央倉庫:存儲依賴倉庫,包括二方依賴,三方依賴。
- 安全掃描:掃描依賴,判斷依賴是否安全。
- 安全依賴知識庫:從公共倉庫拉取的三方依賴/內(nèi)部上傳的二方依賴經(jīng)過安全掃描后,安全的二/三方依賴會進入安全依賴知識庫。
- 漏洞知識庫:從公共倉庫拉取的三方依賴/內(nèi)部上傳的二方依賴都經(jīng)過安全掃描后,不安全的二/三方依賴會進入漏洞知識庫;同時平臺會定時從公共漏洞庫拉取漏洞信息。
1)依賴包的拉取:本地編譯或平臺構(gòu)建需要拉取某個依賴包時,平臺依據(jù)安全依賴/漏洞知識庫判斷依賴是否安全,安全的依賴才允許下載;若某個依賴在安全依賴/漏洞知識庫中不存在,會從公共倉庫拉取進行安全掃描,確定是安全的依賴后才允許下載。
2)二方依賴推送內(nèi)網(wǎng)中央倉庫:本地二方依賴禁止推送,只能通過平臺構(gòu)建生成二方依賴;二方依賴經(jīng)過安全掃描確定為安全依賴后進入安全依賴知識庫并推送到內(nèi)網(wǎng)中央倉庫,不安全依賴記錄到漏洞知識庫。
(4)依賴正反向溯源
上圖展示的是制品對應(yīng)的簡易依賴樹,以及每個樹節(jié)點存儲的信息。
通過制品正反向溯源,確定組件歷史版本和演變過程,追蹤代碼質(zhì)量、安全性、改變歷程等信息,幫助開發(fā)人員和系統(tǒng)管理員進行版本控制和漏洞檢查,確保組件庫中的所有組件都是計劃中要使用的版本。
四、總結(jié)與展望
制品管理是軟件開發(fā)和交付過程中不可或缺的環(huán)節(jié),vivo CICD的制品管理經(jīng)過四版的演進,從多品類支持,制品生成、制品晉級、制品部署、制品掃描,制品老化,制品管控等方面完善了制品管理能力,提高了軟件研發(fā)效率、軟件交付質(zhì)量和可靠性、簡化了軟件交付流程、降低了運維成本。
目前vivo CICD的制品管理是一個相對完善的制品管理平臺,但制品管理作為軟件開發(fā)和部署過程中重要的組成部分,在未來會走向更加智能化、集成化、安全化和規(guī)范化的方向,在制品管理的道路上我們還需不斷實踐探索:
- 智能化方面:隨著人工智能的發(fā)展,人工智能技術(shù)越來越成熟,后續(xù)將借助機器學(xué)習(xí)等技術(shù),智能識別制品安全情況,提供智能分析,智能推薦等功能。
- 集成化方面:制品庫與DevOps、CICD關(guān)系將會越來越緊密,后續(xù)將在制品管理中集成CICD能力,例如用戶可以在查看某個制品的同時進行一鍵部署。
- 安全化方面:隨著軟件和網(wǎng)絡(luò)安全威脅的不斷增加,制品庫安全掃描的重要性將會日益凸顯。為增加安全性能和提高交付效率,進行安全左移,例如將掃描前置到開發(fā)過程中。
- 規(guī)劃化方面:引入更多的規(guī)范化策略和標準,研究制定更加嚴謹?shù)闹破饭芾砹鞒?,防止因為制品管理的缺失?dǎo)致安全問題,提高交付效率。
制品管理還需要結(jié)合實際場景進行探索和創(chuàng)新,尋求更加智能化、靈活化和安全的實現(xiàn)方式,推動整個軟件開發(fā)生態(tài)的不斷發(fā)展和進步。