Xcode Server 教程1:入門

zaishaoyi發表於2015-09-08

這篇文章是Xcode Server系列教程的第一部分。新的文章將會在我的Twitter(@czechboy0)上釋出。

我們都知道Xcode Server是如何工作的。你的iOS團隊成員花費數週的時間做一個特徵分支,並且在這段時間裡他沒有把別人所做的修改合併到自己的程式碼裡面。當PM催促團隊成員交付既定的功能時,他會建立一個pull請求。人們快速瀏覽程式碼(因為它包含四千多行追加程式碼),完成程式碼稽核之後,合併程式碼,一切就完成了,對嗎?

並非如此。

你著手於新特徵,期待有喝彩和掌聲,因為這也預示著接下來幾周要辛苦工作。然而,你卻沉溺於Twitter。最終,你沒有對新特徵進行適當的測試,應用程式在32位裝置上崩潰了。

並不是一個真實的故事,但卻時有發生。我們大多數人都在這樣團隊工作過:持續整合(CI)不是他們工作的一部分。或許他們認為自己的團隊太小沒必要使用這麼先進的工具,也或許他們太忙沒有時間安裝。

持續整合是一種軟體開發實踐,即瞭解你合併的內容,時常合併。

 

這是我個人對持續整合的理解。在上面的事例中,這兩個特性都被破壞了。首先,團隊不知道他們在合併什麼東西(一個bug使得他們的app無法在32位裝置上使用)。其次,由於沒有時常合併程式碼,導致最後存在大量差異,無人可以對這樣的程式碼進行合理評審。只要他們使用CI工具,遵循CI實踐,這兩個問題都是可以避免的。

如果你的團隊還沒有使用CI,或者你們已經使用了整合工具但使用效果並不令人滿意,那麼這篇文章就是為你而準備的。今天,我將展示如何使用Apple公司開發的持續整合伺服器——XCode Server(簡寫為“XCS”)。

XCS之所以能成為我所有專案的專用解決方案,原因有很多:

  • 免費
  • 自託管
  • 可以在已連線的iOS裝置上進行測試
  • 支援應用程式的OTA安裝,即時可用
  • 你可以控制它的XCode版本(不需要等別人來為你更新)
  • 最重要的是,XCS是由XCode的維護者開發的,這意味著你可以得到XCode最新版本和最新特性的支援,這些特性包括程式碼覆蓋圖行為測試結果等等。簡直是無與倫比。

今天,我將展示如何進行基本的配置。在這個系列的後續文章中,我將解釋如何從中獲取CocoaPods(甚至是私有pod)之類的工具,如何歸檔Ad Hoc 和App Store版本,如何插入諸如“Buildasaur ”和“fastlane ”之類的工具,甚至如何編寫相對於Xcode Server API的程式。總的說來,我會展示如何充分利用XCode Server。

這個系列主要講述如何使用XCode Server。如果你想了解XCode Server內部是如何工作的,我已經寫過這樣的一篇文章

所需軟體清單

為了深入理解這篇文章,你需要:

  • 裝有OS X10.10或者以上版本的Mac,Xcode 6或者更高版本
  • 訪問Developer Portal的蘋果開發者賬號

環境

我選擇使用XCode 7 beta 3和OS X Server5 beta 3,儘管它們都是測試版與OS X Server 4和XCode 6 沒有太大區別。所以都使用舊一點的版本應該也沒有問題(只是螢幕看上去會有些許不同)。

本文主旨

本文中,我們要在你的Mac上安裝OS X Server,並使得它與XCode可以一起使用。然後我們在XCode Server上建立一個Bot,來測試一個從GitHub下載下來的iOS 應用程式。 就這樣。非常簡單易懂,這篇文章接下來的部分,我們會更接近一個真實的,更為複雜的iOS開發團隊建立。

我們開始吧!

1.下載OS X Server

XCode需要 OS X Server開啟持續整合服務。在Mac App Store上下載OS X Server一般要花費19.99美元然而,iOS和Mac 開發者可以免費下載。接下來我們要進行免費下載。

瀏覽開發者門戶的OS X 下載區,下載最新版本的OS X Server5(你需要登入你的開發者賬戶。)

現在點選已下載的安裝包,安裝OS X Server。

2.啟用XCode Server

啟動OS X Server(在你的應用程式資料夾下,名字為“Server.app”),點選Services下面的Xcode

然後你需要告訴 OS X Server 使用哪一個XCode,點選“Choose Xcode…”,選擇你的XCode 7(XCode 6 也可以)就可以了。

接下來XCode Server需要花費大約30秒完成準備工作之後點選右上角的ON 開關狀態文字將會變成“Starting”所有準備工作完成,開始執行的時候,可以看到一個綠色的圓點和“Available on your local network…”。

好了,你建立起一個XCode Server!

3.檢出我們的測試工程

現在我們建立一個Bot來測試GitHub上的一個應用程式(這是我為你特別準備的,是不是很善解人意?)正如你期望的,它叫做,“XCSTutorial Project1”。它是一個帶有iOS 應用程式目標的XCode工程。

建立Bot的一種方式是直接由XCode建立。為了後續工作順利進行,首先需要將你的工程檢出到本地。現在我們進行檢出。開啟終端,切換到工作路徑下,比如在你的文件目錄下,執行下面的三個命令:

這會把工程克隆到本地(嚮導的第一步)並在XCode中開啟。請確保你正在使用的XCode與之前在XCode Server中選擇的XCode是同一個(最好是XCode 7)。

4.在XCode中追加Server

在我們建立Bot之前,我們需要在XCode註冊我們新建立的XCode Server。選擇 XCode 的Preferences (CMD+,),然後選擇“Accounts”,在底端點選加號按鈕,選擇“Add Server”。

 

在位址列輸入本機地址(127.0.0.1),因為剛剛在本機上安裝了XCode Server……

然後輸入憑證(與Mac賬戶的憑證相同,對我來說是 User Name: honzadvorsky和我的登入密碼。)

點選“Add”之後,你會看到你的伺服器被追加到XCode的Preference裡面。

5. 建立一個Bot

我一直在說Bot,但是它們到底是什麼東西呢?

Bot,是一個XCS 的專業術語,是一個構建工作的描述。它告訴XCode Server 程式碼位置,如何去生成以及測試程式碼,在生成結束以後通知哪些人等等。執行一次這樣的Bot叫做整合。整合產生有價值的東西,比如archivesIPA測試結果和日誌。

現在來建立我們的第一個Bot。Bot的控制按鈕隱藏在XCode左邊區域的最後一列,Report導航欄下。

在左下方,點選齒輪圖示和“Create Bot…”。

 

現在可以看到彈出了一個與下面類似的表單,注意,核取方塊要求你共享scheme。

這是什麼意思呢?

Scheme 是你 xcodeproj j和 xcworkspace資料夾下的檔案,描述了使用哪一個目標(例如 XCSTutorialProject1 - iOS app)和如何生成(例如Debug 或者 Release)。只有共享的schema才可以檢入到你的程式碼庫並且只有這些共享的schema可以被持續整合服務例如XCode Server使用。

總體而言,schema是一個生成方案。所以要確保XCode Server可以看到它,這裡我們通過共享實現(當在XCode裡面編輯scheme的時候,點選Shared 核取方塊,這會將scheme加入到我們的程式碼庫中)。

第一次在你的專案中建立Bot,你會看到這個。通常,你會繼續並讓XCode提交scheme到你的程式碼庫。但是我已經為你做完了這些。所以,點選Cancel,轉到終端,在你的工程資料夾下執行下面的命令

然後重啟XCode(抱歉,XCode不喜歡自己修改scheme),重複Bot建立過成。這一次,應該沒有關於scheme的訊息了,正如下面截圖所示。

點選下一步,此處你的XCode將會檢查是否有權訪問你的(實際上,此處是我的)程式碼庫。很有可能(如果你像我一樣使用一個自簽證書)會首先看到XCode抱怨“The server SSH fingerprint failed to verify.”這是XCode 7的新的特性,來防止MITM襲擊。你需要點選“View”然後點選“Trust”。這意味著你宣告:“沒有問題,XCode。我瞭解並且相信這個XCode Server,不需要擔心。”

然後,如果你還沒有在XCode的Preferences -> Accounts中登入到你的程式碼庫,XCode會要求你“登入”,它說“請提供證書,以便於XCode Server可以從這個程式碼庫中檢出檔案。”點選“登入”,告訴XCode,是要建立新的SSH鍵還使用既存的。因為在 ~/.ssh/裡面已經存在SSH鍵,所以我告訴XCode “使用既存的SSH鍵”。

你的Bot會獲取選定分支上的變更,生成程式碼的最新版本。這意味著如果你想在多分支上測試程式碼,比如說 master 和 release兩個分支,你需要為它們建立兩個獨立的Bot(在後續的教程中,我們利用Buildasaur使得這個過程連貫起來)。

選擇master,然後點選Next。等一下你會看到所有Bot的配置選項。我們來看一下這些都意味著什麼(這段時間比較適合去喝一杯咖啡或者去趟洗手間……倫敦現在的天氣不錯,不是嗎?……板球……好了,回到Bots!)

6. Bot配置

Schedule告訴Bot什麼時候執行:

  • Periodical 意味著Bot每小時,每天還是每週執行一次
  • On Commit使得Bot每5分鐘從程式碼庫獲取一次最新程式碼,並且無論何時,發現新的提交任務,都會啟動新的整合。在 master 分支上的On Commit Bot可以幫助你快速的發現什麼時候測試開始失敗,而不需要每個人都記著去手工執行測試
  • Manual 只有當點選XCode中的“整合”時才會執行

Actions 告訴Bot要做那些工作:

  • Perform analyze action執行靜態分析
  • Perform test action執行應用程式測試
  • Perform archive action存檔你的應用程式,以備在TestFlight或者應用程式商店釋出時使用。
  • 允許檢視測試覆蓋了哪些程式碼,這個選項會迫使XCode Server收集覆蓋率資料而無需在scheme中將偏好設定為on。如果在本地執行測試,你不想收集覆蓋率資料,但又需要利用在CI 伺服器執行時的覆蓋率,這個特性就顯得非常有用。
  • 標記和匯出,應用程式從生成檔案中通過Wi-Fi直接安裝到iOS裝置上,以後我會專門寫一篇文章介紹你應該如何實現這一操作。

Configuration 允許重寫Bot的生成配置(Debug,Release……)。我總是選擇預設的“Use Scheme Setting”。

Cleaning 通過定期地清除它的所有資源並從scratch上檢出程式碼庫確保Bot不會依賴於 DerivedData 的狀態,或者它的原始檔夾。你曾經遇到過損壞的 Pods 資料夾嗎?這是一種在新的整合(從scratch上檢出所有的東西)開始之前移除所有的產品、中間檔案和原始檔夾的方式。選項有:

  • Always – 每次整合前移除所有的產品和中間產物
  • Once a day – 每天只有第一次整合從scratch開始
  • Once a week – 每週只有第一次整合從scratch開始
  • Never – 不能自動移除產品

選項很多,是嗎?但是,無需擔心,一般使用預設值就可以了。如果不做任何更改,應該是不會有問題的。

現在請確保“Perform test action”被選中,點選下一步。

在這裡,XCode 7 Beta 4 似乎有一個bug,XCode崩潰了。並不是對所有使用者都出現,但是如果你的XCode此時崩潰了,請安裝 XCode7 Beta 5 或者以上版本來代替之前的XCode。

你將會看到一個標題為“Choose the devices that this bot will test with”的頁面,這正是我們現在要選擇的。在頂端的下拉框中有一個值是“iOS”,並且是不可用的。這是因為在一開始選擇的這個scheme告訴XCode Server 我們在一個iOS 目標上生成。

Test With 給了你四個選項

  • All iOS Devices and Simulators – 在所有已連線的iOS裝置和模擬器上進行測試。這會花費一定的時間,因為每個版本的iOS都有10多個模擬器。如果你安裝了兩個XCode,像我現在這樣,就要測試iOS8.4和 iOS 9.0,一共有20多個裝置。然而,如果是隻花費幾秒鐘的單元測試,這個時間是可以的。
  • All iOS Devices – 所有已連線的iOS裝置,不包含模擬器。
  • All iOS Simulators –所有的iOS模擬器,不包含已連線的iOS裝置。
  • Specific iOS Devices – 指定的模擬器和已連線的iOS裝置。

我們選擇最後一個選項,指定的iOS裝置,選擇3個裝置進行測試。如果你已經連線了一個開發裝置,它會直接顯示在列表中,你可以將它包含到你的測試程式(超簡單)。

一直點下一步,直到看到一個叫做“Configure Bot triggers”的頁面。

觸發器是一種在整合之前或者之後執行的行為。XCode Server支援兩種觸發器型別:指令碼和傳送郵件通知。

使用指令碼,你基本上可以實現實現所有功能:執行 pod install,或者 fastlane ,甚至是當生成結束以後通知其他成員。

Weirdness Alert – 有個地方特別容易出錯。當XCode Server檢出程式碼庫的時候,沒有把路徑變更到附錄資料夾(就像你執行 git clone ...到本地的時候,你需要將路徑改變到你的工程目錄)。因此在你的指令碼中,需要做的第一件事情是 cd PROJECT_NAME (在我們的案例中是 cd XCSTutorialProject1)然後再執行 pod install 或者 fastlane。

第二個觸發器型別是傳送郵件通知,它並不是你期望的那樣。當整合結束的時候它會給你傳送一封郵件。然而它比這更聰明。它可以傳送郵件給所有的提交者,因為它知道誰在上一次整合後提交過程式碼。這樣,只有變更程式碼的人會被通知。如果想讓某些地址總是可以收到這些郵件,你也可以追加。

你也可以指定當整合失敗的時候只通知你,你也可以控制這些郵件的內容。非常棒!

建立一種型別的郵件通知,追加上你的郵件地址。但是,不要勾選Bot中傳送給所有的提交者核取方塊。否則,會收到完成整合的郵件(因為我是所有這些內容的提交者。)這是XCode Server一個非常有趣的地方——它的郵件系統不是為開源專案設計的。

你點選“Create”之後,應該可以看到你建立第一個Bot的請求成功了。

祝賀你!建立了第一個Bot。

很好奇你剛才做的這些有什麼意義?看一下教程2,在那篇文章中我們將詳細講解整合結果!

相關文章