一直以來被 iOS 項目打包困惑,速度慢、操作復雜,深惡痛絕!於是開始尋求網絡上的持續集成服務,前兩天嘗試了下 buddybuild、bitrise,都不太如意(可能是姿勢不太對),正好公司有台空著的 Mac mini,剛好可以拿來試試搭個 Jenkins 服務器做持續集成,網絡上有很多 Jenkins 安裝教程,這裡就不重復了,主要記錄一下我在使用過程中遇到的問題和解決方法,希望未來某一天能幫到同樣被困惑的人兒。
再說點閒言碎語,關於 iOS 的打包的進階歷程,最早沒接觸這些東西的時候是每次手動在 Xcode 上 Archive -> Organizer -> Export,必須守在電腦前,中間操作步驟也很多,特別是在 Organizer 裡面簽名,很容易就出現證書或者 PP(Provisioning Profiles) 文件不正確之類的問題;後來知道了 fastlane,寫好腳本用 gym 一鍵打包,感覺生活品質上了一個量級;後來了解到持續集成,比如 Jenkins,項目丟服務器上去,推送代碼自動打包、分發、推送提醒,體驗更上一層樓。
遇到的問題
Unable to unlock the keychain.
可能遇到錯誤 User interaction is not allowed ,那麼你可能需要在 script 裡先執行一下這一行命令來給 keychain 解鎖:
security unlock-keychain -p "YourPassword" ~/Library/Keychains/login.keychain
然後可以用這行來驗證是否解鎖成功:
security show-keychain-info ${HOME}/Library/Keychains/login.keychain
因為在 Jenkins script 裡沒有輸入交互,如果不在命令中跟上 -p 密碼的話是會失敗的。
Cocoapods 依賴更新失敗
通常需要在編譯項目前執行 pod install 來安裝依賴,如果你的 Podfile 裡引用了私有 pod,如果通過 https 訪問的話,那麼一般在終端中會自動提示輸入對應 git 訪問賬號密碼,可是在 jenkins 裡沒有輸入交互,所以這時候之後在 jenkins 和 git 裡配置正確的私鑰-公鑰才能正確訪問,並且 Podfile 裡的地址改為 git 打頭才行。
如果還是想用 https 訪問的話另外有個取巧的簡單,就是 ssh 進去 jenkins 用戶,手動 pod install 一遍,手動輸入賬號信息,系統則會記錄下來,下次就不會再提示,從而在 jenkins 裡也能正常。
一些小技巧
編譯成功 iMessage 通知
一般編譯成功後大家可能會設定發送郵件通知,其實也可以直接通過 AppleScript 發送一條 iMessage 信息,還挺好玩的。
在構建步驟的 script 裡可能會是這樣:
osascript -e 'tell application "Messages" to send "'"${scheme}(${BUILD_DISPLAY_NAME}) build complete."'" to buddy "[email protected]" of (service 1 whose service type is iMessage)'
這個地方被困惑的是在 Shell 裡調用 osascript -e ,為了引入 jenkins 的 environment variables ,寫的時候單雙引號已經快要把我整殘廢了。 最終就可以在你的 iPhone 上收到 iMessage 提醒,效果如下圖:
iMessage
編譯成功 fir 上傳
可以在編譯成功後提交 .ipa 到 fir,通過 fir.im-cli 上傳,或者安裝 fir-jenkins 插件
fir publish ${ipa_path} -T YOUR_TOKEN