2000年Matin Fowler發表文章Continuous Integration【1】;2007年,Paul Duvall, Steve Matyas 和 Andrew Glover合著的《Continuous Integration:Improving Software Quality and Reducing Risk》 【2】出版發行,該書獲得了2008年的圖靈大獎。持續整合理念經過10多年的發展,已經成為了 業界的標準。在Java, Ruby的世界已經誕生了非常成熟的持續整合工具和實踐,而對於iOS領域來說, 因為技術本身相對比較年輕和蘋果與生俱來的封閉思想,在持續整合方面的發展相對滯後一些,但是, 隨著越來越多的iOS開發人員的湧入,以及各個互連網巨頭加大對iOS開發的投入,誕生了一大批非常好用 的持續整合工具和服務,本文的目的就是介紹一下如何有效利用這些類庫,服務快速構建一個iOS開發 環境下的持續整合平台。
自動化構建
在MartinFowler的文章[1]中關於自動化的構建定 義如下:
Anyone should be able to bring in a virgin machine, check the sources out of the repository, issue a single command, and have a running system on their machine.
因此,自動化構建的的首要前提是有一個支援自動化構建的命令列 工具,可以讓開發人員可以通過一個簡單的命令運行當前項目。
命令列工具
自動化構 建的命令列工具比持續整合的概念要誕生得早很多,幾十年前,Unix世界就已經有了Make,而Java世界 有Ant,Maven,以及當前最流行的Gradle,.Net世界則有Nant和MSBuild。作為以GUI和命令列操作結合 的完美性著稱的蘋果公司來說,當然也不會忘記為自己的封閉的iOS系統提供開發環境下命令列編譯工具 :xcodebuild【3】
xcodebuild
在介紹xcodebuild之前,需要先弄清楚一些在XCode環 境下的一些概念【4】:
Workspace:簡單來說,Workspace就是一個容器,在該容器中可以存放多個你建立的Xcode Project , 以及其他的項目中需要使用到的檔案。使用Workspace的好處有,1),擴充項目的可視域,即可以在多 個項目之間跳轉,重構,一個項目可以使用另一個項目的輸出。Workspace會負責各個Project之間提供 各種相互依賴的關係;2),多重專案之間共用Build目錄。
Project:指一個項目,該項目會負責管理產生一個或者多個軟體產品的全部檔案和配置,一個 Project可以包含多個Target。
Target:一個Target是指在一個Project中構建的一個產品,它包含了構建該產品的所有檔案,以及 如何構建該產品的配置。
Scheme:一個定義好構建過程的Target成為一個Scheme。可在Scheme中定義的Target的構建過程有: Build/Run/Test/Profile/Analyze/Archive
BuildSetting:配置產品的Build設定,比方說,使用哪個Architectures?使用哪個版本的SDK?。 在Xcode Project中,有Project層級的Build Setting,也有Target層級的Build Setting。Build一個產 品時一定是針對某個Target的,因此,XCode中總是優先選擇Target的Build Setting,如果Target沒有 配置,則會使用Project的Build Setting。
弄清楚上面的這些概念之後,xcodebuild就很好理解了,官網上對其作用的描述如下:
xcodebuild builds one or more targets contained in an Xcode project, or builds a scheme contained in an Xcode workspace or Xcode project.
xcodebuild就是用了構建產品的命令列工具,其用法可以歸結為3個部分:
可構建的對象
構建行為
一些其他的輔助命令
可以構建的對象有,預設情況下會運行project下的第一個target:
workspace:必須和“-scheme”一起使用,構建該workspace下的一個scheme。
project:當根目錄下有多個Project的時候,必須使用“-project”指定project,然後會運行
target:構建某個Target
scheme:和“-workspace”一起使用,指定構建的scheme。
……