使用 Jenkins 實現Android自動化打包和踩坑經歷

每當有項目做的過程中,測試需要做單元測試,每次手動的切換生產和測試環境,切換各種推送、統計和第三方賬號相當的麻煩,同時還需要暫存代碼,切換分支深的太過繁瑣。此時如果將項目配置自動化打包了,那麼就可以將這些問題解決了。我們來看一下Jenkins的配置流程。

1.下載 Jenkins

Jenkins 官網下載地址:https://jenkins.io/download/,選擇你電腦對應你的操作系統的版本
Jenkins 下載截圖

2.安裝 Jenkins 

 下載後直接安裝就行,下一步就行。安裝好你的默認瀏覽器會自動彈出窗口鏈接:http://localhost:8080
入門

如圖,路徑都給了就不用多說了,找到對應文件把裏面的密碼複製粘貼上去。繼續。
新手入門 

安裝插件。我們只用到2個插件,選擇安裝就好了。找到Gradle和Git,勾選後安裝,相關的依賴插件會自動安裝的。
下面幾步就不截圖了,並不是必要過程。
然後會讓你創建管理員賬號,選擇繼續使用admin就行。
繼續,讓你配置路徑,也跳過就行。
已就緒,開始使用。
說明:如果上述安裝插件的地方你沒有安裝需要的Gradle和Git插件,你也可以進入 Jenkins 環境頁面後選擇[系統管理] - [管理插件] - [可選插件],然後去找/搜到對應插件安裝。

特別注意:這裏就是本地配置一下試試,服務器上肯定是該創建賬號、配置路徑、安裝需要的別的插件balabala。

3.配置 Jenkins

全局工具配置

配置需要的插件信息 配置JDK、Git、Gradle:
配置JDK信息

我的JDK路徑當初安裝的時候不規範,打碼是爲了防止誤導。
Git配置 

 Git貌似不能自動安裝,貌似默認的不改動也能用。有興趣可以試試。
Gradle配置

Gradle配置同上,沒啥好說的。
劃重點 -- Android SDK需要另行配置,見下圖
系統配置 

環境變量
[系統管理] - [系統設置] - [全局屬性] - [環境變量],對應圖去找,添加環境變量,鍵爲“ANDROID_HOME”,值指向SDK目錄。
以上,配置完成。

4.新建任務並配置 

新建任務
自由風格

 選擇自由風格,確定。
基本信息
基本信息裏點擊右下角高級有個“使用自定義的工作空間”,勾選可以指定目錄,不勾選默認在 Jenkins 安裝目錄下的 “workspace” 文件夾裏。

源碼管理
源碼管理選擇Git,URL填入你的項目地址,沒有認證的時候會報錯,點擊圖中圈出的“Add”,彈出下圖:
Add

添加憑證後下拉選擇對應憑證,如果正確則不會報錯,同時下方展示檢出分支。默認master分支,可以自己看情況指定某分支。
構建觸發器不用管。
構建 

構建2
Tasks是構建執行的語句,一般都是“app:clean app:assembleRelease”,先clean再build。
構建後操作看需求,可以實現自動上傳apk到蒲公英/fir、郵件通知等等。

5.構建

構建

點擊立即構建後會出現下圖進度展示條。
構建後進度條
成功失敗
藍色正常,build成功。紅色表明構建失敗,鼠標移動右側有個向下箭頭,點擊展開選項,點擊控制檯輸出可以查看錯誤。

6.參數化構建 

構建時可選參數,這樣就可以打出不同參數的包。比如不同baseUrl。
參數化構建

[添加參數] - [選項參數],或者你願意用某種參數都行。
選項參數
參數化構建配置上了,需要在構建時將參數映射到代碼中,如下圖: 

導入代碼
以上, Jenkins 上的參數化構建配置完成。我們還需要在代碼中接收該參數。
參數會映射到gradle.properties文件中的對應參數名,我們先在該文件中定義一個參數並賦默認值:

baseUrl = "http://qa-xxxxxx.com/api/"

然後在build.gradle中獲取該參數並添加到BuildConfig.java中:

......
android {
	......
    defaultConfig {
	    ......
        buildConfigField "String", "baseUrl", baseUrl
    }
	......
}
......

BuildConfig.java
代碼中可以直接獲取該參數:BuildConfig.baseUrl
以上配置後,項目會有所變化:

Build with Parameters

遇到的坑 

一。AAPT error

錯誤日誌1

錯誤提示:java.util.concurrent.ExecutionException: com.android.builder.internal.aapt.v2.Aapt2Exception: AAPT error: check logs for details
百度的解決方案有三種,一是說在gradle.properties中加入代碼android.enableAapt2=false,二是說統一各module的compileSdkVersion、buildToolsVersion、minSdkVersion、targetSdkVersion等,三就是更不相干的東西了。
這裏我要說一下,各位的代碼本地肯定都是跑過的,編譯打包都正常,只是上了 Jenkins 才報了這個錯,這三個解決方案都站不住腳啊!理論上不應該是代碼裏的啥問題啊!!
最後在某不存在的搜索引擎找到個說法,Gradle路徑太長了導致編譯錯誤balabala……
其實仔細看錯誤日誌,會發現那一串錯誤都是好長的路徑(共同點),所以這個說法比較靠譜。

GRADLE_USER_HOME

項目設置裏的構建處,點擊右下角高級,找到下方此選項打勾。
再次構建,BUILD SUCCESSFUL。

二。aidl is missing

問題發生在我部署到服務器的時候,先是提示說少build-tools,然後說少對應版本的sdk,挨個上傳服務器sdk目錄。然後就報了這個錯。但是本地都是正常的,sdk沒問題,沒理由到服務器上就不行了啊。
這裏我要譴責一下運維同事,他堅定的告訴我服務器上的sdk是從另一個Android同事那裏copy上傳的(windows),但後來發現是他自己down的(linux)。找該Android同事詢問,得到的回覆是“我不知道啊”、“你百度看看”。:)
折騰了很久才定位到這個問題,服務器是Linux環境,本地是Windows環境,sdk是分版本的。不同版本的sdk下的文件不一致,導致錯誤。

以上就是Jenkins配置的過程,以及在配置過程中遇到的問題,自動化配置就算完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章