Xcode Server是蘋果官方提供的持續(xù)集成方案减拭,在Xcode 9之前就已經(jīng)存在,不過需要在Mac App Store下載并安裝OS X Server(付費軟件)区丑,使用起來比較繁瑣拧粪。在Xcode 9中,Xcode Server被內(nèi)置在了Xcode中沧侥,于是整個CI環(huán)境搭建過程也大大的簡化了可霎。
Xcode Server的優(yōu)勢
1.免費
2.支持OTA安裝
3.和手動打包使用相同的證書
需要的工具
為了使用此教程,你需要:
- 一臺Mac宴杀,并安裝Xcode 9.0或者更高的版本
- 蘋果開發(fā)者賬號
搭建基本的持續(xù)集成環(huán)境
接下來我們要搭建一個基本的持續(xù)集成環(huán)境癣朗,這個集成環(huán)境可以:
- 拉取制定倉庫的特定分支的代碼
- 指定觸發(fā)CI的條件
- 執(zhí)行Archive操作,并導(dǎo)出Ad-Hoc簽名的安裝包
- 將此安裝包上傳到79服務(wù)器,供測試人員去下載安裝
第1步,開啟Xcode Server
打開Xcode->Preferences->Server & Bots,點擊顯示為OFF的開關(guān),輸入管理員密碼后讥邻,在彈出的窗口中選擇Integration User。蘋果建議是使用一個特定的这揣,非管理員權(quán)限的用戶涝开,不過也可以使用當(dāng)前登錄的用戶。在這里护赊,可以直接選擇當(dāng)前登錄用戶惠遏。
點擊Continue后,會去配置并啟動Server骏啰,完成以后节吮,界面如下:
至此,Xcode Server就已經(jīng)啟動了判耕⊥讣ǎ可以根據(jù)自己的需要,對Server進(jìn)行配置壁熄,暫時我們不用修改任何設(shè)置帚豪。
第2步,添加Bot
2.1 在Xcode中打開項目草丧,點擊Product->Create Bot...
要創(chuàng)建Bot狸臣,必須在打開項目的狀態(tài)下,否則'Product->Create Bot...'項是灰色的昌执,無法點擊烛亦。
2.2 連接到服務(wù)器
在彈出窗口中诈泼,可以為Bot命名,然后從下拉框中選擇'Add New Server...'煤禽。
在接下來的界面中铐达,從列表中選擇Server,然后點擊'Next'檬果。
然后瓮孙,輸入用戶名,密碼汁汗,點擊'Add'衷畦。
在這里,我選擇的是作為'Registered user'的身份連接到Server知牌,然后輸入當(dāng)前登錄用戶的用戶名和密碼祈争。回想一下角寸,在開啟Server的時候菩混,我們選擇的Integration User是當(dāng)前登錄用戶。
如果選擇'Guest'扁藕,雖然也可以沮峡,但是之后會發(fā)現(xiàn),無法對創(chuàng)建好的Bot進(jìn)行編輯亿柑。
這一步的結(jié)果邢疙,實質(zhì)上是創(chuàng)建了一個Xcode Server類型的Account,并添加到Xcode中望薄。
2.3連接到代碼倉庫
首先你的項目要使用git疟游,Xcode能直接讀取你的項目的倉庫信息。在下面的界面中痕支,點擊Sign In...颁虐,輸入git賬號密碼登陸之后,可以從下拉框中選擇具體的分枝卧须,然后點擊Next另绩。
2.4設(shè)置構(gòu)建配置
Scheme: 選擇要構(gòu)建哪個scheme,被構(gòu)建的scheme必須是共享的花嘶。所以如果scheme是未共享的狀態(tài)笋籽,請保持'Share and commit scheme'被選中,Xcode會自動設(shè)置scheme為共享狀態(tài)察绷。
Actions:指定要執(zhí)行哪些動作干签。一共有3類,Analyze(代碼靜態(tài)分析)拆撼,Test(測試)容劳, Archive(打包)喘沿。
針對Export,需要選擇'Use Custom Export Options Plist'竭贩,因為如果使用默認(rèn)選項蚜印,打出來的包總是用iPhone Developer的證書進(jìn)行的簽名,無法打出Ad-Hoc類型的包留量。
至于ExportOptions.plist窄赋,可以通過下面的辦法得到:手動執(zhí)行Product->Archive,然后導(dǎo)出Ad-Hoc安裝包楼熄,在導(dǎo)出的目錄中忆绰,就包含了一個ExportOptions.plist文件,直接用這個文件即可可岂。
其實這個文件就是一個plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key><!-- 是否打開bitcode -->
<true/>
<key>destination</key><!-- 導(dǎo)出或者上傳 -->
<string>export</string>
<key>method</key><!-- 方式development错敢、ad-hoc、app-store -->
<string>ad-hoc</string>
<key>signingStyle</key><!-- 簽名方式 -->
<string>automatic</string>
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key><!-- 開發(fā)者teamID -->
<string>65XUT4T932</string>
<key>thinning</key><!-- 是否使用app thin -->
<string><none></string>
</dict>
</plist>
2.5設(shè)置構(gòu)建觸發(fā)器
可以選擇的類型:周期性構(gòu)建缕粹,每次提交構(gòu)建稚茅,手動構(gòu)建。這里我們選擇手動構(gòu)建平斩。
下面可以勾選升級Xcode之后自動構(gòu)建亚享。
另外還可以設(shè)置每次構(gòu)建前是否Clean。
2.6選擇設(shè)備類型
可以選擇的類型:iOS設(shè)備和模擬器绘面、iOS設(shè)備欺税、模擬器,這里我們選iOS設(shè)備
2.7為你的服務(wù)器配置簽名和證書
這里我們選擇自動證書管理揭璃,只需要登錄開發(fā)者賬號密碼魄衅。下面還有一個自動注冊設(shè)備可以勾選。
但是實際操作中塘辅,我們發(fā)現(xiàn)一些坑
1.服務(wù)器上必須要安裝根證書p12
2.每次注冊新設(shè)備之后,必須要手動打包生成provisioning profile皆撩,才能打包成功
當(dāng)然扣墩,我們也可以選擇手動管理證書,然而自動證書管理能省掉很多工作量扛吞,所以還是推薦自動管理證書呻惕。
2.8配置環(huán)境變量
1.首先可以添加傳遞給xcodebuild的參數(shù),支持的參數(shù)可以通過終端輸入'xcodebuild --help'來查詢
2.可以添加自定義的環(huán)境變量滥比,這些環(huán)境變量可以在后面的腳本中使用
2.9配置觸發(fā)器
點擊左下方的加號亚脆,彈出菜單。在這里我們可以添加構(gòu)建前執(zhí)行的腳本盲泛、構(gòu)建后執(zhí)行的腳本濒持,以及郵件相關(guān)的觸發(fā)器
構(gòu)建前執(zhí)行的腳本键耕,一般會修改Build號,或者執(zhí)行CocoaPods相關(guān)的操作柑营。
上面的腳本會自動把Build號修改成當(dāng)前時間屈雄。
觸發(fā)器代碼的運行環(huán)境其實就是終端,它的當(dāng)前目錄是工程目錄的上一級目錄官套。腳本可以使用我們在前一步中添加的環(huán)境變量酒奶,也能使用一些Xcode Server定義的環(huán)境變量
我們來解釋一下上面的代碼:
1.cd到工程目錄
2.用agvtool修改Build號
3.提交代碼到git服務(wù)器
構(gòu)建后執(zhí)行的腳本,一般會把打好的包上傳至服務(wù)器奶赔、蒲公英等惋嚎,下面是我們的上傳腳本:
#!/bin/sh
PRODUCT_PATH="${XCS_PRODUCT}" #!ipa文件所在的路徑
WNL_VERSION=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString"
./Calendar/CalendarOS7/CalendarOS7-Info.plist` #!獲取版本號
filename="WNL_V${WNL_VERSION}_`date +%y%m%d%H%M`.ipa"#!新的文件名
tempPath="Desktop/tmp"#!臨時目錄地址,用來掛載網(wǎng)絡(luò)磁盤
server="http://employee:killers1024@192.168.1.79/Documents2"#!網(wǎng)絡(luò)磁盤的地址
#!判斷當(dāng)前是否已經(jīng)掛載了網(wǎng)絡(luò)磁盤站刑,如果掛載了另伍,先卸載
drives_to_unmount=`df | awk '/employee@192.168.1.79/ { print $9 }'`
if [ "$drives_to_unmount" != "" ]
then
umount ${drives_to_unmount}
fi
mkdir -p ~/${tempPath}#!創(chuàng)建臨時文件夾
mount -t smbfs ${server} ~/${tempPath}#!掛載網(wǎng)絡(luò)磁盤
mkdir -p ~/${tempPath}/ios主包/${WNL_VERSION}#!創(chuàng)建打包文件夾
cp ${PRODUCT_PATH} ~/${tempPath}/ios主包/${WNL_VERSION}/${filename}#!將ipa復(fù)制到打包文件夾下
umount ~/${tempPath}#!卸載磁盤
echo 上傳成功
創(chuàng)建構(gòu)建后腳本時,你需要選擇什么情況下執(zhí)行笛钝,這里我們選擇編譯警告质况、成功、所有問題被解決時執(zhí)行玻靡。
點擊Done,一個基本的Bot就配置好了结榄,第一次的Integration自動開始。在集成結(jié)束的時候囤捻,打包出的IPA文件會被上傳到我們的服務(wù)器臼朗。
查看集成的結(jié)果并管理Bots, Integrations
在Xcode中,轉(zhuǎn)到Report Navigator蝎土,選擇Bot或是某次集成视哑,在右側(cè)的窗口區(qū)域,可以查看集成結(jié)果誊涯,觸發(fā)一次新的集成挡毅,保存ipa,安裝ipa暴构,保存archive跪呈,在Organizer中顯示archive,上傳到App Store取逾,以及對Bots進(jìn)行管理耗绿,如編輯,刪除等砾隅。
查看log
點擊integrate左邊的三角展開菜單误阻,選擇Logs,可以查看本次集成的log,編譯究反、版本控制寻定、觸發(fā)器的log都能看到,打包失敗的時候奴紧,可以通過這些log來分析失敗原因
從瀏覽器中訪問Xcode Server
在瀏覽器中訪問Xcode Server的地址是"https://hostname/xcode",hostname可以是ip地址特姐、服務(wù)器的遠(yuǎn)程主機名或者本地主機名。在電腦版瀏覽器中可以執(zhí)行開始集成黍氮、下載ipa唐含、在Xcode中打開、下載Archive等操作沫浆,手機瀏覽器中只能執(zhí)行開發(fā)集成捷枯、安裝ipa操作。
OTA安裝
要使用OTA安裝专执,必須使用hostname來訪問淮捆。
1.點擊 'PROFILE' 安裝Xcode Server的根證書,并信任證書本股。
2.打開 設(shè)置 -> 通用 -> 關(guān)于 -> 證書信任設(shè)置攀痊,打開Xcode Server Root Certificate Authority。
3.點擊 'INSTALL' 安裝APP拄显。
構(gòu)建時的一些目錄
/Library/Developer/XcodeServer/IntegrationAssets:這個目錄會保存所有的Bot的每一次的集成結(jié)果苟径,IPA文件,符號文件都可以在目錄中找到躬审。
~/Library/Caches/XCSBuilder/Bots/xxx/:xxx代表一個Bot的ID棘街,在該目錄下的Source目錄,存放的是從倉庫中拉到的代碼承边。
常見的坑
1.單獨使用一臺Mac來作為打包服務(wù)器遭殉,不然一打包,你就別想敲代碼了博助,卡到你懷疑人生险污。
2.打包速度慢。經(jīng)過多次觀察富岳,我發(fā)現(xiàn)打包有一個過程Process Warning非常緩慢罗心。我們的項目之前有大概2500個警告,后來我把警告減少到100個以內(nèi)城瞎,打包時間從30多分鐘提升到10分鐘,減少了三分之二的時間疾瓮。
3.編譯成功脖镀,但是導(dǎo)出失敗。基本都是證書問題蜒灰,Xcode Server不能自動生成profile弦蹂,去服務(wù)器手動打包一次生成profile,然后再用Xcode Server打包强窖,就能成功過打包了凸椿。
4.打包過程中不要修改系統(tǒng)時間。這個是真的坑翅溺,Xcode Server一次只能打一個包脑漫,正在打包的時候再點其它Bot的打包,會顯示前面有一個集成正在運行咙崎,要等執(zhí)行完了才能開始打包优幸,如果打包過程中修改了系統(tǒng)時間,即使前面一個包打完了褪猛,后面的也不會開始网杆,重啟都不行,只能重裝Xcode伊滋。