搭建 iOS 自動打包發佈持續集成系統

概念

原先搭建這套東西其實沒多少事,可是受人邀請,仍是寫篇文章防止後來人踏坑吧。html

持續集成系統(CI)想必看文章的應該都知道是什麼東西,應該都清楚,若是不太明白的,移步 https://en.wikipedia.org/wiki/Continuous_integrationjava

總結起來其實也很簡單: 把構建和發佈的問題自動化、簡單化。linux

你能夠想象這麼一個場景:git

當你的代碼寫完後,敲入一個git push,CI 系統自動幫你compile/test/archive/publish 而你只須要坐在那邊,喝一杯java就夠了。程序員

對於愛「偷懶」的程序員來講,這是十分愜意的事情,由於咱們最自豪的就是解放本身的生產力,讓本身不要花時間去作一些無心義的事情,既傷神又費力。docker

安裝Gitlab

固然,在當今的時代,咱們擁有docker這種神器,其實安裝這件事情,也已經很傻瓜化了。windows

OK,那麼簡單幾行命令搞定xcode

docker pull gitlab/gitlab-ce
docker run -d -P gitlab/gitlab-ce

若是須要進行端口映射,請參考-p參數bash

當你配置好以後,訪問你的母雞地址,出現這個頁面就是部署好了,而後就是註冊和登錄的事情。app

clipboard.png

安裝Gitlab CI Runner

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環境下使用的比較多,而在windowsOS X下好像並無,這也是爲何我此次踩坑的緣由了。

首先,咱們下載好gitlab-ci-multi-runner的二進制文件,咱們知道要把它作成服務的話,須要如下步驟:

  • register

  • install

  • start

register就是告訴server 這個runner的存在,install是安裝成系統服務,start就是啓動服務啦~ 這3個命令很簡單。

那麼,咱們先執行gitlab-ci-multi-runnerrun看,它是不安裝系統服務,直接跑的命令。

clipboard.png

好嘛,一來就發現刺眼的3個warning,對,就是這3個warning把我帶入了深淵。 它的意思很明確,要求咱們用root身份執行這個命令。

可是!! root是不能在Xcode archive 完以後 進行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 和 xctool

xcodebuild 就是 Xcode 的命令行工具能提供 編譯/測試/打包 等功能,咱們只須要指定workspacescheme或者project便可編譯,指定好Provisioning Profile等證書文件就能打包,可是它的輸出很是很差看,此次咱們使用了xctool 這個工具,它是facebook開發的,用來美化xcodebuild輸出的一個輔助工具,我的很喜歡它的輸出樣式。

安裝xctool也很簡單:

brew install xctool

來一個使用xctool的樣例:

xctool -workspace SegmentFault.xcworkspace  -scheme $PRERELEASE_SCHEME archive -archivePath ./build/SegmentFault.xcarchive

這裏咱們指定了workspacescheme(我用環境變量代替),而後指定了導出xcarchive中間格式的路徑,那麼咱們導出成xcarchive就完成了,若是要導出成IPA,須要這個中間產物。

導出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文件,若是是手工敲命令的話,就是這麼幾個步驟。

集成到Gitlab

那麼如何讓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個任務archiveupload,我在archive的定義中,執行了4條命令,分別是pod相關,carthage相關,而後是xcodebuild相關命令進行打包,iOS程序員應該都知道podcarthage吧,是在打包前給咱們安裝依賴的,依賴安裝好了才能構建,這是常識。

在這個步驟完成以後,咱們執行upload任務,就是調用fir-cli這個工具,把咱們的應用發佈到fir.im上,給測試人員分發測試。

結語

好了,我終於從在Xcode中進行打包,導出後到fir.im上進行上傳ipa操做,並寫Change Log任務這麼一系列很繁瑣的工做中解脫了,之後我就只需在fir這個分支上進行一次push,那麼全部的工做就都作完了,這就是CI的魅力。

趕忙試試吧~

相關文章
相關標籤/搜索