輕舟已過萬重山——真正的技術派公司是怎麼聯調、測試和發布的?

鄭昀 創建於2017/3/8 最後更新於2017/3/10

關鍵詞:研發協作,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 里也不需要反覆申請外網域名。統一使用 router.yourcompany.com 域名接受外網請求,然後通過 nginx 轉發請求到相應的內網應用。

圖4 是否需要接受外網請求

四,與git緊密結合

在相應的環境里,申請伺服器資源時,你不需要鍵入 git 的代碼分支,你輸入應用名稱,選好應用之後,系統會自動列出相應的分支,智能吧:

圖5 分支自動展現

這充分體現了我們的哲學:dont make me think。

五,小結

我們技術團隊可以標準化輸出的成體系的通用技術能力有:

1)

基於虛擬機集群和容器集群的研發協作平台:

申請伺服器資源(虛擬機或容器),自動化構建,自動化部署,可自動發布到我們自己的公司機房、阿里雲、螞蟻金融雲和IDC機房,支持版本回滾;

2)

電商全套中間件解決方案:

  1. 定時任務管理與調度平台,

  2. 非同步消息可靠推送系統,

  3. 分散式並行計算調度和管理系統,

  4. 一站式智能監控報警平台,

  5. 分散式跟蹤系統,

  6. 分散式緩存管理系統,

  7. 資料庫自動化運維平台,

3)

大數據全套解決方案:

  1. 自助式報表平台,

  2. 即席查詢系統,

  3. 資料庫變更訂閱中心,

  4. 實時數據大屏發布平台,

  5. 大數據計算任務發布管理平台,

4)

運維基礎設施:

  1. 運維自動化平台,

  2. 雲平台基礎(虛擬機集群和容器集群),

  3. 大數據分析棧架構。

此體系絕非一朝一夕所能搭建,這是秉承著平凡人做非凡事的理念,一群信仰技術的工程師邊開飛機邊換引擎,花了幾年歲月建造的森嚴有序的技術體系。

-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-


推薦閱讀:

如何在早期識別團隊中的高潛力員工?
產品經理如何爭取資源、協調資源?RD 不大願意幫忙怎麼辦?

TAG:研发管理 | 持续集成CI | 持续部署 |