iOS持續集成構建

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

Jenkins集成方案

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

下載Jenkins

下載Jenkins.png

安裝Jenkins

安裝Jenkins.png

設置管理員賬號密碼

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


獲取初始密碼Jenkins.png

Jenkins插件安裝

????????初始化完成后,就可以利用管理員賬號登錄.登錄后通??梢园惭b一些常用插件,一般有默認插件和自定義插件,選擇默認插件即可.


Jenkins安裝插件.png

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


Jenkins工作流程.png

步驟1 拉取代碼

git倉庫分支配置.png

????????拉取代碼過程比較簡單,主要是從指定倉庫中克隆代碼到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.png

配置Xcode Server管理員賬號

配置Xcode Server管理員賬號.png

創建Bot(值守機器人)

????????配置完成后,然后通過Xcode->Product->Create Bot
創建值守機器人.png

配置倉庫分支

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


配置倉庫分支.png

編譯打包參數配置

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


編譯打包參數配置.png

構建觸發器

構建觸發器.png

構建觸發器.png

添加簽名文件

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


添加簽名文件.png

添加環境變量

添加環境變量.png

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

添加打包后的腳本命令

添加打包后的腳本命令.png

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

集成打包

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


集成打包.png

總結

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372