Jenkins簡介
Jenkins是一個開源軟件項(xiàng)目,旨在提供一個開放易用的軟件平臺蝶柿,使軟件的持續(xù)集成變成可能。目前大部分公司都在使用Jenkins來持續(xù)構(gòu)建陈惰。
Jenkins下載與安裝配置
Jenkins下載
安裝Jenkins有兩種方式:
第一種就是下載安裝包直接安裝北专,下載地址:http://mirrors.jenkins-ci.org
第二種就是下載war包禀挫,放到Tomcat中啟動。war包下載地址:http://mirrors.jenkins-ci.org/war/拓颓,
或者http://updates.jenkins-ci.org/download/war/
這里因?yàn)槲译娔X上面之前裝了Tomcat语婴,所以我使用直接下載war包的方式進(jìn)行安裝。
Jenkins安裝
將下載的jenkins.war放到Tomcat下的webapps目錄下驶睦,然后啟動Tomcat砰左。在瀏覽器中訪問"Tomcat訪問地址/jenkins"即可安裝,因?yàn)槲业腡omcat裝在本機(jī)场航,并且端口為8080缠导,所以訪問http://localhost:8080/jenkins/即可進(jìn)行安裝。
Jenkins配置
Jenkins安裝之后可以進(jìn)行用戶的權(quán)限設(shè)置旗闽、插件的安裝等配置酬核。
用戶權(quán)限設(shè)置
系統(tǒng)管理-->Configure Global Security
如下圖所示,在此處可以添加适室、刪除用戶以及配置用戶權(quán)限嫡意。
插件安裝
搭建Android自動化打包環(huán)境需要安裝Gradle插件,如果使用Git還需要Git的插件捣辆,安裝Jenkins時默認(rèn)已經(jīng)安裝了這兩個插件蔬螟。如果沒有安裝可以進(jìn)入“系統(tǒng)管理>管理插件”進(jìn)行插件的安裝。
創(chuàng)建Jenkins任務(wù)
要想Jenkins能夠幫我們自動構(gòu)建項(xiàng)目汽畴,我們需要創(chuàng)建一個任務(wù)旧巾,并且配置這個任務(wù)要它幫我們執(zhí)行什么操作,以及什么時候執(zhí)行等忍些。
如上圖所示鲁猩,點(diǎn)擊“新建”按鈕并且選擇“構(gòu)建一個自由風(fēng)格的軟件項(xiàng)目”,完了之后會進(jìn)入到任務(wù)的配置界面罢坝,配置好之后任務(wù)會出現(xiàn)在如上圖右邊的任務(wù)列表中廓握。
任務(wù)配置
創(chuàng)建一個任務(wù)之后,會自動跳轉(zhuǎn)到任務(wù)的配置界面對該任務(wù)進(jìn)行配置嘁酿,大概包括如下配置:
源碼管理
構(gòu)建項(xiàng)目隙券,當(dāng)然得有代碼了。Jenkins支持使用版本控制工具來進(jìn)行源碼管理闹司,比如Git或者SVN娱仔。這里我使用的是Git,項(xiàng)目使用的是我的github上面的一個多渠道打包的demo游桩。在Repository URL中輸入項(xiàng)目地址牲迫,點(diǎn)擊Add按鈕添加認(rèn)證信息耐朴,然后選擇構(gòu)建的分支,我這里使用的是master分支盹憎。
構(gòu)建觸發(fā)器
Jenkins支持上圖所示的觸發(fā)時機(jī)配置隔箍,如果都不選,則為手動構(gòu)建脚乡,需要點(diǎn)擊“立即構(gòu)建”按鈕才構(gòu)建。
Build periodically:周期進(jìn)行項(xiàng)目構(gòu)建(它不關(guān)心源碼是否發(fā)生變化)滨达;
Build when a change is pushed to GItHub:表示只要GitHub上面源碼一更新即進(jìn)行構(gòu)件奶稠;
Poll SCM:定時檢查源碼變更(根據(jù)SCM軟件的版本號),如果有更新就checkout最新code下來捡遍,然后執(zhí)行構(gòu)建動作锌订。
Build periodically和Poll SCM都支持日程表的設(shè)置,這個與Spring框架中定時器的日程表配置類似画株,有5個參數(shù):
第一個參數(shù)代表的是分鐘 minute辆飘,取值 0~59;
第二個參數(shù)代表的是小時 hour谓传,取值 0~23蜈项;
第三個參數(shù)代表的是天 day,取值 1~31续挟;
第四個參數(shù)代表的是月 month紧卒,取值 1~12;
最后一個參數(shù)代表的是星期 week诗祸,取值 0~7跑芳,0 和 7 都是表示星期天。
如:
選擇Build periodically并設(shè)置日程表為“0 4 * * ”直颅,則表示每天凌晨4點(diǎn)構(gòu)建一次源碼博个。
選擇Poll SCM并設(shè)置日程表為“/10 * * * *”,則表示每10分鐘檢查一次源碼變化功偿,如果有更新才進(jìn)行構(gòu)建盆佣。
構(gòu)建工具
因?yàn)楝F(xiàn)在Android項(xiàng)目默認(rèn)都是使用Gradle來進(jìn)行構(gòu)建的,所以在構(gòu)建中我選擇的是Invoke Gradle script脖含。當(dāng)然你也可以選擇其它的構(gòu)建工具罪塔,比如Ant。
選擇Invoke Gradle script之后可以選Invoke Gradle和Use Gradle Wrapper养葵,選擇Invoke Gradle就是調(diào)用本地安裝配置好的Gradle征堪,此時需要指定Gradle路徑。為了方便所有開發(fā)者同意Gradle版本关拒,一般都使用Gradle Wrapper佃蚜。關(guān)于Gradle和Gradlew的區(qū)別可以看這篇文章https://www.zybuluo.com/xtccc/note/275168庸娱。
Tasks中填上需要執(zhí)行的gradle的task。上面我填的clean assembleRelease谐算,即執(zhí)行g(shù)radlew clean assembleRelease熟尉。
構(gòu)建后的操作
配置構(gòu)建后的操作可以讓Jenkins在構(gòu)建完之后執(zhí)行什么操作,比如郵件通知洲脂、構(gòu)建其它項(xiàng)目等斤儿。
這里我配置了Archive the artifacts,在“用于存檔的文件”中填寫需要存檔的文件名恐锦,可以使用通配符往果。比如上面我配置了app/build/outputs/apk/v*.apk,表示疑v開頭的apk文件都存檔一铅。構(gòu)建完之后在任務(wù)首頁可以下載存檔的文件陕贮。
任務(wù)配置完成之后,點(diǎn)擊任務(wù)首頁的“立即構(gòu)建”按鈕潘飘,即可開始構(gòu)建肮之,構(gòu)建過程首先會將源碼下載下來,位于jenkins目錄下的workspace中卜录。然后執(zhí)行配置好的gradle命令戈擒,如果使用gradlew,第一次應(yīng)該會下載gradlew設(shè)置的版本的gradle艰毒,最后執(zhí)行構(gòu)建任務(wù)峦甩。構(gòu)建完之后,如下圖现喳,可以看到存檔的文件凯傲,點(diǎn)擊即可下載。
附:Android工程build.gradle文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.lauren.multichanneldemo"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
signingConfigs {
release {
def liulingStoreFile = System.getenv("LIULING_STORE_FILE")
def liulingKeyAlias = System.getenv("LIULING_KEY_ALIAS")
def liulingKeyPassword = System.getenv("LIULING_KEY_PASSWORD")
def liulingStorePassword = System.getenv("LIULING_STORE_PASSWORD")
def isSigning = (liulingStoreFile != null) && (liulingKeyAlias != null) && (liulingKeyPassword != null) && (liulingStorePassword != null)
if(isSigning){
storeFile file(liulingStoreFile)
keyAlias liulingKeyAlias
keyPassword liulingKeyPassword
storePassword liulingStorePassword
} else {
storeFile file("debug.keystore")
keyAlias "AndroidDebugKey"
keyPassword "android"
storePassword "android"
}
}
debug {
storeFile file("debug.keystore")
keyAlias "AndroidDebugKey"
keyPassword "android"
storePassword "android"
}
}
buildTypes {
release {
// 不顯示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//啟用混淆代碼的功能
minifyEnabled true
//壓縮對齊生成的apk包
zipAlignEnabled true
//指定混淆規(guī)則嗦篱,需要壓縮優(yōu)化的混淆要把proguard-android.txt換成proguard-android.txt
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources true
signingConfig signingConfigs.release //打包命令行:gradlew assembleRelease
}
debug {
signingConfig signingConfigs.debug
}
}
lintOptions {
abortOnError false
}
// productFlavors {
// _91 {
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"]
// }
// wandoujia {
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"]
// }
// xiaomi {
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"]
// }
//
// _360shoufa{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "360shoufa"]
// }
// anzhi{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "anzhi"]
// }
// baidushoufa{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidushoufa"]
// }
// huaweishoufa{
// manifestPlaceholders = [MTA_CHANNEL_VALUE: "huaweishoufa"]
// }
// }
// 如果嫌上面寫法麻煩,也可以這樣簡寫,加上一個批量處理即可.
productFlavors {
_91 {}
wandoujia {}
xiaomi {}
_360shoufa{}
anzhi{}
baidushoufa{}
huaweishoufa{}
}
//批量處理
productFlavors.all {
flavor ->
def channel = name.startsWith("_") ? name.substring(1) : name
flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: channel]
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (variant.buildType.name.equals('release')) {
//可自定義自己想要生成的格式
def channel = variant.productFlavors[0].name.startsWith("_") ? variant.productFlavors[0].name.substring(1) : variant.productFlavors[0].name
def fileName = "v${defaultConfig.versionName}_${releaseTime()}_${channel}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
apply from: 'productFlavors.gradle'
}
def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
}
本文首發(fā):http://www.liuling123.com/2016/10/jenkins-gradle-auto-build.html