全自動(dòng)化的 Android 編譯管線

【編者按】Nicolas Frankel 是 hybris 的高級(jí)顧問(wèn)琐簇, 在Java / J2EE 領(lǐng)域擁有超過(guò)10年的管理經(jīng)驗(yàn),本文闡述了他在使用自動(dòng)化工序去構(gòu)建 Android 應(yīng)用程序遇到的一些難題,大家不妨讀讀,希望能有所收獲蛋济。

以下系譯文:

在我目前的工作中,我必須使用一些自動(dòng)化工序去構(gòu)建 Android 應(yīng)用程序炮叶。這篇文章的目的就是描述我所遇到的難題碗旅,避免讀者在這個(gè)過(guò)程浪費(fèi)更多時(shí)間。目的就是分享我在這一過(guò)程中所遇到的困難镜悉,為讀者提供前車(chē)之鑒祟辟,從而節(jié)省寶貴的時(shí)間。

環(huán)境搭建如下:

  • 使用 Puppet 搭建基礎(chǔ)設(shè)施
  • 使用 Jenkins 搭建 CI 服務(wù)器
  • 工程文件
  • 來(lái)構(gòu)建主體
  • 作為主要測(cè)試工具

Puppet and Jenkins

全自動(dòng)化的 Android 編譯管線
全自動(dòng)化的 Android 編譯管線

事實(shí)上侣肄,我的準(zhǔn)備工作已經(jīng)相當(dāng)完備旧困。同事們已經(jīng)使 Jenkins 服務(wù)器可以自動(dòng)安裝,以及準(zhǔn)備好了所需的軟件包——包括 Java 和已提供的可復(fù)用的 Puppet 類茫孔。Jenkins 的工作完全依賴于一個(gè)單一 config.xm 文件叮喳,即不同部分的封裝被芳。每部分都由一個(gè)專門(mén)的模板處理缰贝。因此,在我看來(lái)畔濒,創(chuàng)建一個(gè)簡(jiǎn)單的 Gradle 任務(wù)就如同在公園里散步一般輕松剩晴,最多幾天時(shí)間便可以完成。

第一步非常容易:只需一個(gè)最新版 Puppet 清單侵状,能幫助你添加 Gradle 插件到 Jenkins 服務(wù)器赞弥。

The Gradle wrapper

如果你是我博客的忠實(shí)讀者,那你大概知道我對(duì) Gradle 的看法趣兄。不過(guò)绽左,我必須得承認(rèn),Maven 的確缺乏這種兼容性艇潭,即不論安裝哪個(gè)版本的工具都確保編譯成功——雖然它應(yīng)該具備該功能拼窥。為了實(shí)現(xiàn)這一目標(biāo)戏蔑,Gradle 通過(guò)提供一個(gè) JAR、一個(gè) shell 腳本和一個(gè)屬性文件鲁纠,屬性文件還包含了從 URL 到 Gradle ZIP 的分發(fā)总棵,組裝成所謂的包裝機(jī)制。這三個(gè)需求都被存儲(chǔ)在 SCM 中改含。

然而這正是麻煩的開(kāi)始情龄。在一個(gè)企業(yè)環(huán)境中進(jìn)行下載,意味著要通過(guò)和驗(yàn)證代理捍壤。最簡(jiǎn)單的選擇莫過(guò)于在工作配置下設(shè)置好一切骤视,包括代理憑證。然而白群,從安全的角度來(lái)看尚胞,這樣的做法并不理想,因?yàn)槿魏稳嗽L問(wèn) Jenkins 接口或文件系統(tǒng)帜慢,都能夠讀取這些憑據(jù)笼裳。顯然,我們需要一個(gè)更好的方式粱玲。

用戶已經(jīng)擁有了配置代理完備的 Nexus 庫(kù)躬柬。上傳所需的 Gradle 分布,并更新指向它的 gradle.properties抽减,簡(jiǎn)直易如反掌允青。

The Android SDK

全自動(dòng)化的 Android 編譯管線
全自動(dòng)化的 Android 編譯管線

Android SDK 只是一個(gè) ZIP 文件。我用同樣的方法:先下載文件然后將其上傳到 Nexus卵沉。這一步之后颠锉,一個(gè) Puppet 腳本會(huì)負(fù)責(zé)下載、提取史汗,并為它設(shè)置正確的權(quán)限琼掠。

然而,事情并沒(méi)有想象的那么簡(jiǎn)單停撞。Android 開(kāi)發(fā)者都知道瓷蛙,Android SDK 需要手動(dòng)操作:開(kāi)發(fā)者必須手動(dòng)檢查所需平臺(tái)和工具,并將其下載在本地文件系統(tǒng)戈毒。這看上去很簡(jiǎn)單不是嗎艰猬,但如果轉(zhuǎn)為自動(dòng)操作則會(huì)讓很多開(kāi)發(fā)者頭疼,盡管有一個(gè)命令行相當(dāng)于可以通過(guò) SDK「帶有 --no-ui 參數(shù)」來(lái)安裝/更新包埋市。如果你想了解更多冠桃,請(qǐng)點(diǎn)擊這里

谷歌工程師未能提供的兩個(gè)重要參數(shù):

  • Proxy credentials – login/password
  • Accepting license agreements

為了解決這一問(wèn)題道宅,網(wǎng)上有很多蹩腳的方案食听,最誘人的應(yīng)該要數(shù)配置文件了套么,但我卻發(fā)現(xiàn)它們沒(méi)多大用。然而碳蛋,通過(guò) expect 命令的使用胚泌,我反而發(fā)現(xiàn)了一種創(chuàng)造性的解決辦法。Expect 是一個(gè)漂亮的命令肃弟,用來(lái)讀取標(biāo)準(zhǔn)輸出玷室,并用標(biāo)準(zhǔn)輸入進(jìn)行相應(yīng)的填寫(xiě)。值得一提的是笤受,它竟然還可以接受正則表達(dá)式穷缤。所以,在請(qǐng)求代理登錄時(shí)箩兽,你鍵入登錄名津肛、填寫(xiě)密碼,當(dāng)它要求許可證接受時(shí)汗贫,你鍵入「同意」就能輕松搞定身坐。雖然我反復(fù)多次試驗(yàn),歷經(jīng)很多錯(cuò)誤落包,才達(dá)到預(yù)期結(jié)果部蛇。但這個(gè)方法非常簡(jiǎn)單、直接咐蝇。

我最初的設(shè)計(jì)是涯鲁,使所有可能用到的裝有 Puppet 的 Android 包,成為服務(wù)器配置的一部分有序。在標(biāo)準(zhǔn)化操作中「如文件創(chuàng)建或系統(tǒng)包安裝」抹腿,Puppet 可以確定這項(xiàng)配置是否必要。例如:如果某文件已經(jīng)存在旭寿,那就沒(méi)有必要再重復(fù)創(chuàng)建了警绩。在最后的 Log 中,Puppet 會(huì)報(bào)告它執(zhí)行的每一個(gè)操作许师。起初房蝉,我試圖通過(guò)在配置過(guò)程中僚匆,人為地告訴 Puppet 哪個(gè)包是已配置的微渠,因?yàn)?Android SDK 為每個(gè)包都創(chuàng)建一個(gè)文件夾。但要命的是咧擂,Puppet 只接受單一文件夾來(lái)驗(yàn)證逞盆。對(duì)于某些包來(lái)說(shuō),并沒(méi)有任何版本信息「例如 Google 游戲服務(wù)」松申。

因此云芦,一個(gè)同事提出將 Puppet 配置的更新俯逾,移動(dòng)到每個(gè)任務(wù)的預(yù)先步驟中。這樣能修復(fù)非冪等問(wèn)題舅逸,同時(shí)桌肴,還能在每個(gè)任務(wù)中更新所需配置。

Robolectric

全自動(dòng)化的 Android 編譯管線
全自動(dòng)化的 Android 編譯管線

說(shuō)到這里琉历,我本以為一切都搞定了坠七。但非常不幸,并不是這么回事旗笔,就因?yàn)檫@個(gè)庫(kù)—— Robolectric彪置。

此前,我對(duì) Robolectric 沒(méi)什么了解蝇恶,只知道這是一個(gè)測(cè)試庫(kù)拳魁,能夠在 Android 上運(yùn)行測(cè)試,而無(wú)需任何物理設(shè)備的連接撮弧。在 Jenkins 上試圖編譯時(shí)潘懊,我偶然發(fā)現(xiàn)了一個(gè)「有意思」的問(wèn)題:盡管 Roboletric 提供了一個(gè)具有完整依賴性的 POM, 但 MavenDependencyResolver 類硬編碼庫(kù)應(yīng)該從哪里下載贿衍?

唯一的解決辦法是通過(guò)擴(kuò)展上面的類來(lái)實(shí)現(xiàn)卦尊。我用的就是上面提到的企業(yè) Nexus 庫(kù)。

上傳并發(fā)布任務(wù)

為了實(shí)現(xiàn)前面的任務(wù)舌厨,我只需添加一個(gè)自定義 Gradle 任務(wù)岂却,從 settings.xml 得到 Nexus 設(shè)置「由 Puppet 調(diào)配」∪雇郑基于此躏哩,我成功地上傳了任務(wù)。最后揉燃,對(duì)于每個(gè)任務(wù)執(zhí)行的型號(hào)扫尺,我添加到所上傳的工件集的輸出文件中。因此炊汤,不管編譯文件是哪種型號(hào)配置正驻,下面的命令都將只上傳 XXX 和 YYY:

 ./gradlew assembleXXX assembleYYY upload

上面的任務(wù)都搞定了,那發(fā)布豈不是更簡(jiǎn)單:唯一需要的就是設(shè)置 Gradle 插件抢腐,它添加了一個(gè)發(fā)布任務(wù)姑曙,類似于 Maven 的 deploy。

結(jié)束語(yǔ)

作為后端開(kāi)發(fā)人員迈倍,我已經(jīng)習(xí)慣于持續(xù)集成設(shè)置伤靠,毫無(wú)疑問(wèn),我可以在幾天內(nèi)搞定 Android CI 的進(jìn)程啼染。對(duì)于 Android 系統(tǒng)在 CI 上的欠缺宴合,我覺(jué)得不可思議焕梅。每一步都苦不堪言,糟糕的記錄「如果有的話」和解決方案似乎更像黑客般具有破壞性卦洽。如果你想沿著這條路走下去贞言。吶,別說(shuō)我沒(méi)告訴你……Good Luck阀蒂!

原文鏈接: Fully Automated Android Build

本文系 OneAPM 工程師編譯整理蜗字。OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè),能幫助企業(yè)用戶和開(kāi)發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語(yǔ)句的實(shí)時(shí)抓取脂新。想閱讀更多技術(shù)文章挪捕,請(qǐng)?jiān)L問(wèn) OneAPM 官方博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末争便,一起剝皮案震驚了整個(gè)濱河市级零,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滞乙,老刑警劉巖奏纪,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斩启,居然都是意外死亡序调,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)兔簇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)发绢,“玉大人,你說(shuō)我怎么就攤上這事垄琐”呔疲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵狸窘,是天一觀的道長(zhǎng)墩朦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)翻擒,這世上最難降的妖魔是什么氓涣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮陋气,結(jié)果婚禮上劳吠,老公的妹妹穿的比我還像新娘。我一直安慰自己恩伺,他們只是感情好赴背,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布椰拒。 她就那樣靜靜地躺著晶渠,像睡著了一般凰荚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上褒脯,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天便瑟,我揣著相機(jī)與錄音,去河邊找鬼番川。 笑死到涂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颁督。 我是一名探鬼主播践啄,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沉御!你這毒婦竟也來(lái)了屿讽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吠裆,失蹤者是張志新(化名)和其女友劉穎伐谈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體试疙,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诵棵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祝旷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片履澳。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怀跛,靈堂內(nèi)的尸體忽然破棺而出奇昙,到底是詐尸還是另有隱情,我是刑警寧澤敌完,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布储耐,位于F島的核電站,受9級(jí)特大地震影響滨溉,放射性物質(zhì)發(fā)生泄漏什湘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一晦攒、第九天 我趴在偏房一處隱蔽的房頂上張望闽撤。 院中可真熱鬧,春花似錦脯颜、人聲如沸哟旗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闸餐。三九已至饱亮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舍沙,已是汗流浹背近上。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拂铡,地道東北人壹无。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像感帅,于是被迫代替她去往敵國(guó)和親斗锭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容