全自動化的 Android 編譯管線

【編者按】Nicolas Frankel 是 hybris 的高級顧問, 在Java / J2EE 領域擁有超過10年的管理經驗,本文闡述了他在使用自動化工序去構建 Android 應用程序遇到的一些難題,大家不妨讀讀,希望能有所收獲。

以下系譯文:

在我目前的工作中,我必須使用一些自動化工序去構建 Android 應用程序。這篇文章的目的就是描述我所遇到的難題,避免讀者在這個過程浪費更多時間。目的就是分享我在這一過程中所遇到的困難,為讀者提供前車之鑒,從而節省寶貴的時間。

環境搭建如下:

  • 使用 Puppet 搭建基礎設施
  • 使用 Jenkins 搭建 CI 服務器
  • 工程文件
  • 來構建主體
  • 作為主要測試工具

Puppet and Jenkins

全自動化的 Android 編譯管線
全自動化的 Android 編譯管線

事實上,我的準備工作已經相當完備。同事們已經使 Jenkins 服務器可以自動安裝,以及準備好了所需的軟件包——包括 Java 和已提供的可復用的 Puppet 類。Jenkins 的工作完全依賴于一個單一 config.xm 文件,即不同部分的封裝。每部分都由一個專門的模板處理。因此,在我看來,創建一個簡單的 Gradle 任務就如同在公園里散步一般輕松,最多幾天時間便可以完成。

第一步非常容易:只需一個最新版 Puppet 清單,能幫助你添加 Gradle 插件到 Jenkins 服務器。

The Gradle wrapper

如果你是我博客的忠實讀者,那你大概知道我對 Gradle 的看法。不過,我必須得承認,Maven 的確缺乏這種兼容性,即不論安裝哪個版本的工具都確保編譯成功——雖然它應該具備該功能。為了實現這一目標,Gradle 通過提供一個 JAR、一個 shell 腳本和一個屬性文件,屬性文件還包含了從 URL 到 Gradle ZIP 的分發,組裝成所謂的包裝機制。這三個需求都被存儲在 SCM 中。

然而這正是麻煩的開始。在一個企業環境中進行下載,意味著要通過和驗證代理。最簡單的選擇莫過于在工作配置下設置好一切,包括代理憑證。然而,從安全的角度來看,這樣的做法并不理想,因為任何人訪問 Jenkins 接口或文件系統,都能夠讀取這些憑據。顯然,我們需要一個更好的方式。

用戶已經擁有了配置代理完備的 Nexus 庫。上傳所需的 Gradle 分布,并更新指向它的 gradle.properties,簡直易如反掌。

The Android SDK

全自動化的 Android 編譯管線
全自動化的 Android 編譯管線

Android SDK 只是一個 ZIP 文件。我用同樣的方法:先下載文件然后將其上傳到 Nexus。這一步之后,一個 Puppet 腳本會負責下載、提取,并為它設置正確的權限。

然而,事情并沒有想象的那么簡單。Android 開發者都知道,Android SDK 需要手動操作:開發者必須手動檢查所需平臺和工具,并將其下載在本地文件系統。這看上去很簡單不是嗎,但如果轉為自動操作則會讓很多開發者頭疼,盡管有一個命令行相當于可以通過 SDK「帶有 --no-ui 參數」來安裝/更新包。如果你想了解更多,請點擊這里

谷歌工程師未能提供的兩個重要參數:

  • Proxy credentials – login/password
  • Accepting license agreements

為了解決這一問題,網上有很多蹩腳的方案,最誘人的應該要數配置文件了,但我卻發現它們沒多大用。然而,通過 expect 命令的使用,我反而發現了一種創造性的解決辦法。Expect 是一個漂亮的命令,用來讀取標準輸出,并用標準輸入進行相應的填寫。值得一提的是,它竟然還可以接受正則表達式。所以,在請求代理登錄時,你鍵入登錄名、填寫密碼,當它要求許可證接受時,你鍵入「同意」就能輕松搞定。雖然我反復多次試驗,歷經很多錯誤,才達到預期結果。但這個方法非常簡單、直接。

我最初的設計是,使所有可能用到的裝有 Puppet 的 Android 包,成為服務器配置的一部分。在標準化操作中「如文件創建或系統包安裝」,Puppet 可以確定這項配置是否必要。例如:如果某文件已經存在,那就沒有必要再重復創建了。在最后的 Log 中,Puppet 會報告它執行的每一個操作。起初,我試圖通過在配置過程中,人為地告訴 Puppet 哪個包是已配置的,因為 Android SDK 為每個包都創建一個文件夾。但要命的是,Puppet 只接受單一文件夾來驗證。對于某些包來說,并沒有任何版本信息「例如 Google 游戲服務」。

因此,一個同事提出將 Puppet 配置的更新,移動到每個任務的預先步驟中。這樣能修復非冪等問題,同時,還能在每個任務中更新所需配置。

Robolectric

全自動化的 Android 編譯管線
全自動化的 Android 編譯管線

說到這里,我本以為一切都搞定了。但非常不幸,并不是這么回事,就因為這個庫—— Robolectric。

此前,我對 Robolectric 沒什么了解,只知道這是一個測試庫,能夠在 Android 上運行測試,而無需任何物理設備的連接。在 Jenkins 上試圖編譯時,我偶然發現了一個「有意思」的問題:盡管 Roboletric 提供了一個具有完整依賴性的 POM, 但 MavenDependencyResolver 類硬編碼庫應該從哪里下載?

唯一的解決辦法是通過擴展上面的類來實現。我用的就是上面提到的企業 Nexus 庫。

上傳并發布任務

為了實現前面的任務,我只需添加一個自定義 Gradle 任務,從 settings.xml 得到 Nexus 設置「由 Puppet 調配」。基于此,我成功地上傳了任務。最后,對于每個任務執行的型號,我添加到所上傳的工件集的輸出文件中。因此,不管編譯文件是哪種型號配置,下面的命令都將只上傳 XXX 和 YYY:

 ./gradlew assembleXXX assembleYYY upload

上面的任務都搞定了,那發布豈不是更簡單:唯一需要的就是設置 Gradle 插件,它添加了一個發布任務,類似于 Maven 的 deploy。

結束語

作為后端開發人員,我已經習慣于持續集成設置,毫無疑問,我可以在幾天內搞定 Android CI 的進程。對于 Android 系統在 CI 上的欠缺,我覺得不可思議。每一步都苦不堪言,糟糕的記錄「如果有的話」和解決方案似乎更像黑客般具有破壞性。如果你想沿著這條路走下去。吶,別說我沒告訴你……Good Luck!

原文鏈接: Fully Automated Android Build

本文系 OneAPM 工程師編譯整理。OneAPM 是應用性能管理領域的新興領軍企業,能幫助企業用戶和開發者輕松實現:緩慢的程序代碼和 SQL 語句的實時抓取。想閱讀更多技術文章,請訪問 OneAPM 官方博客

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容