歡迎光臨
每天分享高質量文章

iOS持續集成構建

作者:偶爾登南山
鏈接:https://www.jianshu.com/p/f72f10a921b9

目前市面上持續集成的方案很多:例如,Jenkins, Fastlane,Xcode server等,這些持續集成的方案大同小異,他們之間的性能差異筆者沒有做大量的橫向分析,只是大體比較了一下打包時間.總結來說,持續集成主要是三個步驟:1.拉取代碼;2.編譯打包;3.分發資料(打包結果),下麵將通過兩種方案(Jenkins和Xcode server)來分析一下這三個過程.

Jenkins集成方案

Jenkins作為免費集成方案,其社區擁有大量插件,非常友好,所以用戶也眾多.
首先來安裝Jenkins,Jenkins官網提供了多個系統環境的軟體包,我選擇的是macOs系統,選擇下載安裝,步驟如下圖:

下載Jenkins

 

安裝Jenkins

 

 

設置管理員賬號密碼

 

安裝完成後,一般mac環境集成了Apache服務器會自動配置啟動8080端口,Jenkins的初始化頁面也會在安裝完成後自動彈出.此時只要找到圖中紅色標記路徑cat或者vi看一下裡面的秘鑰,進入Jenkins初始化設置工作.這個過程會設置管理員賬號密碼等.

 

 

Jenkins插件安裝

 

初始化完成後,就可以利用管理員賬號登錄.登錄後通常可以安裝一些常用插件,一般有預設插件和自定義插件,選擇預設插件即可.

 

 

基本的環境搭建完成後,就可以實施上面的三個過程了.其實Jenkins的主要工作流程,可以通過下圖來直觀看出來.

 

步驟1 拉取代碼

 

拉取代碼過程比較簡單,主要是從指定倉庫中克隆代碼到Jenkins的工作目錄.

步驟2 編譯打包

編譯打包命令主要有xcodebuild,xcrun,xctool(facebook)等,前兩個是官方的,後一個是Facebook出品,xctool裡面集成了個性化定製,需要的可以細研究一下,文中只是對xcodebuild做出使用分析.


xcodebuild編譯過程也主要分三個過程:

 

- clean
    xcodebuild -workspace MyWorkspace.xcworkspace -scheme SchemeName

- archive
     xcodebuild archive -workspace MyWorkspace.xcworkspace -scheme SchemeName

- export ipa
     xcodebuild -exportArchive -archivePath MyMobileApp.xcarchive -exportPath ExportDestination.ipa -exportOptionsPlist 'exportPlist.plist'


這裡多說兩句:由於IDE變化,導致編輯腳本稍微有一些出入,主要是在編譯的第三步(- export ipa),這步Xcode 8.0需要指定描述檔案,Xcode 9.0需要指定exportOptionsPlist(這個是主要包含一些證書, ipa樣式等鍵值表).下麵貼出打包執行腳本的全部命令(Xcode 9.0):

 

export ETT_APP_NAME=app名稱
export ETT_WORKSPACE_NAME=工作區名稱
export ETT_SCHEME=scheme名稱
export ETT_PROVISIONING_PROFILE=描述檔案(Xcode9.0用不到)
export ETT_BUILD_TYPE=編譯型別(用於區分發佈還是AdHoc樣式,可以忽略)
export ETT_CONFIGURATION=編譯配置(主要根據自己的多環境進行配置,比如Release,Debug等)

###############################################################################################################
export ETT_JENKINS_TIME=$(date +%m%d) 
export ETT_GIT_COMMIT=${GIT_COMMIT:0:7}
export ETT_GIT_REV=`git rev-list HEAD | wc -l | awk '{print $1}'`
export ETT_VERSION_PRO=`/usr/bin/agvtool mvers -terse1`
export ETT_VERSION_NUMBER=$ETT_VERSION_PRO$ETT_BUILD_TYPE
export ETT_BUILD_VERSION=$ETT_GIT_REV.$BUILD_NUMBER
export ETT_BUILD_ID=$ETT_VERSION_NUMBER-$ETT_JENKINS_TIME-$ETT_GIT_REV-$BUILD_NUMBER-G$ETT_GIT_COMMIT

export NEXUS_JENKINS_NAME=打包後上傳賬號
export NEXUS_JENKINS_PASSWD=密碼


export ExportOptionsPlistPath=/Users/用戶/Downloads/zhengshu/ExportOptions.plist
export XCODE=/usr/bin
export ETT_DIST_ROOT_PATH=工作區路徑
export ETT_DIST_PATH=$ETT_DIST_ROOT_PATH/$BUILD_NUMBER
export ETT_ARCHIVE_PATH=$ETT_DIST_PATH/$ETT_APP_NAME.xcarchive
export ETT_WORK_SPACE=$WORKSPACE/$ETT_WORKSPACE_NAME.xcworkspace

export ETT_FILE_NAME=$ETT_APP_NAME-$ETT_BUILD_ID
export ETT_IPA_NAME=$ETT_FILE_NAME.ipa
export ETT_EXPORT_PATH=$ETT_DIST_PATH/$ETT_IPA_NAME
export ETT_PACKAGE_NAME=$ETT_FILE_NAME.tar.gz
export ETT_PACKAGE_PATH=$ETT_DIST_PATH/$ETT_PACKAGE_NAME
export ETT_NEXUS_FILE_NAME=$ETT_APP_NAME-$ETT_JENKINS_TIME-$BUILD_NUMBER-$ETT_GIT_COMMIT.tar.gz

export ETT_UPLOAD_DSYM_SRC=$ETT_WORKSPACE_NAME.app.dSYM
export ETT_UPLOAD_DSYM_FILE=$ETT_FILE_NAME-dSYM.zip
export ETT_UPLOAD_DSYM_PATH=$ETT_DIST_PATH/$ETT_UPLOAD_DSYM_FILE

if [ ! -d "$ETT_DIST_ROOT_PATH" ]; then
  mkdir $ETT_DIST_ROOT_PATH
fi
if [ ! -d "$ETT_DIST_PATH" ]; then
  mkdir $ETT_DIST_PATH
fi

#/usr/bin/agvtool vers -terse
#/usr/bin/agvtool mvers -terse1

/usr/bin/agvtool new-marketing-version $ETT_VERSION_PRO
/usr/bin/agvtool new-version -all $ETT_VERSION_PRO.$ETT_BUILD_VERSION

#/usr/bin/agvtool vers -terse
#/usr/bin/agvtool mvers -terse1

$XCODE/xcodebuild clean build BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" archive -archivePath "$ETT_ARCHIVE_PATH" -workspace $ETT_WORK_SPACE -destination generic/platform=iOS -scheme $ETT_SCHEME -configuration "$ETT_CONFIGURATION" BUILD_NUMBER="$ETT_BUILD_ID" CONFIGURATION_BUILD_DIR=$ETT_DIST_PATH UPLOAD_dSYM_FILE=$ETT_UPLOAD_DSYM_FILE
$XCODE/xcodebuild -exportArchive -archivePath $ETT_ARCHIVE_PATH -exportPath $ETT_EXPORT_PATH -exportOptionsPlist $ExportOptionsPlistPath -allowProvisioningUpdates

步驟3 分發資料(發佈打包)

這個過程可以直接發佈,也可以上傳到自己指定的服務器,第三方托管服務器等.我們直接在執行打包腳本的最後面,將打包處理的ipa檔案以及符號化檔案打包後直接上傳到指定服務器:

 

cd $ETT_DIST_PATH
zip -r $ETT_UPLOAD_DSYM_PATH $ETT_UPLOAD_DSYM_SRC
tar -C $ETT_DIST_PATH -zcvf  $ETT_PACKAGE_PATH $ETT_IPA_NAME $ETT_UPLOAD_DSYM_FILE
curl -v -u $NEXUS_JENKINS_NAME:$NEXUS_JENKINS_PASSWD --upload-file $ETT_PACKAGE_PATH  服務器路徑$ETT_APP_NAME/ios/$ETT_VERSION_PRO$ETT_BUILD_TYPE/$ETT_NEXUS_FILE_NAME

 

到這裡,Jenkins的簡單集成過程算完成了,裡面涉及到一些環境變數和引數的設置,筆者因為還涉及到Swift和OC混合打包,問題稍多一點.因為業務需求不一樣,需要自己去單獨設置,有疑問的地方可以一起溝通一下.

Xcode Server集成方案

這個方案,將會把上面三個過程穿插進去,不在單列出來.網上有其他方案是macOS Server + Xcode Server集成方案,本文只是簡單介紹一下通過Xcode Server集成

 

打開Xcode Server

 

 

配置Xcode Server管理員賬號

 

 

創建Bot(值守機器人)

 

配置完成後,然後通過Xcode->Product->Create Bot

 

 

配置倉庫分支

 

配置代碼倉庫,Xcode集成了Git所以針對你的專案倉庫直接添加分支即可.

 

 

編譯打包引數配置

 

分支添加完成後,就可配置編譯的一些選項:scheme,ExportOptionsPlist,Configuration等.

 

 

構建觸發器

 

 

添加簽名檔案

 

下一步添加證書,描述檔案等,作者這裡選擇的是自動簽名樣式,如果需要可自己指定簽名證書,描述檔案等,這裡不再細說.

 

添加環境變數

 

 

下一步就是添加編譯之前和編譯打包之後的動作

 

添加打包後的腳本命令

 

 

這裡你可以把打包結果上傳到指定位置,腳本可自行查找.

集成打包

 

機器人創建完成後會自動運行編譯打包一次,下次打包可以直接通過點擊Integrate觸發打包.

 

總結

兩種方案,整個過程走下來並不是很複雜.這裡提醒一下,由於Jenkins打包通過腳本命令執行編譯打包,這個又依賴於一些環境變數和引數,如果一些插件和引數變了,IDE更新了,系統更新了等等原因,這些很容易造成打包失敗,筆者經歷多次了,一般就是先把命令拿到終端裡面編譯打包試一下,排除編譯命令問題,然後在除錯Jenkins環境.總結下來就是遇到問題時不要著急,慢慢分析,一點一點除錯,總會解決的.

 

最後打個廣告:
模仿推特客戶端(純Swift開發,develop分支):
https://github.com/waitwalker/MyTwitter
針對這個客戶端簡單用Python寫了幾個接口:
https://github.com/waitwalker/MyTwitterAPI
文章地址:https://www.jianshu.com/p/42ed698c57ad,因為一直在寫code,文章比較糙,還沒來及整理,抱歉!

已同步到看一看
赞(0)

分享創造快樂