Xcode Server教程

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)前登錄用戶惠遏。


開啟Xcode Server

點擊Continue后,會去配置并啟動Server骏啰,完成以后节吮,界面如下:


配置Xcode 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'衷畦。


為Bot命名

添加服務(wù)器

輸入賬號密碼

在這里,我選擇的是作為'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中望薄。


image.png

2.3連接到代碼倉庫

首先你的項目要使用git疟游,Xcode能直接讀取你的項目的倉庫信息。在下面的界面中痕支,點擊Sign In...颁虐,輸入git賬號密碼登陸之后,可以從下拉框中選擇具體的分枝卧须,然后點擊Next另绩。


連接倉庫

2.4設(shè)置構(gòu)建配置

設(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文件,直接用這個文件即可可岂。


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>&lt;none&gt;</string>
</dict>
</plist>

2.5設(shè)置構(gòu)建觸發(fā)器

可以選擇的類型:周期性構(gòu)建缕粹,每次提交構(gòu)建稚茅,手動構(gòu)建。這里我們選擇手動構(gòu)建平斩。
下面可以勾選升級Xcode之后自動構(gòu)建亚享。
另外還可以設(shè)置每次構(gòu)建前是否Clean。


設(shè)置構(gòu)建觸發(fā)器

2.6選擇設(shè)備類型

可以選擇的類型:iOS設(shè)備和模擬器绘面、iOS設(shè)備欺税、模擬器,這里我們選iOS設(shè)備


選擇設(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)境變量可以在后面的腳本中使用


配置環(huán)境變量

2.9配置觸發(fā)器

點擊左下方的加號亚脆,彈出菜單。在這里我們可以添加構(gòu)建前執(zhí)行的腳本盲泛、構(gòu)建后執(zhí)行的腳本濒持,以及郵件相關(guān)的觸發(fā)器


添加觸發(fā)器

構(gòu)建前執(zhí)行的腳本键耕,一般會修改Build號,或者執(zhí)行CocoaPods相關(guān)的操作柑营。


構(gòu)建前執(zhí)行的腳本

上面的腳本會自動把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í)行玻靡。


執(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)行管理耗绿,如編輯,刪除等砾隅。


image.png

查看log

點擊integrate左邊的三角展開菜單误阻,選擇Logs,可以查看本次集成的log,編譯究反、版本控制寻定、觸發(fā)器的log都能看到,打包失敗的時候奴紧,可以通過這些log來分析失敗原因


image.png

從瀏覽器中訪問Xcode Server

在瀏覽器中訪問Xcode Server的地址是"https://hostname/xcode",hostname可以是ip地址特姐、服務(wù)器的遠(yuǎn)程主機名或者本地主機名。在電腦版瀏覽器中可以執(zhí)行開始集成黍氮、下載ipa唐含、在Xcode中打開、下載Archive等操作沫浆,手機瀏覽器中只能執(zhí)行開發(fā)集成捷枯、安裝ipa操作。

從瀏覽器中訪問Xcode Server

OTA安裝

要使用OTA安裝专执,必須使用hostname來訪問淮捆。
1.點擊 'PROFILE' 安裝Xcode Server的根證書,并信任證書本股。
2.打開 設(shè)置 -> 通用 -> 關(guān)于 -> 證書信任設(shè)置攀痊,打開Xcode Server Root Certificate Authority。
3.點擊 'INSTALL' 安裝APP拄显。


OTA安裝

構(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伊滋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碳却,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笑旺,更是在濱河造成了極大的恐慌昼浦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燥撞,死亡現(xiàn)場離奇詭異座柱,居然都是意外死亡,警方通過查閱死者的電腦和手機物舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門色洞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冠胯,你說我怎么就攤上這事火诸。” “怎么了荠察?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵置蜀,是天一觀的道長。 經(jīng)常有香客問我悉盆,道長盯荤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任焕盟,我火速辦了婚禮秋秤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己灼卢,他們只是感情好绍哎,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞋真,像睡著了一般崇堰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩咖,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天海诲,我揣著相機與錄音,去河邊找鬼抠藕。 笑死饿肺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盾似。 我是一名探鬼主播敬辣,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼零院!你這毒婦竟也來了溉跃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤告抄,失蹤者是張志新(化名)和其女友劉穎撰茎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體打洼,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡龄糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了募疮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫惩。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖阿浓,靈堂內(nèi)的尸體忽然破棺而出他嚷,到底是詐尸還是另有隱情,我是刑警寧澤芭毙,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布筋蓖,位于F島的核電站,受9級特大地震影響退敦,放射性物質(zhì)發(fā)生泄漏粘咖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一侈百、第九天 我趴在偏房一處隱蔽的房頂上張望涂炎。 院中可真熱鬧忠聚,春花似錦、人聲如沸唱捣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽震缭。三九已至,卻和暖如春战虏,著一層夾襖步出監(jiān)牢的瞬間拣宰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工烦感, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巡社,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓手趣,卻偏偏與公主長得像晌该,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绿渣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

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