文/蔡國(guó)華 魏麗麗 韓小博
移動(dòng)互聯(lián)網(wǎng)發(fā)展方興未艾,作為移動(dòng)互聯(lián)網(wǎng)入口的移動(dòng)應(yīng)用也成為各個(gè)互聯(lián)網(wǎng)企業(yè)競(jìng)爭(zhēng)激烈的必爭(zhēng)之地。這就對(duì)移動(dòng)應(yīng)用的迭代開發(fā)、測(cè)試、發(fā)布等一系列流程提出了更高的要求,在滿足基本功能性的前提下,還要求在安全可靠性、渠道并發(fā)性、信息時(shí)效性等方面都能夠緊跟市場(chǎng)變化。中國(guó)搜索移動(dòng)應(yīng)用類產(chǎn)品的開發(fā)采用敏捷開發(fā)的模式,在多版本迭代開發(fā)過程中,需要頻繁的進(jìn)行代碼集成、編譯、測(cè)試檢查、打包、發(fā)布部署等活動(dòng),如何將開發(fā)人員從頻繁的手工勞動(dòng)中解放出來,降低人工操作帶來的失誤,加快迭代速度,提高發(fā)布質(zhì)量就成為亟待解決的問題。經(jīng)過調(diào)研選型和實(shí)踐,中國(guó)搜索基于jenkins工具平臺(tái),研發(fā)設(shè)計(jì)了一套移動(dòng)應(yīng)用自動(dòng)化持續(xù)集成發(fā)布解決方案,該方案規(guī)范優(yōu)化了眾多環(huán)節(jié),集成了多種異構(gòu)工具及環(huán)境,實(shí)現(xiàn)了從代碼編譯到發(fā)布的自動(dòng)化。
持續(xù)集成是一種軟件開發(fā)實(shí)踐,是開發(fā)團(tuán)隊(duì)基于某種或者某些變化對(duì)系統(tǒng)進(jìn)行的經(jīng)常性的構(gòu)建活動(dòng),比如持續(xù)檢查、持續(xù)編譯、持續(xù)驗(yàn)證、持續(xù)部署、持續(xù)基礎(chǔ)設(shè)施、持續(xù)報(bào)告等。
通過持續(xù)集成,可以:
(1)解放勞動(dòng)力,減少手工操作的失誤率,通過持續(xù)集成,可以將編譯、審查、打包、部署等高頻度的重復(fù)性手工操作通過工具自動(dòng)化。
(2)更早的發(fā)現(xiàn)問題,通過持續(xù)對(duì)代碼進(jìn)行集成,可以更早的獲取變更,更早進(jìn)入測(cè)試,更早的發(fā)現(xiàn)問題,降低解決問題的成本。
(3)增強(qiáng)項(xiàng)目的可見性,持續(xù)集成使得軟件開發(fā)過程更加透明,持續(xù)集成系統(tǒng)可以實(shí)時(shí)提供構(gòu)建狀態(tài)和品質(zhì)。
(4)更快的交付成果,持續(xù)集成縮短了編譯、集成、測(cè)試、發(fā)布、部署各個(gè)環(huán)節(jié)的時(shí)間,使得交付更快捷。
(5)更高的產(chǎn)品質(zhì)量,可將代碼檢查等集成到工具中,通過持續(xù)集成對(duì)每次提交的代碼進(jìn)行檢查。
圖1 持續(xù)集成典型場(chǎng)景
一個(gè)完整的持續(xù)集成構(gòu)建系統(tǒng)應(yīng)該包括:
(1)代碼配置管理工具及恰當(dāng)?shù)陌姹究刂撇呗?,通過代碼配置管理工具保證代碼的可維護(hù)性和可追溯性,本方案使用subversion作為版本庫(kù)。
(2)定義編排好的構(gòu)建集成流程設(shè)計(jì),包括編譯、測(cè)試、分發(fā)、部署等。
(3)持續(xù)集成服務(wù)平臺(tái),實(shí)現(xiàn)重復(fù)工作的自動(dòng)化執(zhí)行,可持續(xù)實(shí)施預(yù)先定義編排的構(gòu)建流程設(shè)計(jì)。本方案使用Jenkins作為持續(xù)集成服務(wù)平臺(tái)。
Jenkins作為一款開源軟件,是基于java開發(fā)的持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,內(nèi)置功能強(qiáng)大,能完成常見的構(gòu)建任務(wù)。Jenkins有著豐富的插件庫(kù),可以根據(jù)業(yè)務(wù)需求定制開發(fā)構(gòu)建、測(cè)試、部署或其他自定義邏輯任務(wù),也可以進(jìn)行靜態(tài)檢查,在業(yè)界已得到廣泛認(rèn)可和使用。
圖2 持續(xù)集成流程框架
中國(guó)搜索移動(dòng)產(chǎn)品應(yīng)用采用敏捷開發(fā)的模式,已經(jīng)形成了一套標(biāo)準(zhǔn)的流程,將開發(fā)工作流程分為以下階段:編碼->構(gòu)建->集成->測(cè)試->交付->發(fā)布,通過借助工具平臺(tái)采用自動(dòng)化的方式在不同的開發(fā)階段實(shí)現(xiàn)持續(xù)集成、持續(xù)發(fā)布、持續(xù)部署。
持續(xù)集成:在開發(fā)過程中,開發(fā)人員頻繁的將工作副本合并到開發(fā)主干,每一次合并都是一次集成過程,通過持續(xù)集成可及時(shí)發(fā)現(xiàn)代碼錯(cuò)誤,避免偏離開發(fā)主線,實(shí)現(xiàn)產(chǎn)品高質(zhì)量的快速迭代.
持續(xù)交付:通過持續(xù)交付,可實(shí)現(xiàn)頻繁的將新版本交付給測(cè)試團(tuán)隊(duì)以供測(cè)試評(píng)審,測(cè)試評(píng)審?fù)ㄟ^,代碼即可進(jìn)入發(fā)布階段。
持續(xù)發(fā)布:一旦通過測(cè)試評(píng)審,通過持續(xù)部署可以自動(dòng)部署到線上生產(chǎn)環(huán)境,達(dá)到隨時(shí)隨地可發(fā)布應(yīng)用產(chǎn)品。
針對(duì)中國(guó)搜索移動(dòng)應(yīng)用的開發(fā)模式和實(shí)際需求,持續(xù)集成平臺(tái)整合了jira流程管理平臺(tái)與jenkins自動(dòng)化平臺(tái)。其中jira平臺(tái)用于進(jìn)行項(xiàng)目相關(guān)角色對(duì)項(xiàng)目信息及需求進(jìn)行提交,并進(jìn)行工作流程的審批流轉(zhuǎn)。Jenkins工具平臺(tái)采用了控制邏輯與構(gòu)建動(dòng)作分離的主從結(jié)構(gòu),jenkins主節(jié)點(diǎn)主要用于分解集成環(huán)節(jié),配置各流程步驟邏輯,任務(wù)分發(fā)等。Jenkins從節(jié)點(diǎn)主要用于對(duì)分發(fā)的任務(wù)進(jìn)行執(zhí)行,生成中間產(chǎn)出等。鑒于安卓移動(dòng)客戶端構(gòu)建環(huán)境涉及到的工具依賴較多,配置繁雜,將安卓構(gòu)建從節(jié)點(diǎn)環(huán)境進(jìn)行容器化實(shí)現(xiàn),方便后續(xù)的復(fù)制遷移和維護(hù)。
項(xiàng)目發(fā)布過程中涉及到眾多相關(guān)責(zé)任角色,包括:
產(chǎn)品經(jīng)理,其職責(zé)包括提交應(yīng)用信息、代碼版本、應(yīng)用版本、渠道分發(fā)信息、新版功能描述等。
測(cè)試人員,其職責(zé)涵蓋對(duì)生成應(yīng)用的功能性測(cè)試及集成測(cè)試。
項(xiàng)目負(fù)責(zé)人,對(duì)最終產(chǎn)品是否上線,上線時(shí)間點(diǎn)進(jìn)行最終決策。
圖3 集成系統(tǒng)整體架構(gòu)
質(zhì)量管理人,對(duì)整個(gè)流程進(jìn)行過程跟蹤,關(guān)注環(huán)節(jié)流轉(zhuǎn)狀態(tài),規(guī)范安全監(jiān)督等。
產(chǎn)品經(jīng)理使用jira平臺(tái)提交相關(guān)產(chǎn)品信息后,由Jenkins系統(tǒng)工具對(duì)各單元參數(shù)進(jìn)行base64編碼,避免參數(shù)傳遞解析問題。
Jenkins平臺(tái)獲取參數(shù)信息后,進(jìn)行解碼和參數(shù)適配,并傳遞給環(huán)節(jié)編排模塊,對(duì)整個(gè)構(gòu)建部署過程進(jìn)行流程編排。該模塊也負(fù)責(zé)工作節(jié)點(diǎn)各個(gè)分解環(huán)節(jié)的流轉(zhuǎn)及最終產(chǎn)出整合,定制化通知模塊負(fù)責(zé)對(duì)流程中的各個(gè)狀態(tài),異常等情況進(jìn)行及時(shí)通知告警。角色管理模塊負(fù)責(zé)對(duì)項(xiàng)目進(jìn)行必要的安全約束,對(duì)不同角色賦予相應(yīng)的平臺(tái)使用權(quán)限,同時(shí)該模塊也負(fù)責(zé)版本倉(cāng)庫(kù)具體路徑及密鑰配置,原則上該模塊由質(zhì)量管理人負(fù)責(zé)。
具體從節(jié)點(diǎn)使用構(gòu)建工具如下表:
構(gòu)建工具 版本 功能Openjdk 1.8 提供jenkins運(yùn)行環(huán)境支持與安卓java代碼編譯支持Build-tools 28.0 官方提供的安卓構(gòu)建輔助工具Gradle 5.3.1 自動(dòng)化構(gòu)建開源工具,用于解析安卓項(xiàng)目配置,整合構(gòu)建步驟sshd 跟隨系統(tǒng) 用于jenkins主從連接配置
經(jīng)過編排的具體任務(wù)被分發(fā)給jenkins工作節(jié)點(diǎn),進(jìn)行具體處理。工作節(jié)點(diǎn)職能主要包括:提供異構(gòu)環(huán)境基礎(chǔ)能力,完成客戶端構(gòu)建,第三方工具加固,渠道分發(fā)應(yīng)用生成,應(yīng)用簽名,壓縮封裝,規(guī)范化生產(chǎn)環(huán)境產(chǎn)出等。
根據(jù)中國(guó)搜索移動(dòng)客戶端產(chǎn)品開發(fā)的特性,移動(dòng)應(yīng)用的自動(dòng)化構(gòu)建發(fā)布分為兩個(gè)場(chǎng)景,一種是日常迭代開發(fā),另一種是產(chǎn)品的上線和多渠道發(fā)布,針對(duì)兩種應(yīng)用場(chǎng)景,分別設(shè)計(jì)了兩種構(gòu)建流程發(fā)布方案
2.3.1 日常迭代開發(fā)場(chǎng)景下的自動(dòng)構(gòu)建流程方案
日常迭代開發(fā)過程中,開發(fā)人員從源代碼主干獲取最新的代碼簽出到本地,編碼完成本地測(cè)試后,按照配置管理策略將本地副本簽入源碼主干,jenkins構(gòu)建平臺(tái)將自動(dòng)獲取到簽入動(dòng)作通知,依次按順序執(zhí)行代碼規(guī)范檢查、構(gòu)建、單元測(cè)試、打包、測(cè)試一系列動(dòng)作,在執(zhí)行過程中一旦發(fā)現(xiàn)錯(cuò)誤,將中止后續(xù)構(gòu)建過程,將錯(cuò)誤信息實(shí)時(shí)通知到開發(fā)人員,相關(guān)人員可在線實(shí)時(shí)查看執(zhí)行的過程,也可以繼續(xù)其他工作,系統(tǒng)將在執(zhí)行完畢后自動(dòng)發(fā)送執(zhí)行結(jié)果。
圖4 日常迭代開發(fā)場(chǎng)景下的自動(dòng)構(gòu)建流程方案
2.3.2 產(chǎn)品的正式上線和多渠道發(fā)布流程方案
基于測(cè)試評(píng)審?fù)ㄟ^的代碼版本,按計(jì)劃或需求可進(jìn)行產(chǎn)品的正式上線和更新發(fā)布,日常因運(yùn)營(yíng)活動(dòng)推廣的需要,也有多渠道發(fā)布的需求,發(fā)布到生產(chǎn)環(huán)境提供給用戶使用的產(chǎn)品,在日常構(gòu)建的基礎(chǔ)上,還需要考慮安全因素,防止出現(xiàn)移動(dòng)應(yīng)用被脫殼篡改,植入廣告或其他惡意操作的情況,危機(jī)用戶信息安全,影響使用體驗(yàn),因此引入第三方加固工具對(duì)安裝包進(jìn)行加固操作,加固后的應(yīng)用包已進(jìn)行了混淆加密壓縮,具備較高的安全性。針對(duì)眾多應(yīng)用市場(chǎng)和第三方推廣渠道,在發(fā)布應(yīng)用時(shí)需要對(duì)應(yīng)用包進(jìn)行渠道標(biāo)記,用戶在不同市場(chǎng)和推廣渠道安裝的應(yīng)用可以通過統(tǒng)計(jì)接口進(jìn)行計(jì)量,按照渠道維度進(jìn)行統(tǒng)計(jì),對(duì)移動(dòng)應(yīng)用的推廣效果,有效活躍用戶數(shù)量,用戶使用習(xí)慣等進(jìn)行收集,以便產(chǎn)品人員進(jìn)一步分析用戶行為,進(jìn)行產(chǎn)品優(yōu)化。應(yīng)用簽名作為安卓應(yīng)用的規(guī)范之一,主要用于應(yīng)用基本信息標(biāo)注,其中簽名也在一定程度上提供了防篡改功能。本方案利用key-store和簽名密鑰實(shí)現(xiàn)了應(yīng)用包的批量自動(dòng)化簽名步驟,進(jìn)一步完善了應(yīng)用客戶端發(fā)布包的規(guī)范信息。加固簽名后的應(yīng)用包還需要經(jīng)過人工測(cè)試驗(yàn)證和審批流程方能發(fā)布到生產(chǎn)環(huán)境提供給用戶使用。
圖5 產(chǎn)品的正式上線和多渠道發(fā)布流程方案
基于jenkins平臺(tái)強(qiáng)大的基礎(chǔ)能力和靈活的擴(kuò)展性,中國(guó)搜索設(shè)計(jì)了移動(dòng)應(yīng)用開發(fā)項(xiàng)目的自動(dòng)化構(gòu)建部署流程,涉及到代碼構(gòu)建、渠道分發(fā)標(biāo)記、第三方加固、文件規(guī)范化、自動(dòng)批量簽名等步驟,整個(gè)流程體現(xiàn)了自動(dòng)化特點(diǎn),并將項(xiàng)目相關(guān)角色和任務(wù)職責(zé)有機(jī)融合在流轉(zhuǎn)的各個(gè)環(huán)節(jié),降低了相關(guān)人員溝通成本,并使得從項(xiàng)目構(gòu)建到最終部署的環(huán)節(jié)操作都有歷史留存,方便追溯,既滿足了日常開發(fā)項(xiàng)目的快速集成的需求,也保證了生產(chǎn)環(huán)境的穩(wěn)定快速發(fā)布。