天天看點

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

【以下為分享實錄,有删節】

阿裡巴巴為什麼要自研代碼管理平台

也許你會問:為什麼阿裡巴巴要重新做一套代碼管理平台,繼續用GitLab版本不是挺好的嗎?接下來從我個人的角度在這裡嘗試進行解答。

由于曆史原因,在阿裡巴巴集團内部代碼平台是整個DevOps領域中起步相對較晚的一塊業務域,相比于釋出域、測試域有着多年的積累和沉澱來講,2017年時的代碼平台可以說是為了滿足整體業務需求由幾個系統強行拼湊起來的。

為了支撐起阿裡巴巴整體的業務發展,研發團隊要同時維護6個系統,分别是負責代碼托管的GitLab、Svn、Gerrit,以及負責上層代碼服務的Phabricator、CodeCenter、ScmCenter。且其中除了CodeCenter、ScmCenter之外,其它四個均是在開源系統之上二次封裝改造而來的。其中Gitlab技術棧是基于Ruby,Phabricator基于PHP,SVN基于C,Gerrit基于Java,這給我們日常的開發和維護工作增加了很多負擔。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

當時代碼平台遇到的困難和挑戰主要有四個方面:

一、技術架構方面:多套系統架構,多種開發語言,不僅維護成本高,且與阿裡集團的主流技術脫節,研發團隊同學每天疲于填坑,然而整體上卻得不到大的改善。

二、平台發展方面:單純的Gitlab、Svn、Gerrit均無法與周邊關聯系統做到有效協同,且使用者的多樣性需求也很難在某個單一系統中得到滿足,最關鍵的一點是我們雖然手握海量代碼資産,但其寶貴價值卻未有效挖掘出來。

三、外部市場方面:代碼托管領域的市場是很有發展潛力的,但國内還沒有一款真正To B形态的代碼管理平台。這是因為對于科技企業來講,代碼是最核心的資産,企業把代碼托管到誰的平台就等于把身家性命托付給了誰。是以一款To B形态的代碼管理平台必須具備豐富的企業級特性以及完備的安全能力,然而在這一方面國内代碼托管産品還有很長的路要走。

同時這也是“自主可控”的需要。作為托管代碼的基礎平台進行國産化既是大勢所趨也是時代所需。隻有将核心技術和産品把控在我們中國人自己手裡才能從容面對未來各種不确定性。

四、代碼文化方面:即如何正向推動阿裡巴巴的代碼文化傳承。

阿裡巴巴代碼管理平台的整體政策

針對于以上代碼平台所面臨的四個方面的問題和挑戰,該如何去解決,我們的整體思考和政策如下:

第一、統一架構,夯實基礎:必須要統一架構,不能再在開源系統上拼拼湊湊,需要有一套完全能自主掌控的自研系統,從頭夯實好基礎。

第二、全面融合,高效協同:需要解決6套老系統如何與該自研系統過渡,同時該系統應該與DevOps領域中其它上下遊系統能夠友善的打通、協同。

第三,代碼文化,品牌建設:在代碼平台建設的同時,要考慮如何對阿裡巴巴的代碼文化和理念進行正向引導,進而做到以工具和平台作為載體,使代碼文化進行有效落地。同時還要進行我們自己産品的品牌建設。

第四,擁抱智能,彎道超車:面對競品我們如何才能真正脫穎而出、打出差異性,答案就是擁抱智能,通過智能化的手段進行彎道超車。

基于以上政策,我們開始了自研之路,全新的代碼管理平台先是在阿裡巴巴集團内部進行落地,進而解決了前文中提到的四個方面的問題。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

經過充足的準備,我們将這款自研代碼管理平台內建到雲效中,成為了“雲效代碼管理平台”,即Codeup,目前開發者可從雲效官網通路并免費使用。“雲效代碼管理”(Codeup)是一款企業級代碼管理平台,提供代碼托管、代碼評審、代碼掃描、品質檢測等功能,保護企業代碼資産,實作安全、穩定、高效的研發生産。抛開産品設計或團隊打造這些方面,我們在技術上究竟是如何做的,這個我會在後面進行詳細介紹。

雲效代碼管理平台的核心能力

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

雲效代碼管理(Codeup)主要提供代碼浏覽、代碼評審、配置管理(SCM)、代碼掃描、代碼安全、CI/CD、文檔、代碼庫遷移等能力和服務。

很多企業的技術負責人也許會糾結一個問題:将代碼托管到雲上是否安全?

一些企業在最終進行代碼托管時,均會選擇自己搭建代碼托管系統,其實阿裡早期也是如此,是以我們深知其中利弊。自己搭建代碼托管系統,就需要做以下相關工作:首先,需要選擇适合企業代碼托管場景的開源軟體;其次,準備托管的硬體設施。在此過程中,必須滿足一些特定的要求,如需要對開源軟體比較熟悉的技術人員進行搭建與維護;需要花費成本去購買實體或雲端伺服器;同時需要投入人力來負責安全及穩定性,否則就可能因為系統的穩定性而影響研發效率。

如果采用成熟的雲端代碼托管平台,就可以很好的避免上述問題。以雲效代碼管理平台(Codeup)為例,在代碼存儲方面,我們采用多副本高可用架構,資料自動備份;在代碼安全方面,我們提供完善的安全權限機制和保護措施,降低内部成員洩露代碼資料和外部黑客攻擊的風險。

綜合來看,對于中小企業及大型企業的開發人員,選擇成熟的雲端代碼托管平台,是更安全更省心更經濟的選擇。

雲效代碼管理平台的系統架構

早些年,阿裡巴巴集團内部采用的是AliGitLab系統架構,雖然在Gitlab上進行了分布式的改造,使這套系統的承載能力得到很大的提升。但是AliGitLab在架構上仍然屬于單層分片架構,因為Web服務和Git托管這兩個核心元件其實是部署在同一台機器上的,耦合十分嚴重,擴充能力非常差,且整個服務子產品都是基于Ruby技術棧。這就使整個架構存在兩個弊端:一是整個體系基于Ruby,導緻維護、擴充以及人員培養成本都很大;二是Web服務和Git托管耦合在一起,很多情況下會因為某個節點上代碼庫讀寫占用大量資源而對使用者在該節點上的頁面通路或API服務請求造成影響。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

針對上述問題,我們在雲效代碼管理平台(Codeup)上實作了全新的架構。通過明确的抽象、分層,将Codeup整體劃分為三層,即由下至上為存儲層、代理層和服務層。同時抽取出5個系統核心元件,服務元件間彼此職責單一、分離,上層Service和Portal基于Java進行實作,無狀态;存儲層及代理層元件全部用Go語言編寫。Codeup-stone主要負責檔案存儲及底層Git操作的封裝,其上抽取一個中間代理層,各層之間基于GRPC協定進行高效的資料傳輸。服務層的各項請求都基于Codeup-Proxy去與存儲層打交道,從整體上大幅增強了系統的容災能力和擴充性,每一層都可以做到友善的擴容、縮容。這套自研系統架構經過多年打磨和演進,在阿裡巴巴集團内部承載起了數萬工程師,上百系統的大規模、高并發的日常調用壓力。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

在開發者最關心的穩定性和檔案存儲方面,我們采用了多節點“分片”和單節點“一主多備”以及跨機房“冷備”的手段,來保障資料的高安全和高可靠性。同時雲效代碼管理平台(Codeup)全部元件均架構在阿裡雲基礎設施之上,以此來确儲存儲、應用伺服器、網絡等硬體方面的安全穩定。

在資料存儲和高可用方面,我們具體采取了以下三點措施:一、在底層存儲節點上,對代碼庫進行哈希散列處理,進而避免存儲節點因為倉庫分布不均勻而成為“熱點”;二、針對單個節點可能因為存儲“大庫”而成為“熱點”的問題,Codeup通過多副本的方式對單個節點的請求進行負載均衡,根據實際流量,可以進行快速的擴容或縮容;三、在倉庫資料備份方面,我們采取了多份熱備份和一份冷備份的方案。其中,熱備份至少會存在兩份,冷備份存儲全量的資料快照。針對使用者由于誤操作産生的資料删除等不可逆的問題時,我們可以通過冷備份的資料快照進行恢複。目前快照資料儲存的周期為一周。

除了基礎架構,我們在代碼智能化、代碼規範化等方面也做了大量的投入。基于阿裡巴巴集團内部海量的代碼資料,在代碼安全、代碼品質和研發提效等方面的我們都進行了大量探索和創新。這次也是希望借助我們自研的雲效代碼管理平台(Codeup)将這些優秀的能力開放出去,普惠更多中小企業。接下來,我會針對Codeup上代表性的功能和工具進行詳細介紹。

人工智能技術助力敏感資訊監測

首先,我們來了解一下雲效代碼管理平台(Codeup)在企業智能安全方面的功能。我們為企業管理者提供了安全風控、審計日志、IP白名單等把控代碼庫安全的核心能力。今天主要介紹一下敏感行為監測,我們是如何做的。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

首先,我們以代碼數倉為基礎建構了代碼圖譜,通過對代碼庫、代碼、工程師進行抽象将其轉化為實體,并通過實體的标簽化建構代碼畫像、使用者畫像等。為智能服務提供有力的資料支援,為平台業務提供推理關系查詢。在敏感行為檢測這個例子中,我們提取出了代碼庫重要度、檔案重要度、代碼段重要度、開發人員近期浏覽行為、開發人員畫像作為安全防護的支撐内容。一旦有重要庫、重要檔案發生敏感操作,如突然的大量代碼庫下載下傳、删庫、權限變更等行為,我們會立刻給訂閱使用者發送通知告警,幫助企業管理者感覺風險,及時止損。

代碼品質—飽受好評的P3C代碼規約檢測插件

在代碼品質方面,雲效代碼管理平台(Codeup)内置了我們自研的P3C代碼規劃檢測插件。這款插件在阿裡巴巴内部飽受好評,使用廣泛;目前已經開源,在業界也很受歡迎,無論是插件的下載下傳量,還是在Github源碼工程上的加星數都很高。 那麼,P3C技術上是如何實作的呢?

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

經過多次調研和探讨,我們選擇了開源代碼掃描工具PMD去做資源與規則擴充,主要是看中了其規則擴充友善,內建到其它通用平台和插件上更靈活的特性。但PMD也有其局限性,即不支援跨檔案掃描(例如:對過時方法的檢測),是以那些需要針對跨檔案掃描的規則我們提到了Sonar、IDE等上層工具去實作。

  • 方案標明後,我們基于開源的pmd-core三方Jar的能力上,擴充了約60個規約掃描規則,并封裝出P3C-PMD元件。
  • 在P3C-PMD元件基礎上,基于Sonar插件擴充标準,我們提供了sonar-p3c-pmd-plugin,也就是封裝出了一個标準的Sonar插件。此插件主要用于代碼庫全量自動化掃描階段。
  • CodeReview插件采用直接類似于指令行調用的方式內建了p3c-pmd,主要針對于增量代碼檢測階段。
  • 在P3C-PMD元件基礎上,基于IDEA的Inspection機制,以及Running Inspection By Name的功能自主實作了IDEA插件。
  • Eclipse插件主要是基于原生已有的Eclipse PMD插件進行的規則替換開發。我們通過IDE插件的實作,進而解決了本地代碼規約檢測的問題。

綜上所述,我們通過不同的插件覆寫了不同研發階段(如本地編碼階段,自動化全量測試階段、CodeReview增量檢測階段)的代碼規約檢測。通過本地結合線上、全量結合增量的政策,我們實作了一套規則落地多端,進而将阿裡巴巴Java編碼規約通過工具化平台化的手段在阿裡内部進行了充分落地。2017年10月份,我們在GitHub上将P3C規則和工具的源碼正式對外開源。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

通過以上努力,我們不僅将P3C工具在阿裡巴巴集團内部進行了有效落地,同時在集團外也樹立了很強的品牌影響力。規約檢測工具保證了規約文化的落地及傳播,同時規約文化又從效能、人才、穩定性等方面正向推動了整個研發體系的完善。

代碼品質—缺陷檢測技術PRECFIX技術揭秘

由于阿裡巴巴集團業務發展的複雜性,上文提到的P3C、PMD等傳統自動化檢測工具不能完全解決阿裡巴巴面臨的代碼品質問題。因為傳統工具多是基于規則比對,不需要了解特定的場景,基于業務場景的BUG很難通過這些自動化工具識别出來。例如有衆多的缺陷類型難以定義,這樣就沒辦法提取出有效的比對規則。是以我們希望有一種對缺陷類型泛化能力比較強的缺陷檢測方法或者工具,于是提出了PRECFIX方法(Patch Recommendation by Empirically Clustering)。

PRECFIX的技術思路其實并不複雜,主要分為三步,首先從代碼送出資料中提取“缺陷修複對”,然後将相似的“缺陷修複對”聚類,最後對聚類結果進行模闆提取,這個缺陷檢測和更新檔推薦技術可以用于代碼評審,全庫離線掃描等等。使用者的回報以及我們人工的審查可以進一步提高模型推薦品質。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

與國外友商的産品對比,PRECFIXP具有毫秒級檢測,覆寫較多的場景,能修複部分偏業務缺陷等特性。

PRECFIX方法已經在阿裡巴巴集團内部落地,在内部公開庫中掃描出了800多種缺陷類型,3萬多個缺陷,提取出了3000多個模闆。此功能将在這個月底前(2020年4月)通過雲效代碼管理平台(Codeup)開放給使用者使用。

代碼安全-敏感資訊檢測SecretRadar

我們知道每天都有成千上萬條諸如API Key、 Database credential、Private token等敏感資訊通過某些站點被無意識的洩露出去。為了預防這類問題,我們決定在雲效代碼管理平台(Codeup)提供敏感資訊檢測的能力。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

是以調研了業内多款敏感資訊檢測産品,包括比較知名的Truffle Hog、Watchtower等。但是這些工具要麼單純考慮規則比對,要麼采用資訊熵技術,召回率或準确率無法滿足我們的預期,模型最終效果都不是非常理想。是以,我們在規則比對和資訊熵技術的基礎上,結合了多層檢測模型和上下文語義檢測,打造了一款敏感資訊檢測工具 ——SecretRadar,進而使識别效果得到了顯著提升。

SecretRadar的實作思路主要分為三個層面,第一層我們采用傳統敏感資訊識别技術通過豐富的規則集來保證模型基礎能力的穩定和可靠,同時確定了模型良好的可擴充性,以此來支援後續使用者自定義的能力。但是這種方法非常依賴固化的長度、字首、變量名等,比對效果上容易造成漏報。是以針對難以固定規則捕捉的場景,在第二層我們采用了資訊熵算法。資訊熵可以用來衡量資料集的資訊量大小,也就是其不确定程度。是以資料集的資訊熵越大,無序程度就越高。通過計算資訊熵,可以有效識别随機生成的密文資訊,進而提升模型的召回能力,補足基于規則手段的漏報問題。同樣資訊熵算法也有其局限性,伴随召回的提升是誤報率的增加。是以在第三層我們采用了模闆聚類的方法,進行了過濾優化。針對資訊熵結果集聚合提取常見關鍵字,并結合上下文分析,來完成二次過濾。同時通過問題的修複情況,建立二分類資料集,完成算法優化。進而從詞法識别疊代為語義識别。

智能評審助力開發者提升研發效能

在研發提效方面,我們認為代碼評審是一個很好的抓手。在調研、學習了國際上多款優秀産品的基礎上,結合阿裡巴巴複雜、多樣的研發場景,我們曆時兩年打磨出來一套非常好用的代碼評審子產品。結合人工智能技術,我們在業内首創了評審耗時預估、評審人自動推薦等功能。

分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

接下來我們詳細了解一下評審耗時預估。“評審耗時預估”有什麼意義呢?我們都知道,代碼評審的工作量“可大可小”,主要取決于評審代碼改動量的大小和業務邏輯的複雜度。作為軟體開發工程師,大家平時的工作都很忙,隻能在開會或編碼的間隙中抽出特定時間來做代碼評審。但往往代碼評審的工作量超出了評審者的預期。同時也存在一些極端情況,某些小的評審可能隻需要幾十秒就可以評審完畢,但是評審者在不知情的情況下卻為它安排了大段的評審時間。

“評審耗時預估”主要服務于兩種場景,第一個場景是使用者在未進行評審之前,可以在第一時間知曉評審的工作量,輔助他合理安排評審時間;第二個場景是對于那些同時要進行多個代碼評審的使用者,可以幫助他們合理安排評審的優先級。

“評審耗時預估”到底是如何實作的呢?首先我們基于阿裡巴巴集團内部海量的公開代碼資料,收集了幾百萬次的評審檔案浏覽資料,提取了包括文本改動、項目曆史、行為曆史在内的數十種特種,訓練了機器學習模型。當開發者送出代碼評審之時,我們根據他送出代碼的Diff内容,自動估算出評審耗時,并伴随代碼評審通知一起來告知評審者,幫助他合理安排評審時間。以上能力會在使用者授權的情況下,陸續在雲效代碼管理平台上開放給大家使用。

我們希望在不久的将來,開發者不僅将代碼托管到雲上,整個開發過程也可以搬到雲上。雲效代碼管理平台(Codeup)目前正在以每周一個小版本每月一個大版本的速度疊代演進,在保證高可用、高性能、高體驗的同時,旨在給企業開發者和管理帶來更有價值的創新。目前所有開發者都可以通過雲效官網免費使用Codeup,也歡迎大家加入雲效開發者交流群(釘釘群号:34532418)來與我們交流讨論。

【關于雲效】

雲效,企業級一站式DevOps平台,源于阿裡巴巴先進的研發理念和工程實踐,緻力于成為數字企業的研發效能引擎!雲效提供從“需求 ->開發->測試->釋出->運維->營運”端到端的線上協同服務和研發工具,通過人工智能、雲原生技術的應用助力開發者提升研發效能,持續傳遞有效價值。

【雲效官網】

https://www.aliyun.com/product/yunxiao

【公測指南】

https://developer.aliyun.com/article/756207

【申請公測】

https://devops.aliyun.com

【學習路徑】

https://help.aliyun.com/document_detail/153739.html

【開發者社群】

https://developer.aliyun.com/group/yunxiao

【精彩活動】雲效公測開啟 「産品體驗官」招募中~

https://www.aliyun.com/activity/yunxiao/Beta2020
分享實錄 | 阿裡巴巴自研代碼管理平台技術解密

歡迎掃碼加入雲效開發者俱樂部(釘釘群号:34532418)