前言
在項(xiàng)目開發(fā)中,我們需要將最新的代碼更新,提供給測試人員進(jìn)行測試州疾,以及發(fā)布。
目前 Android 工作中都在使用很強(qiáng)大的開發(fā)皇拣、構(gòu)建以及打包工具严蓖,例如: android-studio、Gradle氧急、Git等颗胡。
然,在企業(yè)組織并不是很完善的公司里吩坝,開發(fā)打包發(fā)布等工作毒姨,時(shí)常會由開發(fā)人員進(jìn)行操作,難免在一些地方疏忽掉钉寝。
因此弧呐,CI 構(gòu)建的出現(xiàn),使得這些繁瑣的工作變得輕松起來嵌纲。
對于開發(fā)工程師俘枫,只負(fù)責(zé)向版本庫提交代碼,不用關(guān)心打包疹瘦,發(fā)布之類的流程崩哩。
對于產(chǎn)品和測試巡球,只需要從發(fā)布頁面下載 APK 安裝文件言沐,不需要每一次都去工程師哪里索取最新的安裝文件邓嘹。
CI 的基本工作流程如下:
我們每一次提交代碼(通過git/svn作為版本庫)到主干上,根據(jù) CI 的定時(shí)任務(wù)险胰,檢測到版本更新汹押,通過 CI ,將進(jìn)行打包發(fā)布等流程操作起便。
準(zhǔn)備工作
本文使用 Linux Ubuntu 系統(tǒng)為大家介紹環(huán)境的搭建
環(huán)境工具
- PC 機(jī)(mac/linux)
- Java JDK
- Android SDK
- Gradle
- Git
- Tomcat
- Jenkins
環(huán)境搭建
Java 環(huán)境 安裝
Java JDK, Android SDK, Gradle 可從AndroidDevTools處下載獲取棚贾。
git 安裝
git 可通過終端進(jìn)行安裝
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
安裝完成之后通過git --version
檢查是否成功
安裝后 git 存儲在 /usr/bin/git
下
Jenkins
通過 Jenkins 官方網(wǎng)站下載最新Jenkins.war包
環(huán)境變量
打開 vi /etc/profile
將下列語句添加在文件的末尾后, 執(zhí)行 esc->:wq
其中環(huán)境位置根據(jù)自己的所在位置進(jìn)行相應(yīng)的更改
啟動
激動的你榆综,是不是已經(jīng)被這些繁瑣的東西搞的不耐煩了呢妙痹,下面我們開始啟動 Jenkins
將下載好的 Jenkins.war 包, 放入 Tomcat 的 webapps 目錄下鼻疮,進(jìn)入 bin 目錄執(zhí)行 ./startup.sh 啟動 Tomcat怯伊。
啟動后,在瀏覽器中輸入: localhost:8080/jenkins

插件安裝
系統(tǒng)管理-> 插件管理->可選插件:
在搜索框中搜索以下插件判沟,并進(jìn)行安裝
git plugin
gitlab plugin
grade plugin
Android Lint Plugin
Build Pipeline plugin
build timeout plugin
build name plugin
change assembly-version plugin
credentials binding plugin
description setter plugin
Dynamic parameter plugin
Email Extension plugin
FindBugs plugin
JaCoco plugin
Unit attachments plugin
Project Description plugin
Timestamper
Workspace cleanup plugin
安裝完成后耿芹,重啟。
系統(tǒng)設(shè)置
系統(tǒng)管理->系統(tǒng)設(shè)置:
配置Android 環(huán)境挪哄,將地址指向本機(jī)的 SDK 目錄
系統(tǒng)管理->全局工具配置
配置 Java吧秕, Git , Gradle 目錄等
JDK:
Git:
Gradle:
到此迹炼,環(huán)境配置砸彬,已基本完成。
下面我們開始進(jìn)行項(xiàng)目夠?qū)⒉僮?/p>
項(xiàng)目構(gòu)建
創(chuàng)建Job
新建->構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目:
參數(shù)化構(gòu)建
通常我們在使用 Android-studio 進(jìn)行打包時(shí)以及簽名時(shí)斯入,都會用到build.gradle并在其中配置相關(guān)屬性拿霉。再此,我們可以用Jenkins咱扣,配置我們的項(xiàng)目參數(shù)绽淘,例如發(fā)布的版本號,構(gòu)建時(shí)間闹伪, 上傳路徑沪铭,發(fā)布地址,簽名打包等等偏瓤。
在這里我們先看看 build.gradle 中的構(gòu)建信息:
在項(xiàng)目的 moudle 下 build.gradle 文件
def getDate () {
def date = new Date()
def formattedDate = date.format("yyyyMMddHHmm")
return formattedDate
}
def verName = APP_VERSION
def verCode = 14
android {
....
signingConfigs {
release {
keyAlias ''
keyPassword ''
storeFile file ('')
storePassword ''
}
}
defaultConfig {
applicationId "cn.zhuangbudong.example"
minSdkVersion 18
targetSdkVersion 25
multiDexEnabled true
versionCode verCode
versionName verName
resValues("string", 'app_version', verName)
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
lintOptions {
abortOnError false
}
dexOptions {
javaMaxHeapSize '2g'
}
applicationVariants.all { variant ->
variant.outputs.each { output ->
def newName
def timeNow
def oldFile = output.outputFile
def outDirectory = oldFile.parent
if ("true".equals(IS_JENKINS)) {
timeNow = JENKINS_TIME
outDirectory = "/media/nexd/work/android/package/release/"
newName = 'zhuangbudong_example_' + verName + "_" + timeNow + "_" + variant.buildType.name + ".apk"
} else {
timeNow = getDate()
if (variant.buildType.name.equals('debug')) {
newName = 'zhuangbudong_example_' + verName + "_debug.apk"
} else {
newName = 'zhuangbudong_example_' + verName + "_" + timeNow + "_" + variant.buildType.name + ".apk"
}
}
output.outputFile = new File(outDirectory, newName)
}}
}
}
gradle.properties:
APP_VERSION=2.0.2
IS_JENKINS=false
JENKINS_TIME=''
在工程中添加以上代碼杀怠,并在Jenkins中為這些參數(shù)賦值。
下面介紹 Jenkins 參數(shù)配置
勾選參數(shù)化構(gòu)建過程厅克,如下圖:
按照下圖赔退,添加相關(guān)類型的參數(shù),此處注意,Jenkins 配置的參數(shù)名要和在android-studio中配置的參數(shù)名保持一致
源碼管理
此處負(fù)責(zé)從版本庫中拉去最新的代碼
此處如果需要驗(yàn)證硕旗,點(diǎn)擊 Add窗骑, 選擇: Username with password
在對應(yīng)窗口輸入用戶名和密碼信息
點(diǎn)擊添加。
使用 gitlab 進(jìn)行源碼庫管理漆枚。
觸發(fā)器
觸發(fā)器負(fù)責(zé)拉取代碼创译,編譯,打包墙基,發(fā)布等操作软族。通過觸發(fā)器,執(zhí)行Jenkins残制。
構(gòu)建環(huán)境
此處只是在Jenkins在打包時(shí)立砸,配置任務(wù)名稱即可。如下圖:
構(gòu)建
這里是最重要滴初茶,配置以下命令仰禽,才能進(jìn)行打包簽名等等。
如下配置纺蛆,這里需要注意下吐葵,構(gòu)建文件,根目錄桥氏。在你的目錄結(jié)構(gòu)比較復(fù)雜的時(shí)候温峭,即你的根目錄沒有 build.gradle 文件時(shí),需要指定一下 build.gradle 目錄的位置字支。
同時(shí)凤藏,也是最重要的,勾選上pass job parameters as gradle properties 堕伪,不然之前配置的參數(shù)無法傳遞給項(xiàng)目中的 gradle.properties揖庄。
構(gòu)建后操作
當(dāng)項(xiàng)目構(gòu)建完成后,我們可以通過郵件的方式將產(chǎn)生的Apk文件欠雌,以及測試報(bào)告蹄梢,構(gòu)建日志等信息,發(fā)送出來 如下圖:
<hr/>
(本郵件是程序自動下發(fā)的富俄,請勿回復(fù)禁炒!)<br/><hr/>
項(xiàng)目名稱:${PROJECT_NAME}<br/><hr/>
構(gòu)建編號:${BUILD_NUMBER}<br/><hr/>
構(gòu)建狀態(tài):${BUILD_STATUS}<br/><hr/>
觸發(fā)原因:${CAUSE}<br/><hr/>
測試報(bào)告:<a href="${PROJECT_URL}ws/${PROJECT_NAME}app/build/reports/tests/release/index.html">${PROJECT_URL}ws/${PROJECT_NAME}app/build/reports/tests/release/index.html</a><br/><hr/>
構(gòu)建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console/</a><br/><hr/>
構(gòu)建地址:<a href="${PROJECT_URL}">${PROJECT_URL}</a><br/><hr/>
構(gòu)建報(bào)告:<a href="${BUILD_URL}testReport">${BUILD_URL}testReport</a><br/><hr/>
變更集:${JELLY_SCRIPT,template="html"}<br/>
<hr/>
開始構(gòu)建
回到 Jenkins 首頁,點(diǎn)擊創(chuàng)建的項(xiàng)目霍比,點(diǎn)擊 build with parameters:
點(diǎn)擊開始構(gòu)建幕袱,啟動 Jenkins 構(gòu)建任務(wù)。
構(gòu)建成功時(shí)悠瞬,顯示為藍(lán)色们豌, 失敗為紅色涯捻,如下圖:
構(gòu)建后生成的 Apk 文件,存在 build.gradle 文件中配置的目錄望迎。同時(shí)也可以使用蒲公英或fir.im 進(jìn)行發(fā)布管理障癌。
謝謝~