「誰把我的環境給重新部署了?」「我的環境裡邊的資料怎麼不對了?」
「誰能幫我把線上的設定同步一下到線下?」
環境管理是我們日常工作中比較複雜的一環,主要是因為涉及內容比較多,程式、設定、資料都會涉及,如果是開發、測試環境,還會涉及到測試資料造數、系統刷資料、不同的人使用、鎖定、轉讓、釋放等問題。下面我將會從環境分類、環境建設的難點,以及最後如何解決這些難點來講述研發效能之環境建設。
網路型別環境
從網路環境的可存取性區分,研發效能涉及以下三種環境:
IT、運維和安全的小夥伴一般更願意從網路的可存取性去劃分環境,因為這樣可以劃分資源、設定存取策略、進行安全檢測等。
用途劃分環境
對於產研團隊來說,我們通常從環境的用途來劃分環境,一是和自己角色相關,研發用研發環境,測試用測試環境;二是通過用途區分好理解。至於能否打通,是否受限一般由底層基礎設施團隊來維護,大家都不太關心。對於我們研發效能團隊來說,我們一般會維護一張各個環境互聯互通、安全網路策略的表格,讓各方心裡都有數。萬一出現存取性的問題,相關人員也能自己排查。
整合測試環境,有的行業也稱之為SIT 環境(system integration test),而我們更願意稱之為 QA 環境,簡單明瞭且無需解釋,大家都能瞭解。用 SIT 有很高的解釋成本;同理預發環境,也有人用 staging 環境,但總覺得沒 pre 更加簡單,且能讓更多的人瞭解其用途。 另外一個角度就是,我們公司裡大家建設的環境名的統計資料也支援了我們的想法,qa 環境比 SIT 環境數多,pre 環境比 staging 環境多。
環境建設主要涉及資源、負責人、建設和維護四個方面,當然難點也主要在這四個方面。
1. 缺少硬體資源
很多公司之所以沒有開發、測試環境是因為沒有硬體資源。沒有充足的資源搭建測試環境,這是環境建設的第一個難點。尤其是很多不那麼「現代」的公司,比如建立個虛擬機器器還要申請,走漫長的審批流程,層層審批的。
也有的公司經常把一些設定特別低且過保的機器給開發測試環境用,三天兩頭出問題,白白浪費了開發測試人員的時間。
2. 缺少明確的負責人員
很多公司線上環境還能保證專人負責,開發環境就是員工工作筆電,幾乎沒有QA環境。這種開發、測試環境缺失的主要問題還是在業務負責人對自己業務的理解。沒有意識到開發、測試環境建設對研發效率、生產環境質量的影響,也沒意識到需要有明確人員負責環境的建設和維護。
3. 耗時長難搭建
每次搭建都需要研發同學申請機器,然後手動在機器上一個一個服務的安裝服務,同時還要設定各種中介軟體,刷入對應的資料等。難搭建耗時長,對於使用方和搭建方都是一種折磨。
4. 缺少後期維護
環境搭建出來後,因為缺少後期維護,環境中的服務版本和線上有所差異,但是其他人又不知道如何更新;線上資料庫表結構變化了,也沒人同步到線下;某些線上功能,甚至在測試環境都無法迴歸驗證。慢慢環境就會變成無法使用狀態,於是開啟了又一輪搭建環境的痛苦過程。
5. 缺少複用
假設一個業務有20個微服務,每個微服務一個容器,那麼聯調、測試、預發、UAT四套環境都完備至少要80個容器;如果有3個QA同學並行測試,都獨佔環境,那麼就要240個容器。這還是微服務較少的情況。如果要是業務複雜起來,微服務數量增多,範例的副本增多,環境套數增多,那麼就會佔用大量的物理資源。
針對以上問題,把我們的實踐分享給大家。
1. 充足的硬體資源
雖然現在硬體相對人工成本來說已經相當便宜,尤其是有各種雲資源可以利用,但是不得不說有些公司依然在資源上不願意投入。現在一人天500人民幣,可以在某雲上買一個2核2GB記憶體50GB的雲伺服器使用一年。而500人天,月薪1萬左右,一個應屆生的工資可能都比這還高。如果按照資深工程師去算,更得不償失。現在和之前硬體價格高企的年代不同了,所以能硬體解決的就儘量不要用人去解決。
前期資源的使用可以粗糙一些,後面可以設定個資源池大家共用,再精細化一點可以針對每個人設定配額。因為每個人使用的資源是不一樣的,研發可能1-2套環境就夠了,但是並行測試任務較多的QA小夥伴就會需要更多的資源,這個時候配額的上調又需要個流程來完成。我個人總覺得加上審批流的過程是不完美的。
2. 權責清晰的團隊
想要把開發、測試環境建設好,關鍵是要有明確的環境負責人。以往經驗來看,誰需要、誰建設、誰負責。
為啥線上環境的第一責任人是業務負責人,因為他才能結合多種背景因素做出最恰當的判斷。
舉個例子
之前我們一般都是晚上下班以後、週五下午、週六日都可以上線。如果僅僅是前端問題,甚至中午都可以上線。那個時候,我們每個人回家都是帶著筆電回去,晚上上完線以後,還要測試,沒問題以後才算完。大家雖然很累很趕很忙,但是有一股勁:這是「我」的產品。
後來產品成了「我們」的產品,「老闆」的產品,改成了每週五上線,其它時間除非緊急缺陷修復否則不上線,要去團建不上線,老闆沒審批不上線,週末上線擔心發現bug不上線。看似「上線」規範了,實則跑不起來也跑不快。大家看似各司其職,實則是守著自己的領地,卻丟了整個的陣地。犧牲了業務,把業務中的問題劃歸到「流程」「制度」問題。其實這也是一種不作為。
一頭獅子佔領了一個山頭,這就是它的領地,其它獅子就不能進來了,進來了就是侵犯我的領地。陣地作戰,大家的目標都是一致的,那就是贏。有利於目標達成的,都可以去實施都可以去幹。所以團隊要強調有陣地意識,沒有領地意識。
3. 一鍵搭建環境
環境的搭建必須方便、快捷,這樣才能提高所有產研團隊的效率。但是很多公司在這一塊都很薄弱需要改進。很多公司生產環境都治理得不是很好,何況開發和測試環境。
一個業務的環境不能只有幾個人能搭建出來,不能手動修改很多設定才能跑,這樣做是十分危險的。這個時候我們需要一鍵可以把環境拉起來且可以使用,使用完畢後即可釋放的功能。哪怕用 Jenkins 搞定也可以,但必須要快、可重複、可重現。
我們的作法:
有了上面的條件,我們就可以一鍵把涉及的所有服務程式碼下載、構建後自動部署、部署後服務啟動、自動檢測、接入監控紀錄檔告警,接入服務大盤。
說一千道一萬,光有好的規範機制是不行的,還是要落到實處,需要平臺來落實它、承載它;平臺有用、易用又能更好支援規章制度。
4. 專人維護
比環境搭建還困難的就是環境維護。環境搭建出來只是一時之功,但是要想讓一個環境能起到作用,隨時可用,日常的維護是必不可少的。比如更新應用的版本,更新組態檔,更新資料庫表結構,刷資料庫中的資料。有的人想用但是沒能力沒資源維護,有的人能維護但是業務壓力大沒時間沒動力去維護, 不出幾天環境就不能用了。如果想用,又得花費很大的工作量去修復或者重新搭建。
我們開發環境主要是研發同學維護,測試環境都是QA小夥伴維護。因為一鍵可以部署出環境,所以是誰搭建也就無所謂了。極大減少了搭建耗時,提高了工作效率。
5. 資源獨佔和泳道相結合
資源複用這個問題只有環境大量的被建立和使用,現有的資源無法滿足需求的時候才會有環境複用的煩惱。目前大多數公司(99%)的公司還都沒有這個煩惱,因為這些公司的難點還在建立、維護環節;但是剩下的那1%的公司一旦有這個煩惱就是個大煩惱。
小業務簡單服務獨佔環境
小業務的環境好搭建且獨享,易用好用,缺點就是犧牲了一些資源,服務無法複用。我始終認為只要環境可以快速建立、快速驗證、用後即焚,獨佔的環境是最理想的。不用過多的流程審批、協調方面的管控。
大業務複雜業務複用環境:
之所以想複用環境,是因為業務比較複雜,尤其是微服務架構下服務個數多,呼叫鏈路長,我們已經無法把所依賴的環境全部快速搭建出來,且設定完畢後能正確存取,我們只能依賴於其它方來維護這些環境,而我們對其形成依賴。另外一個原因就是這些被依賴的服務本身依賴和部署做的十分糟糕,無法可以通過一種簡單的方式部署且能快速啟動,裡面可能在程式部署後還需要大量的手動操作。
現在比較成熟的是泳道。阿里、美團等公司內部都有自己的內部實現。大家可以深入瞭解一下。
對服務鏈按需求進行分組複製,並實現邏輯、物理的隔離,使得不同需求的服務鏈執行在相隔的物理機器上,邏輯上如同游泳場中的泳道。
當然泳道也不是完美的解決方法,對業務有侵入,且中介軟體也需要很好的處理和配合,才能讓泳道發揮作用。
本章主要講述了環境的分類,環境建設過程中的難點和環境建設的最佳實踐。環境建設是一個非常見功夫的事情,需要大量的人力物力長期的投入,不是一朝一夕就能完成的事情。放眼望去,國內能做到各種環境一鍵拉起即用的少之又少。這也給了我們一個很大的提示,這裡有很大的空間,大有可為。
如果各位也有這方面的問題,歡迎和我們聯絡,關注scmroad,大家一起交流溝通,共同進步。