vivo 制品管理在 CICD 落地實踐

一、前言
隨著軟件開發的不斷發展,DevOps已經成為了一種流行的軟件開發實踐方式。在DevOps實踐中,制品管理是一個重要的組成部分,它可以幫助團隊快速交付高質量、高可靠性的軟件,本文將介紹vivo制品管理在CICD的演進過程與落地實踐,希望能為讀者提供一些實踐經驗和思路。
名稱解釋
制品:在廣義上指軟件開發過程中生成的各種產物,包括軟件代碼、文檔、報告、測試結果等,在狹義上,指軟件開發過程中生成的最終產物,如編譯產物、打包產物、鏡像等。
制品庫:制品庫即管理制品的中央倉庫,用來存儲和管理不同格式的軟件制品,如源代碼,編譯后的程序,鏡像,配置文件,第三方庫和依賴,版本信息等。制品庫一般包含存儲,版本管理,權限控制,安全掃描,依賴分析等功能,是一種企業處理軟件開發過程中產生的所有包類型的標準化方式。
二、vivo CICD制品管理演進
隨著DevOps行業的蓬勃發展,行業內越來越關注制品能力的建設;在不斷的實踐摸索中,vivo CICD制品管理能力也越來越完善,vivo CICD的制品管理發展一共經歷了4個階段,包括手工管理階段、腳本管理階段、平臺管理 1.0 階段和平臺管理 2.0 階段。

- 手工管理階段:本地構建制品,手動上傳到部署機器,進行手動部署。純手工時代,需要耗費大量人力和時間,出錯率高,無法保證一致性和可重復性。
- 腳本管理階段:使用腳本化管理工具自動化構建、部署過程。通過Jenkins構建制品,上傳到文件存儲器,shell腳本從文件存儲器(FTP)下載后進行部署。這一階段初步實現構建、部署過程的自動化,并且保證了一致性和可重復性,但需要手動編寫腳本,維護成本較高。
- 平臺管理1.0階段:基于Jenkins ,Spinnaker自研CICD平臺,加速軟件的構建、測試、部署和發布過程 。在這個階段流水線比較完善,實現構建、測試、部署過程自動化,并且可以自動化地觸發測試和部署操作,從而提高軟件交付的速度和質量;但是制品管理能力有限,僅在流水線范圍內保證一致性和可重復性。
- 平臺管理2.0階段:隨著平臺能力全面發展,為了提高研發效率和軟件質量,降低運維成本,我們進一步完善了制品管理能力,實現制品的版本控制、存儲、晉級和安全管理等,從而提高軟件開發效率、簡化軟件交付流程、提高軟件交付質量和可靠性。
當前CICD 制品管理處在平臺管理2.0階段,這一階段制品管理具有如下優勢:
- 多類型制品支持:制品庫支持一個項目同時存在Generic、Maven、NPM、PyPI、Docker、Helm等多種常見類型,滿足多技術棧研發團隊的訴求。
- 制品統一管理:將軟件研發過程中所有制品進行版本管理、集成、協同和發布管理等,從而提高研發效率和質量,支持持續交付和DevOps實踐,提升企業競爭力和創新能力。
- 制品溯源追蹤:基于制品元數據和準入準出規則,進行制品晉級,以制品維度記錄從需求到發布的過程數據,實現需求、編碼、構建、測試、質量和部署全生命周期過程的強管控,實現可信追溯與安全審計。
- 制品安全掃描:檢測制品中的潛在安全漏洞和風險,提高系統和應用程序的安全性和可靠性,避免信息泄露和惡意攻擊,從而保護企業數字資產的安全。
- 降低運維成本:統一管理制品,減少重復建設,降低運維、研發,測試溝通成本。
- 制品極速分發:支持多地數據中心上傳下載,實現多地數據中心集群部署。
制品管理是軟件開發和交付過程中不可或缺的環節,通過制品管理,可以提高軟件交付效率、質量和可靠性,降低成本和風險,促進團隊協作和溝通,提高管理效率和決策能力,從而提高企業的生產力和競爭力。

三、vivo CICD制品管理介紹
3.1 vivo CICD 制品管理概況
1)目前制品庫支持:
- 元數據管理:對制品的屬性信息進行有效管理和保護,包括編譯產生的元數據,用戶自定義的元數據,cicd平臺生成的元數據等。
- 制品統一管理:統一管理制品生命周期,提供存儲,溯源追蹤,上傳下載,版本管理,權限控制,回收,部署等多項功能。
- 制品晉級:不同環境中的配置和參數可能會有所不同,對制品進行適當的修改和定制化,以滿足不同環境的需求,也是針對不同需求設置制品準入門禁。
- 極速分發:靈活地適應不同的部署需求和架構模式,將制品快速、可靠地分發到各地數據中心。
- 安全掃描:對制品進行全方位的漏洞,合規掃描(包含源代碼,依賴,文件,鏡像等),識別制品安全等級,提前規避問題。
2)制品生命周期

3)制品在研發流程中所起的作用
對于CICD流水線而言,制品起到一個承上啟下的關鍵作用,它是持續集成CI的終點,也是持續交付CD的起點,是研發流程關鍵組成部分。

3.2 制品管理系統架構

3.3 核心功能介紹
3.3.1 制品統一管理
制品統一管理,顧名思義在軟件研發和部署過程中,對產生的各種制品進行整體的統一管理。主要包含元數據管理,統一存儲,制品生成,制品晉級,制品部署,制品掃描,制品老化,權限管控幾大功能的管理。
(1)元數據管理
制品元數據是指對制品本身的描述和補充信息,與制品密切相關,是制品管理的一個重要部分。
目前管理的元數據有:
制品名稱(MD5/鏡像標簽)、版本、類型、制品大小、來源信息、源代碼、可部署環境、存儲地址、掃描報告、依賴信息、制品作者、描述、老化日期,老化狀態等。
通過制品元數據對制品有了全方位了解,可以幫助研發,測試,運維等角色快速定位識別制品、進行版本回溯,追蹤問題的引入,及時修復安全漏洞等。
(2)統一存儲
按照使用場景,制品一般分為三類,統一管理存儲在對應的存儲器上。

(3)制品生成
平臺制品的來源分為三類類:手動上傳制品,流水線構建、公網引入

(4)制品晉級
制品晉級流程
在整個研發流程中,研發團隊一般都有開發,測試,預發,壓測,生產環境,而對于不同環境可部署條件是不一樣的,即不同的環境對于制品有不同的準入門禁,制品需要通過晉級來達到準入標準。

經過代碼掃描,編譯后制品生成 → 部署開發環境 → 經過安全掃描 → 部署測試環境 → 測試通過,并分發到線上倉庫之后 → 部署預發環境 → 部署預發后,驗收通過,并提交上線審批工單之后部署生產環境。
目前制品晉級規則比較簡單,為了幫助研發團隊有效且直觀地區分制品版本的成熟度情況,提高交付效率和安全性,后續將支持自定義制品等級和晉級規則。
制品分發
在制品晉級的過程中,制品等級越高,越需要支持跨網絡/數據中心使用,制品分發將生成的制品快速、準確和可靠地分發出去,供不同地區開發人員或用戶使用,為企業提供更為高效和便捷的全球化業務支持。

(5)制品部署
制品部署是將軟件制品部署到各個環境的過程,制品部署是軟件開發的最后一步,也是最關鍵的一步,如果部署失敗,將會導致業務中斷或嚴重故障,保障部署制品版本正確至關重要。 平臺目前有支持三種方式部署:構建部署一鍵運行,制品庫選擇制品,選擇上線工單部署。
- 構建部署一鍵運行:用戶選擇代碼版本進行構建,構建后制品直接部署到對應環境。
- 制品庫選擇制品:選擇歷史制品進行部署,為了保障用戶選擇到正確的制品版本,制品選擇會展示元數據方便用戶核對,且線上環境只能選已晉級制品進行部署。
- 選擇上線工單部署:線上部署前需要提交上線工單,經過管理員、安全管理員,執行人等審批通過之后,選擇工單部署對應制品至線上環境。
(6)制品掃描
制品包含的是在應用程序開發過程中產生的各種文件,從源代碼到編譯后的二進制文件、測試結果和部署配置文件,甚至到生產環境中使用的數據。一旦這些制品受到攻擊或被竊取,會嚴重影響整個應用程序或系統的安全性和可靠性,安全掃描是制品管理中重要一環,有助于保障系統穩定性和安全性,平臺對制品進行全方位的漏洞/合規掃描(包含源代碼,依賴,文件,鏡像等),提前識別制品安全等級,提前規避問題。這一部分將在3.2中重點介紹。
(7)制品老化
合理制定制品生命周期管理策略,定期清除無效制品,減少存儲空間占用,可以提高系統性能,提供更安全、穩定、整潔的制品庫。
- 自動化清理:制品生成后,平臺會根據保留策略計算制品的銷毀時間,然后根據制品銷毀時間,自動定時清理過期制品。
- 保留策略:一般情況下,線下制品保留60天,線上制品保留90天,正在部署或者部署中制品不會被清理;支持定制化保留時間,對于迭代頻繁或自動化程度高的項目,制品數量繁多,可以縮短制品保留時間,而像一些穩定的運維系統,可以延長保留時間。
- 清理白名單:對于一些特殊制品或項目,不能隨意清理,可以申請清理白名單;白名單支持制品和項目兩個維度;特殊制品可以申請清理白名單,延長保留時間或永不清理,項目也可以按項目維度申請白名單,為項目下所有制品申請清理白名單。
- 恢復策略:直接清理制品,具有一定的風險性,平臺支持恢復老化制品;清理的制品,短期內平臺會進行備份,已清理制品平臺支持基于制品元數據(代碼信息,編譯環境等)重新生成制品,從而保障制品安全性。
- 標準化流程:為保證不清理掉與業務相關的重要信息或數據,對業務產生不利影響,必須按照規范的流程進行清理和記錄,以下是整個清理流程:

(8)權限控制
制品權限控制是制品管理流程中非常重要的一部分,它可以確保制品在構建、存儲、分發和部署等環節中,僅有經過授權的人員才能訪問、修改、上傳和下載制品。通過制品權限控制,大大降低公司潛在安全風險,防止機密信息和敏感數據的泄漏。
- 身份驗證+角色控制:通過單點登錄(SSO)確定用戶身份信息,項目成員才能訪問、修改、上傳和下載制品;同時為了保障生產環境的穩定性和安全性,經過管理員審批的制品才能部署到線上環境。
- 項目隔離:為了確保項目之間資源不會互相干擾,保證項目制品的安全性,項目間的制品是隔離的,項目內的制品只能在項目中使用。
- 制品權限控制:針對制品進行單獨的權限分配(設置制品可操作空間、可操作用戶/用戶組)。
3.3.2 制品安全掃描
(1)制品存在哪些安全風險
- 制品/依賴組件存在安全漏洞:未經過掃描的制品,制品或者制品中的依賴組件存在一些安全漏洞,黑客可以利用這些漏洞入侵系統。
- 制品中可能存在惡意代碼:未經過掃描的制品, 可能存在惡意代碼,部署這類制品會使整個系統處于風險之中。
- 制品中可能存在濫用SQL:濫用SQL帶來SQL注入風險,敏感數據泄露,邏輯漏洞等風險。
- 制品中敏感文件存在泄露風險:制品中存在一些敏感/機密數據,若沒有進行適當的加密或訪問控制等措施,將使這些機密信息被黑客竊取或篡改。
制品安全掃描是提前發現和規避這些風險的有效措施,通過制品安全掃描保障應用程序安全,減少安全風險造成的損失,保護公司機密數據。
(2)全方位安全掃描
平臺對制品進行全方位安全掃描,從源碼→構建→制品→部署全流程進行掃描和管控,保障系統的安全性。

以上各種掃描(源碼掃描,構建掃描,制品掃描)都會形成掃描報告,掃描結果也會記入制品元數據,作為制品的安全屬性和制品晉級準入條件,進行部署管控,用戶也可以在制品庫查看制品的安全性與掃描報告。部署不安全制品時,線上線下環境會采取不同措施進行干預:
- 線下環境部署不安全制品,提示安全風險,進行處理指導,跟蹤處理進展。
- 線上環境部署不安全制品,一般情況下,平臺會自動檢測制品安全性,不允許不安全制品上傳;如果特殊情況必須上線,必須提前分析上線風險以及問題處理措施,經過安全團隊審批,才能上線。
(3)組件準入規則
組件準入規則能夠提前規避問題,保障整個應用程序或系統的安全性和可靠性,是軟件開發和部署過程中必不可少的一環。組件準入分為二方依賴和三方依賴的準入,下圖詳細展示了組件準入規則。

圖中名詞解釋:
- 內網中央倉庫:存儲依賴倉庫,包括二方依賴,三方依賴。
- 安全掃描:掃描依賴,判斷依賴是否安全。
- 安全依賴知識庫:從公共倉庫拉取的三方依賴/內部上傳的二方依賴經過安全掃描后,安全的二/三方依賴會進入安全依賴知識庫。
- 漏洞知識庫:從公共倉庫拉取的三方依賴/內部上傳的二方依賴都經過安全掃描后,不安全的二/三方依賴會進入漏洞知識庫;同時平臺會定時從公共漏洞庫拉取漏洞信息。
1)依賴包的拉取:本地編譯或平臺構建需要拉取某個依賴包時,平臺依據安全依賴/漏洞知識庫判斷依賴是否安全,安全的依賴才允許下載;若某個依賴在安全依賴/漏洞知識庫中不存在,會從公共倉庫拉取進行安全掃描,確定是安全的依賴后才允許下載。
2)二方依賴推送內網中央倉庫:本地二方依賴禁止推送,只能通過平臺構建生成二方依賴;二方依賴經過安全掃描確定為安全依賴后進入安全依賴知識庫并推送到內網中央倉庫,不安全依賴記錄到漏洞知識庫。
(4)依賴正反向溯源

上圖展示的是制品對應的簡易依賴樹,以及每個樹節點存儲的信息。

通過制品正反向溯源,確定組件歷史版本和演變過程,追蹤代碼質量、安全性、改變歷程等信息,幫助開發人員和系統管理員進行版本控制和漏洞檢查,確保組件庫中的所有組件都是計劃中要使用的版本。
四、總結與展望
制品管理是軟件開發和交付過程中不可或缺的環節,vivo CICD的制品管理經過四版的演進,從多品類支持,制品生成、制品晉級、制品部署、制品掃描,制品老化,制品管控等方面完善了制品管理能力,提高了軟件研發效率、軟件交付質量和可靠性、簡化了軟件交付流程、降低了運維成本。
目前vivo CICD的制品管理是一個相對完善的制品管理平臺,但制品管理作為軟件開發和部署過程中重要的組成部分,在未來會走向更加智能化、集成化、安全化和規范化的方向,在制品管理的道路上我們還需不斷實踐探索:
- 智能化方面:隨著人工智能的發展,人工智能技術越來越成熟,后續將借助機器學習等技術,智能識別制品安全情況,提供智能分析,智能推薦等功能。
- 集成化方面:制品庫與DevOps、CICD關系將會越來越緊密,后續將在制品管理中集成CICD能力,例如用戶可以在查看某個制品的同時進行一鍵部署。
- 安全化方面:隨著軟件和網絡安全威脅的不斷增加,制品庫安全掃描的重要性將會日益凸顯。為增加安全性能和提高交付效率,進行安全左移,例如將掃描前置到開發過程中。
- 規劃化方面:引入更多的規范化策略和標準,研究制定更加嚴謹的制品管理流程,防止因為制品管理的缺失導致安全問題,提高交付效率。
制品管理還需要結合實際場景進行探索和創新,尋求更加智能化、靈活化和安全的實現方式,推動整個軟件開發生態的不斷發展和進步。




































