Android 使用 Jenkins 參數(shù)化構(gòu)建

這幾天,閑來無事熊响,就想鼓搗鼓搗測試搭建的 Jenkins

Jenkins 上原有的 Android 相關(guān)的 Job 有編譯 debug 的蕴掏、編譯 release 的和多渠道 release 的辜腺,一共三個 Job,感覺一點(diǎn)也不極客范袍镀,遂想折騰一下

關(guān)于 Tomcat , Jenkins 等環(huán)境冻晤,編譯工具鏈的安裝這里就不介紹了苇羡,網(wǎng)上一大堆,都玩爛了鼻弧,也沒什么難度设江,下面進(jìn)入正題

首先,想要把三個 Job 集合起來攘轩,肯定要用到參數(shù)化構(gòu)建的叉存,下面是我需要的參數(shù)

參數(shù)名 作用
Branch 指定編譯哪一個分支
BuildType 編譯類型 debug, release度帮, 多渠道等
EmailList 接收編譯結(jié)果的郵箱列表

首先 Branch 參數(shù)歼捏,我一開始使用的是手動填寫的方式,但是感覺不爽笨篷,后來在網(wǎng)上看到了 Dynamic Choice Parameter 瞳秽,它可以使用腳本生成動態(tài)的下拉列表框


branch

代碼如下

def git_address = "git@gitlab.xxxxx.com:xxxxx.git"
def Branches_build = ("git ls-remote -h " + git_address).execute()
Branches_build.text.readLines().collect {
    it.split()[1].replaceAll('refs/heads/', '')
}.unique()

這段代碼的核心是 git ls-remote -h remote_address
ls-remote 的意思是:列出遠(yuǎn)程倉庫中,所有可用的引用
-h / --heads 是用來只顯示 refs/heads 的引用
命令運(yùn)行效果如下

git ls-remote -h git@gitlab.xxxx.com:xxxx.git
e2e7cb5e614915627ec46188613aa0e68fff824d        refs/heads/dev
710ce06a02cca7e48e557dbc29d36d0791cb3c3a        refs/heads/master
18aacde7d9d7047d3e1581569fa901b2f8eb07ac        refs/heads/release/0.5.0_no_face_test
ae7ee8b75622dc69857462f7e5e9599f46afe90c        refs/heads/release/v0.2.0
1ed148ca137daca49663f760d72a72666cb7a761        refs/heads/release/v0.3.0
702c29dafdf5ac3fa9edb8ab2d4ee5803ae98553        refs/heads/release/v0.4.0
61d1466dd051e497722a03c2efbd77db9c853e3a        refs/heads/release/v0.5.0
6326873bdfc5819c3ca8ee756682d086d56614be        refs/heads/release/v0.5.3
6d2ea95393185f2d366a234aa0910d8e145d2bc2        refs/heads/release/v1.0.0
3f0ac34e9b334aae34030756c4a8c0470578ad0c        refs/heads/release/v1.0.1

it.split()[1].replaceAll('refs/heads/', '') 是把每一行分隔后冕屯,取第 1 個位置的字符串寂诱,然后把 refs/heads/ 替換為空字符串
最終效果如圖


效果

第一個參數(shù)搞定,接下來是第二個 BuildType 這個就簡單了安聘,直接一個 Choice 即可搞定痰洒,第三個 EmailList 也很簡單瓢棒,一個 String Parameter,就不貼圖了

在 配置 -> 源碼管理 -> Branch Specifier (blank for 'any') 填入 ${Branch} 來指定分支

構(gòu)建觸發(fā)器 也不詳細(xì)說了丘喻,我加上了 Poll SCM 每 15 分支檢查一次脯宿,但是好像和參數(shù)化構(gòu)建有沖突,上網(wǎng)搜這個泉粉,有人說连霉,參數(shù)化構(gòu)建和 Poll SCM 最好不要在一個 Job 里

構(gòu)建環(huán)境 可以把 Set Build Name 勾上,這樣就可以修改每個 Build 的名字了嗡靡,在列表里看起來更直觀跺撼,比如 #${BUILD_NUMBER}-${Branch}-${BuildType} ,就會在 Job 頁顯示形如 #25-dev-debug 的 Build Name讨彼,很直觀

這里推薦一個插件 user build vars歉井,它可以把開啟構(gòu)建的用戶的相關(guān)信息寫入到構(gòu)建環(huán)境中
下面的表格是所有支持的參數(shù)

Variable Description
BUILD_USER Full name (first name + last name)
BUILD_USER_FIRST_NAME First name
BUILD_USER_LAST_NAME Last name
BUILD_USER_ID Jenkins user ID
BUILD_USER_EMAIL Email address

安裝后,在 構(gòu)建環(huán)境 中哈误,把 Set jenkins user build variables 勾上哩至,就可以使用上面的參數(shù)了
這個插件很有用,比如自動發(fā)送編譯結(jié)果的郵件給開啟編譯任務(wù)的人

然后是構(gòu)建蜜自,我沒有使用 Gradle 插件來編譯菩貌,而是自己寫的腳本

echo ${BUILD_NUMBER}
echo ${Branch}
echo ${BUILD_USER_EMAIL}
echo ${BUILD_USER}
source ~/.bash_profile

# 拷貝后的要用來存檔的目錄
output_app_dir="$WORKSPACE/app/build/jenkins"

# 編譯工具輸出的目錄
output_apk_dir="$WORKSPACE/app/build/outputs"

build_type="${BuildType}"

# 上傳蒲公英的 apk 路徑
upload_apk_path=""

# 下面判斷編譯類型,來執(zhí)行不同的 task
if [ "$build_type" == "debug" ]; then
  gradle clean assembleDebug --stacktrace
  mkdir "$output_app_dir"
  cp $output_apk_dir/apk/app-debug.apk $output_app_dir/debug_${BUILD_NUMBER}.apk
  upload_apk_path=$output_app_dir/debug_${BUILD_NUMBER}.apk
elif [ "$build_type" == "release" ]; then
  gradle clean assembleRelease --stacktrace
  mkdir "$output_app_dir"
  cp $output_apk_dir/apk/app-release.apk $output_app_dir/release_${BUILD_NUMBER}.apk
  cp $output_apk_dir/mapping/release/mapping.txt $output_app_dir/mapping_${BUILD_NUMBER}.txt
  upload_apk_path=$output_app_dir/release_${BUILD_NUMBER}.apk
else
  # 多渠道打包用的是 美團(tuán)的 walle
  #gradle clean assembleReleaseChannels --stacktrace
  # -DBUGLY_ENABLED=true 是向 Gradle 中傳遞一個參數(shù)重荠,用來開啟 bugly 的 mapping 上傳任務(wù)
  gradle clean -DBUGLY_ENABLED=true assembleReleaseChannels --stacktrace
  mkdir "$output_app_dir"
  cp -r $output_apk_dir/channels $output_app_dir/channels_${BUILD_NUMBER}
  cp $output_apk_dir/mapping/release/mapping.txt $output_app_dir/mapping_${BUILD_NUMBER}.txt
  # 找到含有指定渠道名的 apk 文件的路徑用來上傳蒲公英
  upload_apk_path=`find "$output_app_dir/channels_${BUILD_NUMBER}" -name "*-xxxx-*.apk"`
fi

#上傳到蒲公英
echo "++++++++++++++upload to pgyer+++++++++++++"
#蒲公英上的User Key
uKey="xxxxxx"     
#蒲公英上的API Key
apiKey="xxxxx"    
#要上傳的apk文件路徑
APK_PATH="${upload_apk_path}"
#執(zhí)行上傳至蒲公英的命令
if [ -f "$APK_PATH" ]; then
  curl -F "file=@${APK_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" http://www.pgyer.com/apiv1/app/upload
fi

BUGLY_ENABLED 的值是用來控制 bugly 開啟和關(guān)閉狀態(tài)的

bugly {
    appId = 'xxxxx' // 注冊時分配的App ID
    appKey = 'xxxxxx' // 注冊時分配的App Key
    // 獲取 BUGLY_ENABLED 的值
    def isEnabled = System.getProperty("BUGLY_ENABLED", "false")
    System.out.println("BUGLY_ENABLED " + isEnabled)
    boolean enable = Boolean.parseBoolean(isEnabled)
    execute = enable
    upload = enable
    uploadMapping = enable
    uploadSymbol = enable
}

美團(tuán) walle 多渠道打包配置

walle {
    // 指定渠道包的輸出路徑
    apkOutputFolder = new File("${project.buildDir}/outputs/channels")
    // 嘗試獲取 Jenkins 的 BUILD_NUMBER 的值
    def buildNum = System.getenv("BUILD_NUMBER") as Integer ?: '${buildTime}'
    // 定制渠道包的APK的文件名稱
    apkFileNameFormat = 'XXXXX-${channel}-${buildType}-v${versionName}-' + buildNum + '.apk'
    // 渠道配置文件
    channelFile = new File("${project.getProjectDir()}/channel")
}

構(gòu)建后箭阶,用于存檔的文件

app/build/jenkins/*.txt,app/build/jenkins/channels*/,app/build/jenkins/*.apk

最后是構(gòu)建完成后的自動發(fā)送郵件,網(wǎng)上也有許多我這里不贅述了
我發(fā)送的是 ${BUILD_USER_EMAIL},${EmailList}

完晚缩!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尾膊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子荞彼,更是在濱河造成了極大的恐慌冈敛,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸣皂,死亡現(xiàn)場離奇詭異抓谴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寞缝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門癌压,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荆陆,你說我怎么就攤上這事滩届。” “怎么了被啼?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵帜消,是天一觀的道長棠枉。 經(jīng)常有香客問我,道長泡挺,這世上最難降的妖魔是什么辈讶? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮娄猫,結(jié)果婚禮上贱除,老公的妹妹穿的比我還像新娘。我一直安慰自己媳溺,他們只是感情好月幌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悬蔽,像睡著了一般飞醉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯阀,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音轴术,去河邊找鬼难衰。 笑死,一個胖子當(dāng)著我的面吹牛逗栽,可吹牛的內(nèi)容都是我干的盖袭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼彼宠,長吁一口氣:“原來是場噩夢啊……” “哼鳄虱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凭峡,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拙已,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摧冀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倍踪,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年索昂,在試婚紗的時候發(fā)現(xiàn)自己被綠了建车。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡椒惨,死狀恐怖缤至,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情康谆,我是刑警寧澤领斥,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布嫉到,位于F島的核電站,受9級特大地震影響戒突,放射性物質(zhì)發(fā)生泄漏屯碴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一膊存、第九天 我趴在偏房一處隱蔽的房頂上張望导而。 院中可真熱鬧,春花似錦隔崎、人聲如沸今艺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虚缎。三九已至,卻和暖如春钓株,著一層夾襖步出監(jiān)牢的瞬間实牡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工轴合, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留创坞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓受葛,卻偏偏與公主長得像题涨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子总滩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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