安卓項目開發,打包,需要分開不同階段,不同人員進行負責,這裏我嘗試使用jenkins進行相關的控制和打包配置。
一、 列表內容
Jenkins安裝
軟件環境:
windows系統
jdk
android sdk
gradle
以上系統相關的安裝方法和環境變量設置暫不詳述。
到jenkins官網下載對應的最新版本windows安裝包,裝完就可以直接用http://localhost:8080訪問
官網地址
安裝成功後,進入首頁,用管理員賬號登錄。
1.首先進入系統管理,插件管理,把需要的插件先裝了:
需要安裝的插件列表:
Branch API Plugin
build timeout plugin
build-name-setter
Credentials Binding Plugin
description setter plugin
Dynamic Parameter Plug-in
Environment Injector Plugin
fir-plugin(可選)
Git plugin(可選)
GIT server Plugin(可選)
Gradle Plugin
Pipeline: Basic Steps
Pipeline: Build Step
Pipeline: Input Step
Pipeline: Nodes and Processes
Pipeline: Stage Step
Post-Build Script Plug-in
SSH Slaves plugin
Subversion Release Manager plugin(可選)
Timestamper
Workspace Cleanup Plugin
Subversion Plug-in(可選)
2.打開主Module的build.gradle,該步坑比較多,主要是用於打包時候生成的包的類型控制,證書配置等信息,建議把對應的證書信息,存儲在環境變量中,然後在jenkins中配置相關環境變量,如果不做修改,在每次編譯過程中,還需要重新修改。
具體文件內容如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.0"
defaultConfig {
applicationId "com.test"
minSdkVersion 14
targetSdkVersion 15
versionCode 28
versionName "1.6.0.28"
}
signingConfigs {
release {
storeFile file("$System.env.KEYSTORE_PATH")
storePassword "$System.env.STOREPASS"
keyAlias "$System.env.ALIAS"
keyPassword "$System.env.KEYPASS"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
repositories {
flatDir {
dirs 'libs' //this way we can find the .aar file in libs folder
}
}
lintOptions {
abortOnError false
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/EventBus-2.4.0.jar')
compile files('libs/nineoldandroids-2.4.0.jar')
compile(name: 'recyclerview-v7-22.2.0', ext: 'aar')
compile files('libs/glide-3.7.0.jar')
compile files('libs/okhttputils-2_3_9.jar')
compile files('libs/okhttp-3.6.0.jar')
compile files('libs/okio-1.10.0.jar')
compile files('libs/pinyin4j-2.5.0.jar')
compile files('libs/sqlcipher.jar')
compile files('libs/commons-codec.jar')
compile files('libs/guava-r09.jar')
compile 'com.android.support:support-annotations:22.2.0'
// compile 'com.nineoldandroids:library:2.4.0'
compile 'com.android.support:support-v4:23.0.0'
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'
}
二、配置Jenkins參數
回到主界面->系統管理->Global Tool Configuration: 配置好JDK與Gradle。由於我本地已安裝好JDK與Gradle所以只需爲其指定路徑即可。
另外,全局屬性->Environment variables 增加各個相關需要的一些環境變量,可以被後續編譯的程序中調用。
三、然後回到主界面->新建->構建一個自由風格的項目->ok:
1.勾選上參數化構建過程,先點擊Choice可爲其配置可選參數。我的項目需要配置的可選參數有API環境、打包渠道、是否來自Jenkins打包的標識。
2.點擊String Parameter,讓使用者可以自定義顯示在App上的版本號,方便測試。可以再添加一個可輸入的標籤,最後把這個標籤加到構建頁的構建名稱中。
3.點擊Dynamic Parameter,注入Groovy腳本,主要是生成時間戳。
4.如果是SVN用戶可選擇List SubVersion tags,然後寫地址帳號密碼等,這個選項可以讓你選擇打包SVN上不同版本的代碼。如果是Git用戶可參照http://birdinroom.blog.51cto.com/7740375/1404930 上面的配置來拉取不同的版本。
5.勾選源碼管理中自己所用的管理工具Git或者Subversion,填寫好相關信息,當然我們的地址是動態的,所以需要引用上一步所選擇的版本,如圖。(如果是Linux後面得加上/,不然拉取的其目錄下的內容不包含TAG_SVN這個目錄)
6.在構建環境中勾選上Set Build Name,主要是動態生成每次顯示在構建頁上的名稱方便查看。
7.Build periodically H 9 * * 1-6代表每週一至週六上午九點中的某一時間自動build一次。點擊每一項後面的問號有詳細說明可根據需求自行設置。
8.在構建欄裏面選擇Invoke Gradle Script->選擇配置好的Gradle Version->在Tasks中輸入Gradle命令(沒了解過的建議先看下Gradle的基本命令),我們先執行一個clean,然後開始編譯,這時候就可以用引用上面配置的一些參數了,這裏可以用-P命令把參數傳入,也可以更方便的把下面的Pass jod parameters as Gradle properties勾選上,其實內部也是用-Pkey=Value的命令->在Root Build script中動態指定你項目的目錄,爲什麼是動態的呢?這是因爲我們上面提供了可選版本的功能,所以拉取的每個版本所放目錄是不一樣的,想要編譯相應的版本就得動態指定編譯目錄。
9.選擇剛剛系統設置中的gradle版本,clean build代表每次都clean了再build。可自行配置命令行
10.構建後可能需要發郵件或者獲得apk下載,如下,選擇Archive the artifacts並填寫apk路徑。
選擇該project job-》左邊“狀態”-》最後一次成功的構建結果,並點擊下載apk。
注意事項:
1、參數傳遞的時候Jenkins裏面的參數名稱需要與build.gradle裏面的一致,不然沒什麼卵用。如:
2、在服務器上的SDK最好與你本地的一致,不然指不定編譯的時候會少東西。如果服務器的環境與你本地環境不同就不能直接copy過去了,最好的辦法是下載一個服務器環境的SDKManager或者直接用Android Studio,然後對照你本地SDK裏面的數據挨個下載,完了再copy到服務器。
3、local.properties中sdk.dir需設置成ANDROID_HOME路徑,默認代碼中最好刪去該項,該項配置在環境變量中,動態獲取
4、build.gradle的compileSdkVersion、buildToolsVersion需與ANDROID_HOME中的SDK一致
5、build.gradle腳本中可能需要加上lintOptions選項。該內容需要增加在主model的build.gradle中,並非根目錄的文件中。
android{
lintOptions {
abortOnError false
}
}