
Xcode 9 集成了 Xcode Server,蘋果提供了一個自帶的 CI 方案。之前我使用的是 Jenkins + fastlane 的方案,所以我嘗試了下能否用 Xcode Server 作為代替。
配置 Xcode Server
首先下載 Xcode 9,在 Xcode 設(shè)置的最后一個頁簽就能找到 Xcode Server。

點擊右上角的 OFF/ON 按鈕打開 Xcode Server,Xcode 會彈出提示讓你創(chuàng)建 Xcode Server,推薦使用新的非管理員 Mac 賬號。

完成之后 Xcode 就會在 Mac 賬號下自動配置和創(chuàng)建一個 Xcode Server 服務,這樣服務端的任務就完成了,是不是很簡單。
設(shè)置客戶端
現(xiàn)在你有了一個 Xcode Server 服務,那怎么才能搭建 CI ?這時候需要創(chuàng)建一個客戶端。還是在 Xcode 的配置菜單里,切到第二個 Accounts 頁簽內(nèi),點擊左下角的加號。

在彈出的菜單里選擇 Xcode Server。團隊里的每個人都可以建立一個客戶端賬號,對于沒有修改 Xcode Server 權(quán)限的人就只需要選擇 Guest 賬號登錄即可。
創(chuàng)建 Bot ???
最后,通過創(chuàng)建 Bot 來運行具體的 CI 任務。點擊 Xcode Menu 里的 Product -> Create Bot...

Xcode 會彈出 Bot 的配置頁面,一步一步的按需求配置即可,所有的配置之后也可以再編輯。

創(chuàng)建好 Bot 之后,可以在 Xcode 的 report navigator 里查看。

右鍵點擊 Bot 就可以做 創(chuàng)建/編輯/刪除 等操作,還可以在網(wǎng)頁上查看 Bot 的狀態(tài)??梢越o integrate(集成)配置 trigger,有任務之前和之后執(zhí)行的兩種腳本。點擊 integrate 會在右側(cè)看到報表數(shù)據(jù),包括任務狀態(tài)、測試數(shù)據(jù)、打印信息等。
Xcode Server 是 Xcode 9 發(fā)布之前就已經(jīng)有的,所以有一個舊的配置文檔可以參考 Xcode Server and Continuous Integration Guide。
發(fā)布
如果之前使用過別的 CI 工具,不如 Jenkins、fastlane 等,Xcode Server 相比可能沒有那么強大。只是用來給工程做 編譯 CI 或者測試還好,但如果需要發(fā)布就不太好用了。
OTA
測試包的部署一般都需要 OTA 安裝,即通過 itms 協(xié)議直接在網(wǎng)頁安裝 ipa 包。Xcode Server 集成的網(wǎng)頁是由 OTA 安裝的,但是通過提示得知蘋果為了安全,OTA 安裝只能通過服務器的局域網(wǎng)域名 server.local 來訪問。而 server.local 在不同網(wǎng)段貌似是沒有廣播,導致一般情況下無法訪問。
Triggers
另一種方法是通過 triggers 將打好的包上傳到測試平臺(比如 HockeyApp)或者上傳到 TestFlight 用于提交審核。

比如可以添加一個 post-ingegration scripts 來上傳 ipa。 如果使用 fastlane,可以在 fastfile 里用類似ENV[‘XCS_ARCHIVE’]的方式來配置環(huán)境變量,具體查看Xcode Server Environment Variable Reference。
但是我試過幾次之后發(fā)現(xiàn)會出現(xiàn)一些奇怪的問題,比如無法通過 ENV[‘XCS_ARCHIVE’]/dSYMs 獲取到 dsym 的路徑。
如果在 Bot 配置里選擇了 export Archive 選項,Xcode Server 在任務成功后會導出 Archive 包并提供下載。但是經(jīng)常碰到 Archive 包無法下載的情況,而同時 ipa 包下載就沒有問題,而且也排除了是網(wǎng)絡問題。
結(jié)論
Xcode Server 非常容易配置和使用,但并不足以取代成熟的 CI 方案(比如 Jenkins + fastlane)。所以我現(xiàn)在使用 Xcode Server 做 CI 和 測試,同時使用 fastlane 做發(fā)布。希望之后 Xcode 9 能更新 Xcode Server 的功能和穩(wěn)定性。