pushguide發(fā)布系統(tǒng),是汽車之家正在使用的代碼發(fā)布系統(tǒng)?!复a上線」是運(yùn)維日常工作中最重要的一部分。在沒有發(fā)布系統(tǒng)之前, 所有的業(yè)務(wù)都需要運(yùn)維來手動(dòng)上線。 上線工作對(duì)運(yùn)維人員來說是不小的工作量。 為了解放生產(chǎn)力,提高上線效率,我們開發(fā)了該系統(tǒng)。
1. 背景
(1)野蠻生長(zhǎng)階段
業(yè)務(wù)線自己各自為戰(zhàn),沒有統(tǒng)一的代碼規(guī)范, 發(fā)布流程。 上線之前提交上線單通知運(yùn)維人員手動(dòng)上線。這種模式的缺點(diǎn)不言而喻,運(yùn)維人員需要隨時(shí)待命, 從上線部署到最后驗(yàn)證, 有問題的話回滾都需要運(yùn)維人員全程手動(dòng)完成,費(fèi)事費(fèi)力。
(2)統(tǒng)一規(guī)范,使用發(fā)布系統(tǒng)發(fā)布
業(yè)務(wù)線接入CI和發(fā)布系統(tǒng)之后, 業(yè)務(wù)方通過CI打包自己的代碼, 通過發(fā)布系統(tǒng)自助完成發(fā)布。如發(fā)布代碼有問題,可以在系統(tǒng)上直接選擇要回滾的版本。 運(yùn)維人員只需要配置好要發(fā)布的模塊即可。大大解放了運(yùn)維的工作量。同時(shí),各個(gè)業(yè)務(wù)線需要按照統(tǒng)一規(guī)范組織自己代碼結(jié)構(gòu)才能夠使用發(fā)布系統(tǒng)。
2. 設(shè)計(jì)原則
什么樣的系統(tǒng)更適合于汽車之家的業(yè)務(wù)? 首要要滿足不同業(yè)務(wù)線的不同項(xiàng)目類型的發(fā)布,這些類型包括.net項(xiàng)目、java web項(xiàng)目、windows計(jì)劃任務(wù)等。 其次,公司有大量的windows服務(wù)器, 發(fā)布系統(tǒng)需要同時(shí)支持windows和linux。最終我們選擇基于saltstack自動(dòng)化運(yùn)維配置工具設(shè)計(jì)開發(fā)發(fā)布系統(tǒng), 使用該工具的好處如下:
(1)python開發(fā),和運(yùn)維開發(fā)的技術(shù)棧一致。對(duì)于以后的擴(kuò)展,二次開發(fā)都很方便
(2)快速, 原生提供了http api支持
(3)支持windows
3. 發(fā)布系統(tǒng)架構(gòu)
3.1 發(fā)布系統(tǒng)的整體架構(gòu)
發(fā)布系統(tǒng)前端通過salt api與salt master進(jìn)行通信, 發(fā)布任務(wù)描述信息到salt master。salt master通過salt命令調(diào)用我們自己開發(fā)的模塊來完成一次發(fā)布任務(wù)。
3.2 發(fā)布系統(tǒng)與其他系統(tǒng)如何合作完成代碼發(fā)布
我們需要通過CI系統(tǒng)來打包代碼,通過配管系統(tǒng)來部署代碼運(yùn)行環(huán)境,如tomcat等等。通過CI以及配管系統(tǒng)提供的接口,我們?cè)诎l(fā)布系統(tǒng)中獲取到發(fā)布的版本和配置的tomcat信息
3.3 發(fā)布系統(tǒng)對(duì)上線流程的抽象
我們把一次上線流程抽象成以下四個(gè)階段
(1)準(zhǔn)備階段
(2)發(fā)布前階段
(3)發(fā)布階段
(4)發(fā)布后階段
為了支持不同發(fā)布類型和可擴(kuò)展性, 我們通過繼承抽象出不同的類來完成一次上線流程,如下所示:
4. 遇到的問題
作為重要的代碼發(fā)布系統(tǒng), 穩(wěn)定性上一定要有可靠的保證, 這樣才能讓業(yè)務(wù)方人員放心大膽的使用系統(tǒng)發(fā)布代碼。但是在發(fā)布系統(tǒng)的使用過程中我們也遇到了一些問題。
4.1 確保salt的穩(wěn)定性
由于pushguide是基于saltstack來完成代碼的發(fā)布,所以對(duì)saltstack的運(yùn)維又顯得很重要。在前期的使用的我們經(jīng)常遇到由于salt的問題導(dǎo)致發(fā)布系統(tǒng)出現(xiàn)不可用的情況。所以我們優(yōu)化了整個(gè)salt的架構(gòu)。通過使用多機(jī)房multi master來保證salt的穩(wěn)定性。關(guān)于salt的高可用方案,網(wǎng)絡(luò)上也有一些其他做法如加入代理層,重寫returner模塊等方法。但從效果看,目前的multi master可以滿足我們現(xiàn)在的發(fā)布需求。
4.2 代碼的規(guī)范
系統(tǒng)使用前期,由于業(yè)務(wù)方的代碼不夠規(guī)范,比如我們?cè)诂F(xiàn)實(shí)場(chǎng)景中會(huì)遇到有的業(yè)務(wù)方把業(yè)務(wù)代碼和日志文件放在一起,代碼目錄非常大,導(dǎo)致發(fā)布的失敗。所以對(duì)于發(fā)布系統(tǒng)的來說,我們不能僅僅是發(fā)布代碼, 同時(shí)可以制定代碼,目錄規(guī)范來約束業(yè)務(wù)方規(guī)范自己的代碼。
4.3 監(jiān)控
對(duì)于發(fā)布系統(tǒng)web服務(wù)的監(jiān)控自然是必不可少的, 同時(shí)我們還定時(shí)對(duì)接入發(fā)布系統(tǒng)的主機(jī)salt minion連通性進(jìn)行檢測(cè), 發(fā)現(xiàn)有salt minion不可用情況及時(shí)處理, 避免在發(fā)布時(shí)失敗的情況
5. 發(fā)布案例
下面以一次代碼發(fā)布為例, 詳細(xì)介紹發(fā)布系統(tǒng)的使用。
運(yùn)維人員登錄發(fā)布系統(tǒng),會(huì)根據(jù)權(quán)限展示運(yùn)維人員可以看到的發(fā)布模板。
進(jìn)入新建模板頁面, 填寫必要信息, 新建模塊。在模板類型選擇中可以選擇本次配置的是.net、java、windowd計(jì)劃任務(wù)等。
配置完成后,如果業(yè)務(wù)方有上線, 只要進(jìn)入發(fā)布頁面,選擇要發(fā)布的版本,點(diǎn)擊發(fā)布,就可以自助的發(fā)布代碼。
在發(fā)布頁面, 同時(shí)還可以看到上次發(fā)布的情況,已經(jīng)發(fā)布每個(gè)階段的情況。
業(yè)務(wù)方人員還可以在統(tǒng)計(jì)分析頁面查看自己的發(fā)布情況,包括發(fā)布時(shí)間,發(fā)布次數(shù),成功率等等。
6. 未來可以做的事
6.1 異步發(fā)布
目前發(fā)布系統(tǒng)的做法是同步發(fā)布, 點(diǎn)完發(fā)布后,頁面會(huì)阻塞在當(dāng)前。 未來我們把整個(gè)發(fā)布過程異構(gòu), 使整個(gè)發(fā)布過程的體驗(yàn)更加穩(wěn)定,流暢。
6.2 自動(dòng)回滾
我們可以為讓業(yè)務(wù)方人員選擇是否自動(dòng)回滾以及要回滾到的版本。 當(dāng)發(fā)布失敗時(shí), 執(zhí)行自動(dòng)回滾邏輯, 讓發(fā)布更加輕松智能。
6.3 對(duì)發(fā)布數(shù)據(jù)的應(yīng)用
通過統(tǒng)計(jì)業(yè)務(wù)方的發(fā)布情況, 我們可以規(guī)范業(yè)務(wù)方的發(fā)布行為。比如哪些時(shí)間段的發(fā)布成功率低,那些服務(wù)器總是發(fā)布失敗等等情況。通過這些數(shù)據(jù)分析, 幫助業(yè)務(wù)方提高上線的成功率和發(fā)布質(zhì)量。
6.4 可視化發(fā)布
以后我們可以做到上線的每個(gè)階段可視, 比如用流程圖展示出發(fā)布在哪個(gè)階段出了問題, 可以直接在該階段選擇是否回滾或其他操作等。
7. 小結(jié)
發(fā)布系統(tǒng)馬上要接入公司的所有業(yè)務(wù)線,這對(duì)我們來說是一個(gè)不小的挑戰(zhàn),如何優(yōu)化我們的系統(tǒng),提高系統(tǒng)的穩(wěn)定性,如何讓用戶體驗(yàn)更好,滿足更多需求,我們還有很長(zhǎng)的路要走。