原先搭建這套東西其實沒多少事,可是受人邀請,仍是寫篇文章防止後來人踏坑吧。html
持續集成系統(CI)想必看文章的應該都知道是什麼東西,應該都清楚,若是不太明白的,移步 https://en.wikipedia.org/wiki/Continuous_integrationjava
總結起來其實也很簡單: 把構建和發佈的問題自動化、簡單化。linux
你能夠想象這麼一個場景:git
當你的代碼寫完後,敲入一個git push,CI 系統自動幫你
compile
/test
/archive
/publish
而你只須要坐在那邊,喝一杯java
就夠了。程序員
對於愛「偷懶」的程序員來講,這是十分愜意的事情,由於咱們最自豪的就是解放本身的生產力,讓本身不要花時間去作一些無心義的事情,既傷神又費力。docker
固然,在當今的時代,咱們擁有docker這種神器,其實安裝這件事情,也已經很傻瓜化了。windows
OK,那麼簡單幾行命令搞定xcode
docker pull gitlab/gitlab-ce docker run -d -P gitlab/gitlab-ce
若是須要進行端口映射,請參考-p
參數bash
當你配置好以後,訪問你的母雞地址,出現這個頁面就是部署好了,而後就是註冊和登錄的事情。app
Gitlab
最新版中已經將CI
系統內置了,因此咱們只須要部署runner
便可。runner
是啥概念?由於咱們的CI
在跑的時候,不該該被它的安裝環境所限制,好比咱們把CI
安裝在linux
下,這時候想打包iOS
可能就辦不到了,因此Gitlab CI
就把整個 CI 拆成兩個部分,一個server
和一個runner
,現在server
也都內置到Gitlab
裏去了,因此安裝好了就行了。
那麼咱們能夠在一臺 Mac 上安裝好runner
連上Gitlab
便可。
https://gitlab.com/gitlab-org/gitlab-ci-multi-runner
這個傳送門是到gitlab-ci-multi-runner
的,上面有介紹瞭如何安裝使用runner
。可是要注意的是,它通常都會在linux
環境下使用的比較多,而在windows
和OS X
下好像並無,這也是爲何我此次踩坑的緣由了。
首先,咱們下載好gitlab-ci-multi-runner
的二進制文件,咱們知道要把它作成服務的話,須要如下步驟:
register
install
start
register
就是告訴server
這個runner
的存在,install
是安裝成系統服務,start
就是啓動服務啦~ 這3個命令很簡單。
那麼,咱們先執行gitlab-ci-multi-runner
的run
看,它是不安裝系統服務,直接跑的命令。
好嘛,一來就發現刺眼的3個warning
,對,就是這3個warning
把我帶入了深淵。 它的意思很明確,要求咱們用root
身份執行這個命令。
可是!!
root
是不能在Xcodearchive
完以後 進行codesign
的!即時你在gitlab-ci-multi-runner
指定了--user
也不行!!
因此,咱們在這裏要作的就是無視這3個warning,轉而用咱們本身用戶的身份進行安裝服務
gitlab-ci-multi-runner install --config xxxx -d /tmp gitlab-ci-multi-runner start
便可,-d
是指定runner
的工做目錄,也就是把代碼庫clone
下來的目錄,我指定到了/tmp
文件夾。
xcodebuild
就是 Xcode
的命令行工具能提供 編譯/測試/打包 等功能,咱們只須要指定workspace
和scheme
或者project
便可編譯,指定好Provisioning Profile
等證書文件就能打包,可是它的輸出很是很差看,此次咱們使用了xctool
這個工具,它是facebook
開發的,用來美化xcodebuild
輸出的一個輔助工具,我的很喜歡它的輸出樣式。
安裝xctool
也很簡單:
brew install xctool
來一個使用xctool
的樣例:
xctool -workspace SegmentFault.xcworkspace -scheme $PRERELEASE_SCHEME archive -archivePath ./build/SegmentFault.xcarchive
這裏咱們指定了workspace
和scheme
(我用環境變量代替),而後指定了導出xcarchive
中間格式的路徑,那麼咱們導出成xcarchive
就完成了,若是要導出成IPA
,須要這個中間產物。
而後導出IPA,咱們使用xcodebuild
命令:
xcodebuild -exportArchive -archivePath ./build/SegmentFault.xcarchive -exportPath ./build -exportOptionsPlist ./ExportOptions.plist CODE_SIGN_IDENTITY="$CODE_SIGN_IDENTITY" PROVISIONING_PROFILE="$PROVISIONING_PROFILE"
ExportOptions.plist
裏面指定了一些選項,好比導出的環境(AppStore/AdHoc/Developer等),其實就是咱們在Xcode
/Origanizer
中配置到的那些:
<?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> <false/> <key>method</key> <string>ad-hoc</string> </dict> </plist>
執行完xcodebuild
就獲得了咱們的ipa
文件,若是是手工敲命令的話,就是這麼幾個步驟。
那麼如何讓CI跑這些命令呢?這時候咱們就須要使用Gitlab CI
中的.gitlab.yml
這個文件了,Gitlab
只要檢測到有這個文件,就會開始構建你的項目,具體的使用說明能夠看這裏:http://docs.gitlab.com/ce/ci/yaml/README.html
那麼貼一個個人樣例
variables: PRERELEASE_SCHEME: "SegmentFault_Alpha" CODE_SIGN_IDENTITY: "xxxxxx" PROVISIONING_PROFILE: "xxxxx" LANG: "en_US.UTF-8" stages: - archive - upload archive: stage: archive script: - pod install - carthage update --platform iOS - xctool -workspace SegmentFault.xcworkspace -scheme $PRERELEASE_SCHEME archive -archivePath ./build/SegmentFault.xcarchive - "xcodebuild -exportArchive -archivePath ./build/SegmentFault.xcarchive -exportPath ./build -exportOptionsPlist ./ExportOptions.plist CODE_SIGN_IDENTITY=\"$CODE_SIGN_IDENTITY\" PROVISIONING_PROFILE=\"$PROVISIONING_PROFILE\"" only: - fir artifacts: expire_in: '1 day' paths: - ./build/$PRERELEASE_SCHEME.ipa upload: stage: upload only: - fir script: - fir publish -T xxxxxx -c ./CHANGELOG ./build/$PRERELEASE_SCHEME.ipa dependencies: - archive
這裏咱們看到stages
總共作了2個任務archive
和upload
,我在archive
的定義中,執行了4條命令,分別是pod
相關,carthage
相關,而後是xcodebuild
相關命令進行打包,iOS程序員應該都知道pod
和carthage
吧,是在打包前給咱們安裝依賴的,依賴安裝好了才能構建,這是常識。
在這個步驟完成以後,咱們執行upload
任務,就是調用fir-cli
這個工具,把咱們的應用發佈到fir.im
上,給測試人員分發測試。
好了,我終於從在Xcode
中進行打包,導出後到fir.im
上進行上傳ipa
操做,並寫Change Log
任務這麼一系列很繁瑣的工做中解脫了,之後我就只需在fir
這個分支上進行一次push
,那麼全部的工做就都作完了,這就是CI
的魅力。
趕忙試試吧~