文/蔡國華 魏麗麗 韓小博
移動互聯網發展方興未艾,作為移動互聯網入口的移動應用也成為各個互聯網企業競爭激烈的必爭之地。這就對移動應用的迭代開發、測試、發布等一系列流程提出了更高的要求,在滿足基本功能性的前提下,還要求在安全可靠性、渠道并發性、信息時效性等方面都能夠緊跟市場變化。中國搜索移動應用類產品的開發采用敏捷開發的模式,在多版本迭代開發過程中,需要頻繁的進行代碼集成、編譯、測試檢查、打包、發布部署等活動,如何將開發人員從頻繁的手工勞動中解放出來,降低人工操作帶來的失誤,加快迭代速度,提高發布質量就成為亟待解決的問題。經過調研選型和實踐,中國搜索基于jenkins工具平臺,研發設計了一套移動應用自動化持續集成發布解決方案,該方案規范優化了眾多環節,集成了多種異構工具及環境,實現了從代碼編譯到發布的自動化。
持續集成是一種軟件開發實踐,是開發團隊基于某種或者某些變化對系統進行的經常性的構建活動,比如持續檢查、持續編譯、持續驗證、持續部署、持續基礎設施、持續報告等。
通過持續集成,可以:
(1)解放勞動力,減少手工操作的失誤率,通過持續集成,可以將編譯、審查、打包、部署等高頻度的重復性手工操作通過工具自動化。
(2)更早的發現問題,通過持續對代碼進行集成,可以更早的獲取變更,更早進入測試,更早的發現問題,降低解決問題的成本。
(3)增強項目的可見性,持續集成使得軟件開發過程更加透明,持續集成系統可以實時提供構建狀態和品質。
(4)更快的交付成果,持續集成縮短了編譯、集成、測試、發布、部署各個環節的時間,使得交付更快捷。
(5)更高的產品質量,可將代碼檢查等集成到工具中,通過持續集成對每次提交的代碼進行檢查。

圖1 持續集成典型場景
一個完整的持續集成構建系統應該包括:
(1)代碼配置管理工具及恰當的版本控制策略,通過代碼配置管理工具保證代碼的可維護性和可追溯性,本方案使用subversion作為版本庫。
(2)定義編排好的構建集成流程設計,包括編譯、測試、分發、部署等。
(3)持續集成服務平臺,實現重復工作的自動化執行,可持續實施預先定義編排的構建流程設計。本方案使用Jenkins作為持續集成服務平臺。
Jenkins作為一款開源軟件,是基于java開發的持續集成工具,用于監控持續重復的工作,內置功能強大,能完成常見的構建任務。Jenkins有著豐富的插件庫,可以根據業務需求定制開發構建、測試、部署或其他自定義邏輯任務,也可以進行靜態檢查,在業界已得到廣泛認可和使用。

圖2 持續集成流程框架
中國搜索移動產品應用采用敏捷開發的模式,已經形成了一套標準的流程,將開發工作流程分為以下階段:編碼->構建->集成->測試->交付->發布,通過借助工具平臺采用自動化的方式在不同的開發階段實現持續集成、持續發布、持續部署。
持續集成:在開發過程中,開發人員頻繁的將工作副本合并到開發主干,每一次合并都是一次集成過程,通過持續集成可及時發現代碼錯誤,避免偏離開發主線,實現產品高質量的快速迭代.
持續交付:通過持續交付,可實現頻繁的將新版本交付給測試團隊以供測試評審,測試評審通過,代碼即可進入發布階段。
持續發布:一旦通過測試評審,通過持續部署可以自動部署到線上生產環境,達到隨時隨地可發布應用產品。
針對中國搜索移動應用的開發模式和實際需求,持續集成平臺整合了jira流程管理平臺與jenkins自動化平臺。其中jira平臺用于進行項目相關角色對項目信息及需求進行提交,并進行工作流程的審批流轉。Jenkins工具平臺采用了控制邏輯與構建動作分離的主從結構,jenkins主節點主要用于分解集成環節,配置各流程步驟邏輯,任務分發等。Jenkins從節點主要用于對分發的任務進行執行,生成中間產出等。鑒于安卓移動客戶端構建環境涉及到的工具依賴較多,配置繁雜,將安卓構建從節點環境進行容器化實現,方便后續的復制遷移和維護。
項目發布過程中涉及到眾多相關責任角色,包括:
產品經理,其職責包括提交應用信息、代碼版本、應用版本、渠道分發信息、新版功能描述等。
測試人員,其職責涵蓋對生成應用的功能性測試及集成測試。
項目負責人,對最終產品是否上線,上線時間點進行最終決策。

圖3 集成系統整體架構
質量管理人,對整個流程進行過程跟蹤,關注環節流轉狀態,規范安全監督等。
產品經理使用jira平臺提交相關產品信息后,由Jenkins系統工具對各單元參數進行base64編碼,避免參數傳遞解析問題。
Jenkins平臺獲取參數信息后,進行解碼和參數適配,并傳遞給環節編排模塊,對整個構建部署過程進行流程編排。該模塊也負責工作節點各個分解環節的流轉及最終產出整合,定制化通知模塊負責對流程中的各個狀態,異常等情況進行及時通知告警。角色管理模塊負責對項目進行必要的安全約束,對不同角色賦予相應的平臺使用權限,同時該模塊也負責版本倉庫具體路徑及密鑰配置,原則上該模塊由質量管理人負責。
具體從節點使用構建工具如下表:

構建工具 版本 功能Openjdk 1.8 提供jenkins運行環境支持與安卓java代碼編譯支持Build-tools 28.0 官方提供的安卓構建輔助工具Gradle 5.3.1 自動化構建開源工具,用于解析安卓項目配置,整合構建步驟sshd 跟隨系統 用于jenkins主從連接配置
經過編排的具體任務被分發給jenkins工作節點,進行具體處理。工作節點職能主要包括:提供異構環境基礎能力,完成客戶端構建,第三方工具加固,渠道分發應用生成,應用簽名,壓縮封裝,規范化生產環境產出等。
根據中國搜索移動客戶端產品開發的特性,移動應用的自動化構建發布分為兩個場景,一種是日常迭代開發,另一種是產品的上線和多渠道發布,針對兩種應用場景,分別設計了兩種構建流程發布方案
2.3.1 日常迭代開發場景下的自動構建流程方案
日常迭代開發過程中,開發人員從源代碼主干獲取最新的代碼簽出到本地,編碼完成本地測試后,按照配置管理策略將本地副本簽入源碼主干,jenkins構建平臺將自動獲取到簽入動作通知,依次按順序執行代碼規范檢查、構建、單元測試、打包、測試一系列動作,在執行過程中一旦發現錯誤,將中止后續構建過程,將錯誤信息實時通知到開發人員,相關人員可在線實時查看執行的過程,也可以繼續其他工作,系統將在執行完畢后自動發送執行結果。

圖4 日常迭代開發場景下的自動構建流程方案
2.3.2 產品的正式上線和多渠道發布流程方案
基于測試評審通過的代碼版本,按計劃或需求可進行產品的正式上線和更新發布,日常因運營活動推廣的需要,也有多渠道發布的需求,發布到生產環境提供給用戶使用的產品,在日常構建的基礎上,還需要考慮安全因素,防止出現移動應用被脫殼篡改,植入廣告或其他惡意操作的情況,危機用戶信息安全,影響使用體驗,因此引入第三方加固工具對安裝包進行加固操作,加固后的應用包已進行了混淆加密壓縮,具備較高的安全性。針對眾多應用市場和第三方推廣渠道,在發布應用時需要對應用包進行渠道標記,用戶在不同市場和推廣渠道安裝的應用可以通過統計接口進行計量,按照渠道維度進行統計,對移動應用的推廣效果,有效活躍用戶數量,用戶使用習慣等進行收集,以便產品人員進一步分析用戶行為,進行產品優化。應用簽名作為安卓應用的規范之一,主要用于應用基本信息標注,其中簽名也在一定程度上提供了防篡改功能。本方案利用key-store和簽名密鑰實現了應用包的批量自動化簽名步驟,進一步完善了應用客戶端發布包的規范信息。加固簽名后的應用包還需要經過人工測試驗證和審批流程方能發布到生產環境提供給用戶使用。

圖5 產品的正式上線和多渠道發布流程方案
基于jenkins平臺強大的基礎能力和靈活的擴展性,中國搜索設計了移動應用開發項目的自動化構建部署流程,涉及到代碼構建、渠道分發標記、第三方加固、文件規范化、自動批量簽名等步驟,整個流程體現了自動化特點,并將項目相關角色和任務職責有機融合在流轉的各個環節,降低了相關人員溝通成本,并使得從項目構建到最終部署的環節操作都有歷史留存,方便追溯,既滿足了日常開發項目的快速集成的需求,也保證了生產環境的穩定快速發布。