Fastlane簡介
Fastlane 是用Ruby語言編寫的一套自動化工具集和框架,每一個工具實際都對應一個Ruby指令碼,用來執行某一個特定的任務。Fastlane的強大之處,就是可以將不同的工具(action)有機而靈活的結合在一起,從而形成一個完整的自動化流程,大大提高了日常的開發測試效率,推薦大家使用。 如果你尚未使用這個工具,可以點選一下幾篇文章學習如何使用: 【CI】持續整合-引導篇 【CI】持續整合-第一篇 fastlane
背景&現象
公司專案日常開發中,已經使用了fastlane,配合gitlab一起實現自動打包以及分發,使用期間感覺很順暢,沒有出過什麼問題。但是,自從Xcode升級到Xcode9正式版之後打包一直出問題,打不了包。
環境配置
fastlane版本: 2.59.0
| Key | Value |
| --------------------------- | ------------------------------------------- |
| OS | 10.13 |
| Ruby | 2.3.3 |
| Bundler? | false |
| Git | git version 2.13.5 (Apple Git-94) |
| Installation Source | ~/.rvm/gems/ruby-2.3.3/bin/fastlane |
| Host | Mac OS X 10.13 (17A365) |
| Ruby Lib Dir | ~/.rvm/rubies/ruby-2.3.3/lib |
| OpenSSL Version | OpenSSL 1.0.2k 26 Jan 2017 |
| Is contained | false |
| Is homebrew | false |
| Is installed via Fabric.app | false |
| Xcode Path | /Applications/Xcode.app/Contents/Developer/ |
| Xcode Version | 9.0 |
*generated on:* **2017-09-30**
複製程式碼
工程專案中 provisioning profile(以下簡稱pp檔案),靈活運用了match這個action外加手動配置。
錯誤描述:
看到了框框的那句話,剛開始以為是推送證書或者是provisioning profile的問題,然後手動在此執行了match,把證書什麼的裡裡外外更新了一遍,發現還是不起作用。沒辦法,只能翻看github 看看issue,看看有木有類似的處理方案。原因
功夫不負有心人,喵神大佬道破真相: Xcode9將不會允許你訪問鑰匙串裡的內容,除非設定allowProvisioningUpdates。
所以說,在執行xcode -exportArchive的時候,因為許可權訪問鑰匙串,所以無法讀取到專案工程裡的pp檔案,進而打包失敗,並且報錯說缺少pp檔案。所以解決方法,在你的fastfile裡gym action加入 allowProvisioningUpdates
gym(
scheme: scheme,
export_method: "ad-hoc",
silent:true,
output_directory:outputDirectory,
output_name:ipaName,
archive_path:outputDirectory,
export_xcargs: "-allowProvisioningUpdates",
)
複製程式碼
儲存,再執行一次打包命令,請注意,這個時候xcode會彈窗讓你確認,點一直允許
就是了。特別注意的是,如果和我們公司一樣的環境,那麼那臺遠端打包的伺服器,在更新完fastfile第一次跑的時候,要遠端連線上去手動點選確認框,不然打包指令碼就會一直卡在那裡。
到此為止,Xcode9讀取鑰匙串許可權的問題就結束了。
但是,你以為這樣就結束了嗎?就能打包成功了嗎?
緊接著又是另外一個錯誤:
WTF,明明打包方式是ad-hoc,但是匹配的pp檔案確是AppStore的???這必然是個坑
在此開啟了官方文件看到了這麼一句話
翻譯一下,如果你們沒用match這個action,來管理pp檔案,我們推薦你在fastfile裡面,自己定義一個map,指定bundleID 和 pp檔案,以保證能夠正常構建app。但是我在文章開頭就po圖了,我專案工程裡的pp檔案都是用match來管理的。所以剛開始,這段話被我忽略了。後續又是一陣在github issue上漫遊。https://github.com/fastlane/fastlane/issues/10315 找到一個類似的問題。既然bundleID,或者pp檔案不對,那我能不能嘗試著主動寫死正確的bundleID和pp檔名,放進fastfile?
於是把gym加了個引數,不同環境下指定好:
gym(
scheme: scheme,
export_method: "ad-hoc",
silent:true,
output_directory:outputDirectory,
output_name:ipaName,
archive_path:outputDirectory,
export_xcargs: "-allowProvisioningUpdates",
export_options: {
provisioningProfiles: {
app_identifier => "match AdHoc #{app_identifier}"
}
}
)
複製程式碼
儲存,重新run打包指令碼,終於可以成功打包了??。
簡單說說Xcode8和9打包
筆者由於fastlane問題沒解決,所以這期間打包工作都是手動完成的,Product - Archive
然後等待Xcode自動打,這些操作相信大家都會的,不多說了。選擇測試包之後,彈出框框問你是否瘦身,一般別管就是。然後重點來了,相比Xcode8多了這麼個頁面:
ExportOptions.plist
預覽了一下這個plist,裡面就記錄了剛剛上幾步的一些選擇項。比如瘦身選項,還有個很關鍵的東西provisioningProfile
這個欄位是個dictionary。
難道沒有一種似曾相識的趕腳?
再次看看這張圖:
紅框框的部分的最後,說的plist就是它。這個就是Xcode在匯出ipa的時候一些引數。另外,手動Xcode打包和在終端裡面敲 xcodebuild -archivePath,xcodebuild -exportArchive -exportOptionsPlist 本質是一樣的,都是打包,引數就是同一個。 再回過頭來,看看我們最終的解決方案,我們在gym中新增了一個欄位,就是在寫引數而已export_options: {
provisioningProfiles: {
app_identifier => "match AdHoc #{app_identifier}"
}
}
複製程式碼
可能原因
到這一步,在回頭看看以上出現的bundleID和PP檔案不匹配錯誤,在用match管理pp檔案的前提下,有可能是因為Xcode9引起的問題,打包流程或者引數讀寫哪裡有點變化,需要fastlane團隊做進一步適配更新。上文中issue的連結狀態到截止筆者寫作完成之時,任是在open狀態。所以這個原因有待關注,當然也希望能有大佬在指出原因,感激不盡~
至此為止,踩過的坑全部都填平了。不光是fastlane,用其他的一些工具或者第三方的時候還是要多多關注github上的issue,這裡是塊大大寶藏,等待被你挖掘!