周末看了《大話測試2》突然有想法把公司的IOS打包做一下自動打包和分發,于是今天就開始行動啦!
背景
CI(持續集成)是現在非常流行的軟件開發實踐,可以自動化的持續打包部署代碼或者安裝包,減少了手工干預,大大的提高了工作效率,因此,不論如何,都需要對它做一些了解和實踐。
每次開發完,我們要做的是先找開發打包,打完包后拿來放到fir.im上,再生成二維碼,最后把二維碼做到我們內部分發的網站上分發,然后才能開始測試。整個流程很長,如果當天有很多小問題不斷的修復,那感覺真是坑爹,一兩個小時時間就浪費在這個過程上。使用CI能夠很好的解決這個問題。
環境
我使用的是現在使用比較普遍的Jenkins。打包的對象是IOS。所以首先,你必須有一個Mac。
操作系統:Mac OS X EI Caption 10.11.5
Jenkins版本:2.17
安裝
Jenkins的安裝非常簡單了,只要直接安裝DMG就行了。安裝完畢之后,進入http://localhost:8080就可以看到Jenkins的配置界面了,由于是Web端配置,所以使用起來非常友好。
一下兩個命令可能會經常用到,由于安裝Jenkins的時候,默認是自動啟動的,有時候為了減少不必要的資源消耗,可以關閉Jenkins。
Start Jenkins: sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
Stop Jenkins: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
第一條命令是啟動,第二條命令是關閉。
工作流
本次使用Jenkins的工作流如下圖所示(Jenkins不僅僅只有這些功能,這些只是本次使用的功能)

構建工程
使用Jenkins部署打包IOS程序有一個最大的前提,就是你必須要有一個Mac,否則免談。
Jenkins的安裝就不說了,百度一下一大堆,首先要新建一個自由風格的項目。
項目配置
項目名稱和描述都是給自己看的,因此可以憑自己的喜好填寫,只要自己能看得懂即可。接下來的構建方式我并沒有使用,因為對我來說確實用不到,應用打包完成上傳fir.im之后,基本上這個包就可以丟棄了。有需要的可以按需選擇。
源碼管理,我選擇SVN,其他也是一樣的,配置倉庫地址和賬戶。
Credentials是用戶,右側的ADD按鈕可以添加用戶,其他項默認配置即可。
構建觸發器也是非必須選項,如果不配置則需要手工觸發,我這里配置5分鐘檢查一次代碼倉庫。
具體的配置規則百度即可。
接下來是Xcode的配置,IOS打包有兩種方式,一種是命令行打包,直接寫打包腳本即可。另一種是Jenkins的Xcode插件來實現打包。我使用的是Xcode插件來配置,因為我們的開發說他對項目的工程架構有做過改動,我也嘗試過一下使用命令行,由于對shell一竅不通,所以還是放棄了。
- Xcode插件——General build settings
Target
是構建的目標。如果留空,那么就會構建所有的目標。
Clean before build
這個選項建議勾選,構建之前最好Clean一下,至于為什么,我也不知道,我們開發之前打包的時候沒有Clean,有時候會出一些莫名其妙的bug。
Configuration
此處填寫Release或者Debug,指的是IOS打包的類型,Debug版本還是Release版本。
Pack application and build .ipa
需要打鉤,因為我們需要打包成ipa文件來安裝。
ipa filename pattern
打包成ipa文件的名稱,就是最終的xxx.ipa。
Output directory
打包輸出的路徑,我這里填寫的${WORKSPACE}
指的是/Users/Shared/Jenkins/Home/workspace
其他項我使用的都是默認的,需要的請自己研究,項目右側的問號都有很明確的提示,唯一不爽的就是提示都是英文的。。。。。
- Xcode插件——Code signing & OS X keychain options
這部分應該算是比較重要的地方,因為這里是配置打包簽名的地方。
首先需要在鑰匙串訪問中找到開發者證書對證書進行權限開放,否則Jenkins無法獲取證書。
然后在配置項中做如下配置。
Keychain path
是固定填寫${HOME}/Library/Keychains/login.keychain
Keychain password
指的是你的授權密碼,不是證書密碼。
注意:${HOME}目錄指的是Jenkins的根目錄,也就是/Users/Shared/Jenkins,如果你的jenkins是新裝的,你會發現Library目錄中壓根就沒有Keychains目錄。你需要去/Users/SvenWeng/Library目錄下把Keychains目錄復制過來。
- Xcode插件——Advanced Xcode build options
Xcode Project File
是項目的地址,xxx.xcodeproj的地址。
Build output directory
是構建后的輸出地址,我這里設置于ipa文件地址一致。
注意:如果你的項目是使用.workspace。請使用Xcode Workspace File
,留空Xcode Project File
.
到此,Xcode插件的配置就完成了。
構建后執行
這里我使用了Post-Build Script Plug-in
插件。
進入我們構建后的目錄,使用fir-cli的命令把打包后的ipa文件上傳到fir.im上,其中-T
參數是使用fir.im的token,可以注冊后登陸fir.im查看自己的token。-Q
參數是上傳完畢之后把對應的二維碼下載到當前目錄下。
下方還有一個勾選項Execute script only if build succeeds
。構建成功才執行這個命令,也就避免了重復上傳的問題。
郵件通知
我使用的是Jenkins自帶的郵件功能,看勾選的結果是構建失敗才會發送郵件,經過我自己的測試,構建成功也能收到郵件,不過我配置的163服務郵箱經常坑爹的拒絕我使用smtp發送郵件。
郵件的內容還是比較人性化的,比如如果檔次構建SVN有變動,Jenkins會把變動日志和打包的日志一起發給你,比如這樣
至此,整個構建就結束了,可以手工觸發來看看結果。
藍色表示構建成功,紅色表示構建失敗。
一些注意點
配置過程中總是會出這樣那樣奇奇怪怪的錯誤。我整理了一下我自己遇到的問題。
- scheme name是什么鬼
好吧,其實我也不太了解,翻譯上是計劃名稱。其實這個是Xcode的一個配置(不知道這么說準確不準確)。進入方式:Xcode menu > Product > Scheme > Edit scheme點擊Manage Scheme
被我框起來涂掉的地方就是Scheme名稱。
- Code Sign error: No matching provisioning profile found: Your build settings specify a provisioning profile with the UUID “XXXXX”, however, no such provisioning profile was found.
這個報錯還是由于證書的問題,Xcode工程的證書放在/Users/SvenWeng/Library/MobileDevice/Provisioning Profiles這里,而Jenkins的根目錄是沒有這個東西的,之前我放的是一個錯的證書,所以導致了這樣的報錯。需要把工程證書拷貝到Jenkins根目錄下的Library中。
- FATAL: Unable to unlock the keychain.
這個報錯是由于你解鎖keychain的密碼不正確,在配置項中需要配置授權密碼(也就是你的mac的登錄密碼),而不是證書的密碼。
- xcodebuild: error: './workspace/.xcworkspace' does not exist.
這個報錯很明顯了,我的工程使用的是.xcodeproj,而不是.scworkspace,因此在Xcode插件配置的時候需要配置Xcode Project File
而不是Xcode Workspace File
- ERROR: Failed to update svn://xxxx
org.tmatesoft.svn.core.SVNException: svn: E204899: Cannot create new file '/Users/Shared/Jenkins/Home/workspace/HLSC/.xcodeproj/.svn/lock': No such file or directory
這個報錯也很明顯了,是SVN配置的有問題。
- xcodebuild: error: The project 'xxx.xcodeproj' does not contain a target named 'XXX'.
這個報錯是target named指定錯誤,檢查一下Xcode的工程是否有相關配置,我報這個錯是因為正確的名字是xxx_iOS,而我打成了xxx_IOS,就是一個大小寫的區別。
后續
后續可以做的事很多啦,比如寫個Python腳本來處理本地的文件,把打包的內容做一下歸檔,然后生成的二維碼通過FTP方式上傳到內部的分發網站上。編寫自動化單元測試,每次代碼改動的時候做一下自動化測試,把Android客戶端也用這種方式自動打包出來等等。。。。
總結
持續集成看上去很高大上,其實走一遍流程,也并不是那么困難,困難的地方Jenkins都幫你處理好了。
配置的時候如果是IOS開發人員,或者對IOS有一定的了解,那么配置起來應該是非常快的,否則最好有一個人來指導你,今天配置的時候我們的IOS開發總能在關鍵點上給一個方向,省去很多時間,不然現在可能都還配不出來,很多報錯網絡上找不到,即使找到了,大多也是英文的,雖然看得懂,但是看起來總是有點不爽。
耐心,耐心,耐心,在配置過程中一定會有各種各樣奇奇怪怪的報錯,有時候看起來很煩,但是一定要有耐心,多靜下心來想想,多看看日志,日志的報錯一般來說都是非常清晰準確的。
多嘗試,配置完就構建一次,反正構建失敗了,電腦不會爆炸,世界也不會毀滅。整個配置過程構建失敗了30次,直到第三十一次才構建成功。
當完成之后,可以省去很多很多很多處理這些雜事的時間。