iOS持續整合從入門到放棄(1)

發表於2016-08-04

最近公司要整持續整合打包,於是就入坑了,在搜尋的過程中發現並沒有一些完備的資料,於是我就決定開始開坑了。。。發車!

工具—fastlane(快發車-_-!)

fastlane 是一套自動化打包的工具集,用 Ruby 寫的,用於 iOS 和 Android 的自動化打包和釋出等工作,然而 Android 的似乎更喜歡用用 Grandle -_-! fastlane 的官網看這裡, fastlane 的 github 看這裡,它用起來大約是這樣的:

上面這段程式碼的意思就是定義了一個 lane 叫做 beta,然後描述了這個 lane 要做的事情,上面的例子就是:增加編譯號,執行 cocoapods,執行 match ,執行 testflight,執行在當前目錄下的 customScript.sh 的指令碼,通知slack。這樣,這個 lane 就執行完畢了。fastlane 的強大之處就在於其提供的工具比較全,基本可以覆蓋打包釋出的所有流程,下面我們慢慢來看。

fastlane

使現有的工程支援 fastlane 是非常簡單的,只要執行一句 fastlane init 就可以了,執行完這步之後在你的工程目錄下會建立一個名叫 fastlane 的資料夾,裡面會有一個叫 Fastfile 的檔案,這個是 fastlane 的主檔案,也就是在 jenkins 中要呼叫的指令碼。Fastfile 一建立裡面就會有一些模板的 lane 可以自己點進去看一下,一看就懂。下面來說一下 fastlane 的一些常用命令。

  • fastlane actions: 列出所有的 fastlane 的 actions,可以看到 fastlane 支援的所有 action。大約是這樣的:

    11111867-baea12f0d273c559

    fastlane actions
  • fastlane action [action_name]: 顯示某一個 action 的詳細配置,比如想看到 match 的可配置選項可以執行,fastlane action match,顯示結果大約是如下這樣:

    212016-06-01-1. onetaway@Onetaways-MacBook-Pro. --BaoZouFace -zsh- iTerm, Today at 18.09.09

    fastlane action match
  • fastlane lanes: 列出所有的可用的 lane 及其描述。這裡顯示的就是你的 Fastfile 裡面定義的所有 lane,比如筆者顯示出來的結果大約是這樣的:

    132016-06-01-1. onetaway@Onetaways-MacBook-Pro. --BaoZouFace -zsh- iTerm, Today at 09.29.47

    fastlane lanes
  • fastlane list: 顯示所有的 lane,但是不顯示描述。
  • fastlane new_action: 建立一個 action。

OK,fastlane 命令介紹的基本差不多了,筆者認為,最常用的還是前兩個,特別是第二個 fastlane action [action_name],當你不知道某個工具在 XXXfile 中有哪些可配置選項的時候,請抬起頭,別讓皇冠掉 般的敲入這個命令。下面我們來看一下一個更常用的工具 match

match

我知道你們都 revoke 過證書。。。雖然這只是一個梗,但是 iOS 開發最麻煩的莫過於證書啊,配置檔案,開發人員隨意在後臺刪除,或者新建配置檔案,而其他的同事卻無法被通知到,會導致大量無謂的工作量。[match] (https://github.com/fastlane/fastlane/tree/master/match) comes to rescue。match 提出了一套全新的管理證書和配置檔案的方案,用來進行簽名,思想是使用私有倉庫來管理證書和配置檔案,每一個機器通過拉取該倉庫來安裝證書和配置檔案,再也不用進開發者後臺自己弄了。。一顆賽艇。具體的步驟可以點選上面的網址,裡面有很詳細的介紹。

match 的使用同樣很簡單,一行 match init 就搞定了,和 fastlane 一樣的套路,在 fastlane 資料夾下面會生成一個 Matchfile。後面我們很多的配置都可以在這個 Matchfile 裡面寫。

1444442016-06-01-fastlane-match at master · fastlane-fastlane Google Chrome, Today at 17.30.44

Matchfile_Demo

上面是官方倉庫的demo,但是此處有坑 此處有坑 此處有坑git_url 欄位的 git 地址要改成 ssh 協議。如果你在 jenkins 打包的 console 發現進度始終卡在 clone 這個倉庫的話,就要看看你的 git_url 欄位是不是沒改成 ssh 協議了。但是一個公司也許有多個專案,總不能來一個專案就建一個私有倉庫吧,沒錯,fastlane 的開發者們早就想到的最佳實踐,那就是 分支。使用一個分支去管理一個專案的證書和配置檔案,不同的 team 也可以使用不同的分支,這樣只需要一個倉庫,就完美的解決了問題。Matchfile 的可選配置可以用 fastlane action match 檢視。

下面來說一下 match 的基本用法,它的使用流程大約是這樣的:

  • match init: 初始化 match,並建立 Matchfile
  • match development: 建立開發證書和配置檔案,並安裝在本機上。
  • match adhoc: 建立 adhoc 釋出證書和配置檔案,並安裝在本擠上。
  • match appstore: 建立 appstore 釋出證書和配置檔案,並安裝在本機上。
    配置檔案安裝的目錄是 ~/Library/MobileDevice/Provisioning Profiles,證書和私鑰則是安裝在 Keychain 上的。

Passphrase

當在一臺新的機器上,第一次執行 match 的時候,會要求你為 Git 倉庫填寫一個 passphrase,這是出於安全的考慮,每一個檔案都會使用 openssl 進行加密,請記住你輸入的 passphrase,當在另一臺機器上執行 match 的時候,你需要輸入相同的 passphrase 才能繼續下去。如果需要在環境變數中使用的話,passphrase 的環境變數叫做 MATCH_PASSWORD

關於 match 就先介紹這麼多吧,更多詳細的東東去match主站發掘吧。下面我們說一說更為重要的打包命令 gym

Gym

打包了打包了。。。QA苦苦相逼何時了,哪有那麼多妹可撩啊,姐姐和包才治百病,這句話充分體現了包在移動開發領域的重要性。還記得曾經的你是如何打包的麼?

拔掉真機,點開工程,切換證書和配置檔案,怒點 archive,接下來就是一段風扇狂轉,電腦卡死,CPU跑滿的驚心動魄,終於風扇安靜了,可以 export 了,然後 F**k,誰TM把證書給幹了。。。。(此處應有燭光)。

不要慌。。。gym comes to rescue。gym 就是 fastlane 提供的打包工具,包括簽名步驟,It’s super easy,一行搞定上面所有操作,保證無痛…!-_- 讓我們來看一下如何使用:

gym init: 這是 fastlane 的老套路了,我知道你們都是老司機
gym

恩,用完了。。。臥槽,就沒了? 恩,就沒了

gym init: 初始化 gym ,並建立 Gymfile。
gym: 開始執行打包命令,當然你可以配置更多的 gym 選項,比如輸出路徑啊,指定scheme啊,是否 clean 啊等等,不知道還有哪些選項可配置? fastlane action gym 給你驚喜。

筆者的建議是能夠在 Gymfile 裡配置好的選項就在 Gymfile 裡配置,其餘的再使用程式碼。
Gymfile大約是這樣的:

142016-06-01-fastlane-gym at master · fastlane-fastlane Google Chrome, Today at 10.44.18

Gymfile_Demo1

152016-06-01-fastlane-gym at master · fastlane-fastlane Google Chrome, Today at 10.44.43

Gymfile_Demo2

gym常用就是這麼多啦,更多套路歡迎移步gym主站

合體

前面分別介紹了 fastlanematchgym命令,他們每一項的功能我們都大致瞭解了,是時候讓他們合體了。。。現在我們腦補一下我們編譯打包的流程,以 adhoc 方式為例。

  1. 執行一下 cocoapods
  2. 獲取證書和配置檔案
  3. 開始打包
  4. 將 ipa 釋出到內測平臺,比如:Fir.im 蒲公英等

於是乎我們似乎就能寫出自己的第一個 lane 了,(騷年,你還不去學 Ruby 麼?)

上面我們就完成了一個 lane。貫通了整套打包、上傳 ipa 的流程。其實 match 和 gym 同樣可以指定引數,但是如果你在各自對應的 XXXfile 裡面寫過了配置,這裡就可以省略了。上面最後一行的 fir publish,是 fir 的命令,可以參見這個repo

寫完了我們自定義的 lane 之後,就可以使用啦,用起來也是 so easy.
fastlane ios appname_adhoc_to_fir,中間的 ios 指定了平臺,在 Fastfile 中就是最外層的 platform :ios。敲完上面的命令,你只需要泡一壺好茶靜靜地等著控制檯顯示 Success(報錯)

血的教訓

  1. match error: 如果你在 jenkins 打包的 console 發現進度始終卡在 clone 證書倉庫的話,請將你的 Matchfile 的 git_url 改成 ssh 協議,別問我為什麼。。。
  2. gym error: 在 jenkins 打包的最後一步如果報錯 code sign error,請試試下面兩個辦法:(1) 將 login.keychain 中的證書拖到 System.keychain 下面
    (2) 在 gym 之前執行一下 system "security unlock-keychain -p yourMacPassword

別問我為什麼。。。

總結

在下一篇中會介紹如何使用 fastlane 打企業證書籤名的包。

參考

https://everettjf.github.io/2015/09/08/ios-ci-with-fastlane
http://www.cocoachina.com/ios/20150728/12733.html
https://github.com/fastlane/fastlane
http://www.devlizy.com/ios-da-bao-quan-cheng-pei-zhi/

相關文章