作者:vivo 網際網路效能平臺團隊 - Chen Lingling
在DevOps實踐中,製品管理是一個重要的組成部分,它可以幫助團隊快速交付高質量、高可靠性的軟體,本文將介紹在 DevOps 領域,vivo CICD是如何進行管理製品,闡述了 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能力,例如使用者可以在檢視某個製品的同時進行一鍵部署。
-
安全化方面:隨著軟體和網路安全威脅的不斷增加,製品庫安全掃描的重要性將會日益凸顯。為增加安全效能和提高交付效率,進行安全左移,例如將掃描前置到開發過程中。
-
規劃化方面:引入更多的規範化策略和標準,研究制定更加嚴謹的製品管理流程,防止因為製品管理的缺失導致安全問題,提高交付效率。
製品管理還需要結合實際場景進行探索和創新,尋求更加智慧化、靈活化和安全的實現方式,推動整個軟體開發生態的不斷髮展和進步。