末看了《大話測試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 settingsTarget是構建的目標。如果留空,那麼就會構建所有的目標。
Clean before build這個選項建議勾選,構建之前最好Clean一下,至於為什麼,我也不知道,我們開發之前打包的時候沒有Clean,有時候會出一些莫名其妙的bug。
Configuration此處填寫Release或者Debug,指的是IOS打包的類型,Debug版本還是Release版本。
Pack application and build .ipa需要打鉤,因為我們需要打包成ipa文件來安裝。
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPk91dHB1dCBkaXJlY3Rvcnm08rD8yuSz9rXEwre+tqOsztLV4sDvzO7QtLXEPGNvZGU+JHtXT1JLU1BBQ0V91ri1xMrHPGNvZGU+L1VzZXJzL1NoYXJlZC9KZW5raW5zL0hvbWUvd29ya3NwYWNlPC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cD48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT7G5Mv7z+7O0sq508O1xLa8ysfErMjPtcSjrNDo0qq1xMfr19S8utHQvr+jrM/uxL/T0rLgtcTOyrrFtrzT0Lrcw/fIt7XEzOHKvqOszqjSu7K7y6y1xL7NysfM4cq+trzKx9OizsS1xKGjoaOho6GjoaM8L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPlhjb2RlsuW8/iZtZGFzaDsmbWRhc2g7Q29kZSBzaWduaW5nICZhbXA7IE9TIFgga2V5Y2hhaW4gb3B0aW9ucyA8L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPg0KPHA+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+1eKyv7fW06a4w8vjysexyL3P1tjSqrXEtdi3vaOs0vLOqtXiwO/Kx8Xk1sO08rD8x6nD+7XEtdi3vaGjPC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cD48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT48Y29kZT7K18/I0OjSqtTa1L+z17Sut8POytbQ1dK1vb+qt6LV39akyum21Nakyum9+NDQyKjP3r+qt8WjrLfx1PJKZW5raW5zzt63qLvxyKHWpMrpoaM8L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxpbWcgYWx0PQ=="" src="/uploadfile/Collfiles/20160817/20160817094654997.jpg" title="\" />ipa filename pattern打包成ipa文件的名稱,就是最終的xxx.ipa。
然後在配置項中做如下配置。
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次,直到第三十一次才構建成功。
當完成之後,可以省去很多很多很多處理這些雜事的時間。