通過《使用Jenkins搭建iOS/Android持續(xù)集成打包平臺(tái)》和《關(guān)于持續(xù)集成打包平臺(tái)的Jenkins配置和構(gòu)建腳本實(shí)現(xiàn)細(xì)節(jié)》兩篇文章,我們已經(jīng)在原理概念和實(shí)踐操作兩個(gè)層面掌握了如何搭建一個(gè)完整的持續(xù)集成打包平臺(tái)。
不過,在實(shí)際使用過程中,發(fā)現(xiàn)有時(shí)候還會(huì)存在一個(gè)問題。研發(fā)同學(xué)提交新的代碼后,Jenkins端可以成功執(zhí)行構(gòu)建,并生成安裝包;然而在將安裝包安裝至移動(dòng)設(shè)備時(shí),卻發(fā)現(xiàn)有時(shí)候會(huì)出現(xiàn)無法成功安裝,或者安裝后出現(xiàn)啟動(dòng)閃退的情況。
為了及時(shí)發(fā)現(xiàn)該類問題,我們還需要對(duì)每次構(gòu)建生成的安裝包進(jìn)行檢查。本文便是對(duì)構(gòu)建檢查涉及到的方法進(jìn)行介紹。
構(gòu)建生成.app
為了降低問題的復(fù)雜度,我們可以選擇在模擬器中運(yùn)行構(gòu)建生成的安裝包。之前在《從0到1搭建移動(dòng)App功能自動(dòng)化測(cè)試平臺(tái)(1):模擬器中運(yùn)行iOS應(yīng)用》也講解過,要在模擬器中運(yùn)行iOS應(yīng)用,需要在Xcode中編譯時(shí)選擇模擬器類型,并且編譯生成的文件后綴為.app。
對(duì)應(yīng)的,構(gòu)建生成.app的命令如下:
# build .app file from source code
xcodebuild \ # xctool
-workspace ${WORKSPACE_PATH} \
-scheme ${SCHEME} \
-configuration ${CONFIGURATION} \
-sdk ${SDK} \
-derivedDataPath ${OUTPUT_FOLDER}
xcodebuild/xctool參數(shù)說明:
-
-workspace:需要打包的workspace,后面接的文件一定要是.xcworkspace結(jié)尾的; -
-scheme:需要打包的Scheme,一般與$project_name相同; -
-sdk:區(qū)分iphone device和Simulator,可通過xcodebuild -showsdks獲取,例如iphonesimulator9.3。 -
-configuration:需要打包的配置文件,我們一般在項(xiàng)目中添加多個(gè)配置,適合不同的環(huán)境,Release/Debug; -
-derivedDataPath:指定編譯結(jié)果文件的存儲(chǔ)路徑;例如,指定-derivedDataPath build_outputs時(shí),將在項(xiàng)目根目錄下創(chuàng)建一個(gè)build_outputs文件夾,生成的.app文件將位于build_outputs/Build/Products/${CONFIGURATION}-iphoneos中。
同樣地,這里也可以使用xctool代替xcodebuild。
這里使用到的命令和參數(shù)基本上和《關(guān)于持續(xù)集成打包平臺(tái)的Jenkins配置和構(gòu)建腳本實(shí)現(xiàn)細(xì)節(jié)》一文中的大致相同,唯一需要特別注意的是-sdk參數(shù)。因?yàn)槭且谀M器中運(yùn)行,因此-sdk參數(shù)要設(shè)置為iphonesimulator,而非iphoneos。
命令成功執(zhí)行后,就會(huì)在指定的${OUTPUT_FOLDER}目錄中生成${SCHEME}.app文件,這也就是我們構(gòu)建生成的產(chǎn)物。另外,熟悉iOS的同學(xué)都知道,.app文件其實(shí)是一個(gè)文件夾,為了實(shí)現(xiàn)更好的存儲(chǔ),我們也可以額外地再做一步操作,將.app文件夾壓縮轉(zhuǎn)換為.zip格式,而且Appium也是支持讀取.zip格式的安裝包的。
至此,適用于iOS模擬器運(yùn)行的構(gòu)建產(chǎn)物已準(zhǔn)備就緒。這里涉及到的腳本實(shí)現(xiàn)已更新至【debugtalk/JenkinsTemplateForApp】。
實(shí)現(xiàn)構(gòu)建檢查
那要怎樣對(duì)構(gòu)建生成的產(chǎn)物進(jìn)行檢查呢?
最簡(jiǎn)單的方式,就是在iOS模擬器中運(yùn)行構(gòu)建生成的.app,并執(zhí)行一組基本的自動(dòng)化測(cè)試用例。在執(zhí)行過程中,如果出現(xiàn)無法成功安裝,或者安裝成功后啟動(dòng)出現(xiàn)閃退,或者自動(dòng)化測(cè)試用例執(zhí)行失敗等異常情況,則說明我們最新提交的代碼存在問題,需要通知研發(fā)同學(xué)及時(shí)進(jìn)行修復(fù)。
而這些實(shí)現(xiàn)方式,其實(shí)我在《從0到1搭建移動(dòng)App功能自動(dòng)化測(cè)試平臺(tái)》系列文章中都已經(jīng)進(jìn)行了詳細(xì)講解,并形成了一套較為成熟的自動(dòng)化測(cè)試框架,【debugtalk/AppiumBooster】。
在此基礎(chǔ)上,我們無需再做其它工作,只需要按照debugtalk/AppiumBooster的要求在表格中編寫一組基本的自動(dòng)化測(cè)試用例,即可采用如下方式執(zhí)行構(gòu)建檢查。
$ cd ${AppiumBooster_Folder}
$ ruby run.rb -p "${OUTPUT_FOLDER}/${SCHEME}.app.zip" --disable_output_color > test_result.log
在如上命令中,通過-p參數(shù)指定構(gòu)建生成的安裝包,然后就可以在iOS模擬器中運(yùn)行事先編寫好的自動(dòng)化測(cè)試用例,從而實(shí)現(xiàn)構(gòu)建檢查。
在這里,我們還可以通過--disable_output_color開關(guān)將輸出日志的顏色關(guān)閉。之所以實(shí)現(xiàn)這么一個(gè)功能,是因?yàn)樵贘enkins中本來也無法顯示顏色,但是如果還將Terminal中有顏色的日志內(nèi)容輸出到Jenkins中,就會(huì)出現(xiàn)一些額外的字符,比較影響日志的美觀。
現(xiàn)在,我們已經(jīng)分別實(shí)現(xiàn)了代碼構(gòu)建和構(gòu)建檢查這兩個(gè)核心的操作環(huán)節(jié),而要執(zhí)行最終的持續(xù)集成,我們還需要做最后一項(xiàng)工作,即在Jenkins中將這兩個(gè)環(huán)節(jié)串聯(lián)起來。
Jenkins配置
關(guān)于Jenkins的相關(guān)基礎(chǔ)概念、實(shí)施流程和配置細(xì)節(jié),我在之前的文章中已經(jīng)講解得非常詳細(xì)了。在此我就只進(jìn)行一點(diǎn)補(bǔ)充。
要實(shí)現(xiàn)在構(gòu)建完成后再運(yùn)行一些額外的腳本,例如我們的構(gòu)建檢查命令,需要使用到Jenkins的一個(gè)插件,Post-Build Script Plug-in。
安裝完該插件后,在Jenkins配置界面的Post-build Actions欄目中,Add post-build action選項(xiàng)列表中就會(huì)多出Execute a set of scripts選項(xiàng)。選擇該項(xiàng)后,會(huì)出現(xiàn)如下配置界面。

選擇Execute shell后,會(huì)出現(xiàn)一個(gè)文本框,然后我們就可以將構(gòu)建檢查的命令填寫到里面。

在這里我們用到了${AppiumBooster_Folder}參數(shù),該參數(shù)也需要通過String Parameter來進(jìn)行定義,用于指定AppiumBooster項(xiàng)目的路徑。

最后,為了便于將執(zhí)行自動(dòng)化測(cè)試用例的日志和執(zhí)行構(gòu)建的日志分開,我們將執(zhí)行自動(dòng)化測(cè)試用例的日志寫入到了test_result.log文件中。然后,在Archives build artifacts中就可以通過${AppiumBooster_Folder}/test_result.log將執(zhí)行構(gòu)建檢查的日志收集起來,并展示到每次構(gòu)建的頁(yè)面中。
延續(xù)一貫的開箱即用原則,我將使用Jenkins實(shí)現(xiàn)持續(xù)集成構(gòu)建檢查涉及到的Jenkins配置也做成了一套模板,并更新到【debugtalk/JenkinsTemplateForApp】中了,供大家參考。
寫在最后
至此,通過本系列的幾篇文章,關(guān)于如何使用Jenkins實(shí)現(xiàn)移動(dòng)APP持續(xù)集成的相關(guān)內(nèi)容應(yīng)該都已經(jīng)覆蓋得差不多了。
不過,由于我個(gè)人的近期工作主要集中在iOS部分,因此在講解的過程中都是以iOS為主。后續(xù)在將工作重心移到Android部分后,我會(huì)再在DebugTalk的這幾篇文章中更新Android部分的內(nèi)容。