輕舟已過萬重山——真正的技術派公司是怎麼聯調、測試和發布的?
關鍵詞:研發協作,Docker,環境變數,開發聯調,環境維護,虛擬機,中間件,配置與代碼分離,git,jenkins
開發聯調,測試,預發,生產,稍微上規模的互聯網技術團隊,每一次發布都需要經歷這四個階段。每一個階段都對應於一個環境。所以我們會面對:
開發聯調環境,測試環境,預發環境,生產環境。
產品線若干條。並發多個版本。工程無數,有Java,有PHP,有中間件。
說句狠話:沒有趁手的利器,生產效率打完對摺再打對摺,勿謂言之不預也。
雲縱有 CloudEngine,如我的《私有雲的難處—為什麼需要CloudEngine?》和《#研發解決方案#研發協作平台CloudEngine》文章所述,我以為能非常流暢地打通這四個環境,即使生產環境是混合雲,即使應用可能發布在Docker容器里也可能發布在虛擬機里。
陳皓同學在《從Gitlab誤刪除資料庫想到的》中說道:
一個公司的運維能力的強弱和你上線上環境敲命令是有關的,你越是喜歡上線敲命令,你的運維能力就越弱,越是通過自動化來處理問題,你的運維能力就越強。
而我希望的是:
環境維護,應用部署,只是勾勾點點,沒有心理負擔,dont make me think。
一個代碼分支,對應的一個包(或鏡像,對應於 Docker 的 Image),可以流經開發聯調環境、測試環境,直接上預發環境,上生產環境,上雲端,一路穿行沒有障礙,全程無需手工干預,無需手工改配置文件重新打包。
這麼思考問題的原因也很簡單,我們篤信工程師文化,靠技術而不是管理解決問題,正如陳皓同學所言:
如果你是一個技術公司,你就會更多的相信技術而不是管理。相信技術會用技術來解決問題。相信管理,那就只會由制度、流程和價值觀來解決問題。
那麼怎麼辦到呢?
先來一個管中窺豹:
圖0 管中窺豹,CE里是怎麼申請伺服器資源的再來品嘗一下關鍵點。
一,用工具管好配置
我之前說過:
要做到真正的大環境一致,必須將配置完全與代碼分離,這裡的配置不僅僅是服務之間的 IP 地址/內部域名/自動發現,還包括不同環境下不同應用的配置參數等。
首先我們把與環境相關的參數都存儲在持久化配置中心裡,比如 redis/zk 的訪問域名,比如第三方合作夥伴的介面IP地址等。
其次,每個應用也都有自己的配置模板,不同環境部署的應用默認繼承配置模板,我們可以通過 CloudEngine 對配置做一些微調,也就是下面要講到的「臨時屬性信息」了。
CloudEngine 和 SimpleWay 會把環境標識(如 dev/dev-stable/test/test-stable/product 等)和需求工單號,以環境變數的方式打入「伺服器」(即容器或虛擬機)里。
工程通過環境變數確認自己在哪一個環境里,對應哪一個需求工單,從而從持久化配置中心讀取到當前環境和當前需求對應的屬性信息。
所謂屬性信息有三類:
1)環境屬性信息:
環境的配置信息在環境層級設置,對應於「環境管理」菜單。比如開發穩定環境下的環境變數,我可以通過如下界面統一配置:
(圖1 環境屬性信息)
2)應用屬性信息:
應用的配置信息在應用層級設置,對應於「應用管理」菜單。比如janus工程(Java)的應用配置,我可以通過如下界面來配置:
(圖2 應用屬性信息)
3)臨時屬性信息:
應用實例的配置信息在伺服器層級設置,對應於「伺服器管理」菜單。也就是這次我申請機器資源時,可以通過如下界面設置好臨時屬性信息,只有這個應用實例能訪問到:
(圖3 臨時屬性信息)
二,區分出穩定環境和非穩定環境
以前沒有 CloudEngine 的時候,我們會維護三套測試環境:常規分支測試環境,緊急分支測試環境,特殊分支測試環境。分別對應於上線的班車模式(每周固定發車),警車模式(bugfix),專車模式(版本很大,開發和測試周期較長)。
維護三套測試環境,真心累。
現在只需要維護一套測試環境。
那麼問題來了,多個需求工單,怎麼在一套環境里並行測試?
秘訣就是,在環境里再建一個穩定環境(Stable)。
穩定環境里的應用,只會部署 Release 版本。
根據需求工單申請的新伺服器資源,可以訪問穩定環境里的業務中心,至少能保證相關業務能正常運行,不會說突然功能不能用了,突然服務宕機了。
三,外網請求如何路由
如果開發聯調環境和測試環境里的應用需要接受外網的請求,那麼在 CloudEngine 里也不需要反覆申請外網域名。統一使用 http://router.yourcompany.com 域名接受外網請求,然後通過 nginx 轉發請求到相應的內網應用。
圖4 是否需要接受外網請求
四,與git緊密結合
在相應的環境里,申請伺服器資源時,你不需要鍵入 git 的代碼分支,你輸入應用名稱,選好應用之後,系統會自動列出相應的分支,智能吧:
圖5 分支自動展現
這充分體現了我們的哲學:dont make me think。
五,小結
我們技術團隊可以標準化輸出的成體系的通用技術能力有:
1)
基於虛擬機集群和容器集群的研發協作平台:
申請伺服器資源(虛擬機或容器),自動化構建,自動化部署,可自動發布到我們自己的公司機房、阿里雲、螞蟻金融雲和IDC機房,支持版本回滾;
2)
電商全套中間件解決方案:
定時任務管理與調度平台,
非同步消息可靠推送系統,
分散式並行計算調度和管理系統,
一站式智能監控報警平台,
分散式跟蹤系統,
分散式緩存管理系統,
資料庫自動化運維平台,
3)
大數據全套解決方案:
自助式報表平台,
即席查詢系統,
資料庫變更訂閱中心,
實時數據大屏發布平台,
大數據計算任務發布管理平台,
4)
運維基礎設施:
運維自動化平台,
雲平台基礎(虛擬機集群和容器集群),
大數據分析棧架構。
此體系絕非一朝一夕所能搭建,這是秉承著平凡人做非凡事的理念,一群信仰技術的工程師邊開飛機邊換引擎,花了幾年歲月建造的森嚴有序的技術體系。
-EOF-
歡迎長按二維碼訂閱我的微信訂閱號『老兵筆記』
注1:
頭圖來自於 【2017開年之作】舍計設計「稀缺之美」系列(11圖)_@綿羊修道士收集_花瓣插畫/漫畫 綿羊修道士的練筆之作。
注2:
張勇曰:
Joe有一次我們對於海外資本市場業績發布會上講過一句話,我覺得還是挺有意思的。
他說,we work for now,we invest for tomorrow,we incubate for future(我們為今天工作,為未來投資,為未來孵化一些東西)。最後一句比較特別,為未來冒出來的一二十個小芽里,有一個芽發了,那就大發了,完全變成一個新的未來的主力業務。
注3:
前陣子聽某公司技術負責人講他們的工程師文化,我總結了一下:
1、不養閑人,選擇能「在一起」的人。
2、進人慢,出人快,該淘汰就淘汰。
3、追求技術巔峰,鼓勵內部分享。
4、技術上任何人可以挑戰任何人,你行你就上。
5、不做技術/語言之爭,只看效果。
6、討論階段民主,執行階段專制。
——tombkeeper
注4:
從事任何技術研究,不知道該幹什麼的時候,就問自己四個問題:
?這個方向上最新進展是什麼? 都知道嗎?
?這個方向上最著名的專家有哪些?他們的研究都看過嗎?
?這個方向上最著名的技術社區有哪些?精華帖都看過一遍嗎?
?這個方向上最重要的文章、工具有哪些?文章都看過嗎?工具都分析過嗎?
——tombkeeper
-OVER-
推薦閱讀: