前言:
身為一名iOS開發人員,面臨必不可少的一個階段就是打包測試。雖然xcode可有實現打包,但在測試階段面臨測試人員不斷的向你催促需要新的包進行測試就會很讓人頭疼,打包又是一個重複性極高又很費時間的事情。所以研究了一下jenkins和fastlane的自動打包流程,希望對大家有所幫助,途中也遇到了眾多的問題和坑。
如需幫助可直接 聯絡我
前期準備
-
Ruby:
fastlane的安裝需要Ruby2.0版本以上,雖然mac自帶ruby,但是版本可能較低,並且許可權較少,所以推薦使用RVM管理ruby版本。
按照這篇文章安裝既可以了 Mac安裝Ruby版本管理器RVM
-
xcode命令列工具
xcode-select --install 複製程式碼
如果已經安裝會提示
如果沒有安裝會出現
直接點選安裝就可以了,安裝完成後再次執行
xcode-select --install
之後出現已經安裝的提示了。 -
Java JDK (這個是Jenkins安裝用的,如果不需要jenkins可直接忽略)
可先檢視 當前安裝的java版本
java -version 複製程式碼
如果未安裝請先前往 JDK下載連結 下載
因為jenkins是用java語言編寫的,所以需要java的支援,建議使用1.8版本的JDK
需要先接受協議之後才可以下載
下載完成之後直接安裝就可以了,這裡就不再贅述。
前期準備工作到這裡就完成了
Fastlane
fastlane是為iOS和Android應用程式自動化beta部署和釋出最簡單的方法。?可以處理各種繁瑣任務,例如生成螢幕截圖,處理程式碼簽名和釋出應用該程式等.fastlane整合了一系列移動端開發中簽名,編譯,釋出等工具,堪稱打包神器。
fastlane初始化
安裝fastlane的三種方式
-
Homebrew
brew cask install fastlane 複製程式碼
-
安裝程式指令碼
下載zip檔案。後雙擊shell指令碼即可
-
RubyGems
gem install fastlane -NV 複製程式碼
蒲公英外掛
這裡我們在最後使用了 Jenkins上傳蒲公英,為了獲取下載二維碼。
本文也提到了使用Fastlane上傳蒲公英的介紹
Fastlane 安裝成功之後 執行安裝蒲公英的外掛
fastlane add_plugin pgyer
複製程式碼
如果沒什麼意外就直接成功了
剛開始我使用的本機自帶的ruby, 失敗了。然後使用了rvm管理的ruby之後就成功了。
如果遇到了其他問題請大家google一下吧,或者聯絡我我們一起探討。
初始化
cd /到自己的專案目錄中
複製程式碼
初始化fastlane
fastlane init
複製程式碼
如果之前的都沒有問題 會出現以下選項
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e00a64a304d?w=733&h=329&f=png&s=69326)
複製程式碼
- Automate screenshots: 自動截圖
- Automate beta distribution to TestFlight: 自動釋出beta版本到testFlight
- Automate App Store distribution: 自動釋出到App Store
- Manual setup: 手動設定
這裡我們選的是第3個,然後會出現一些選項
1. ? Automate screenshots
2. ?✈️ Automate beta distribution to TestFlight
3. ? Automate App Store distribution
4. ? Manual setup - manually setup your project to automate your tasks
? 3
[10:37:53]: ----------------------------------------------------------
[10:37:53]: --- Setting up fastlane for iOS App Store distribution ---
[10:37:53]: ----------------------------------------------------------
[10:37:53]: Parsing your local Xcode project to find the available schemes and the app identifier
[10:37:53]: $ xcodebuild -showBuildSettings -workspace FastlaneDev.xcworkspace -scheme FastlaneDev
[10:37:55]: $ cd `你專案的路徑` && agvtool what-version -terse
[10:37:55]: --------------------------------
[10:37:55]: --- Login with your Apple ID ---
[10:37:55]: --------------------------------
[10:37:55]: To use App Store Connect and Apple Developer Portal features as part of fastlane,
[10:37:55]: we will ask you for your Apple ID username and password
[10:37:55]: This is necessary for certain fastlane features, for example:
[10:37:55]:
[10:37:55]: - Create and manage your provisioning profiles on the Developer Portal
[10:37:55]: - Upload and manage TestFlight and App Store builds on App Store Connect
[10:37:55]: - Manage your App Store Connect app metadata and screenshots
[10:37:55]:
[10:37:55]: Your Apple ID credentials will only be stored in your Keychain, on your local machine
[10:37:55]: For more information, check out
[10:37:55]: https://github.com/fastlane/fastlane/tree/master/credentials_manager
[10:37:55]:
[10:37:55]: Please enter your Apple ID developer credentials
[10:37:55]: Apple ID Username:
`你的Apple ID`
[10:38:16]: Logging in...
複製程式碼
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e0a8d184c86?w=1384&h=208&f=png&s=66871)
複製程式碼
如果你賬號下有多個team會讓你選擇一下
然後等待安裝
在這期間我遇到了bundle update這句話一直不動,我重新init了一遍就好了
成功之後 開啟我們的專案目錄發現多了這個檔案
恭喜你 初始化成功了 !!!
配置Fastlane
檔名 | 描述 |
---|---|
Appfile | 從 Apple Developer Portal 獲取和專案相關的資訊 詳情 |
Fastfile | 核心檔案,存放lane任務 |
Deliverfile | deliver的配置檔案,從 iTunes Connect 獲取和專案相關的資訊詳細 |
metadata | 同步iTC中的後設資料 |
screenshots | 同步iTC中的截圖 |
這裡給打家推薦一篇配置的文章Fastfile參考配置
下面是我的配置僅供參考,沒有用fastlane上傳蒲公英,因為想要在jenkins裡面獲取二維碼暫時的解決辦法使用jenkins上傳蒲公英 如果需要fastlane上傳直接開啟的註釋進行了
# 匯出路徑
$ipa_output_directory = "/Users/xx/xx/fastlaneBuild"
# 上傳蒲公英的包 路徑
$ipa_output_upload_directory = "/Users/xx/.jenkins/workspace/xx/ipa"
# jenkins匹配的包名
$jenkins_name = "專案名"
default_platform(:ios)
# 應用名詞
scheme_name = "專案名字"
# 獲取version
version = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleShortVersionString")
# 獲取build版本號
build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion")
# 指定xcode打包 這裡可選擇不要,我們的專案需要用10.1版本xcode
xcode_select("/Applications/Xcode_10.1.app")
# 預設內測打包方式,目前支援app-store, package, ad-hoc, enterprise, development
ipa_exportMethod = "ad-hoc"
ipa_exportMethod_appStore = "app-store"
# 計算buildNumber
def updateProjectBuildNumber
currentTime = Time.new.strftime("%Y%m%d")
scheme_name = "專案名字"
build = get_info_plist_value(path: "./#{scheme_name}/Info.plist", key: "CFBundleVersion").to_s
if build.include?"#{currentTime}."
# 為當天版本 計算迭代版本號
lastStr = build[build.length-2..build.length-1]
lastNum = lastStr.to_i
lastNum = lastNum + 1
lastStr = lastNum.to_s
if lastNum < 10
lastStr = lastStr.insert(0,"0")
end
build = "#{currentTime}.#{lastStr}"
else
# 非當天版本 build 號重置
build = "#{currentTime}.01"
end
puts("*************| 更新build #{build} |*************")
# 更改專案 build 號
increment_build_number(
build_number: "#{build}"
)
end
# 打包成功 jenkins 開始提示上傳log
# 使用fastlane上傳蒲公英拿不到二維碼展示, 所以使用jenkins上傳蒲公英
def archiveSuccessLog(outputName,buildConfig)
# 打好的包 移動到 jenkins的 workspace的目錄下,用於jenkins上傳蒲公英匹配包內容。永遠只保留一份
# FileUtils.cp_r("#{$ipa_output_directory}" + "/#{outputName}", "#{$ipa_output_upload_directory}" + "/#{$jenkins_name}.ipa")
puts" --------------------------------------------------------------------------"
puts"| |"
puts"| |"
puts"| ??? --------->>>>> #{buildConfig}版本_打包成功 <<<<<-----------??? |"
puts"| |"
puts"| ??? --------->>>>> Jenkins 可以開始上傳蒲公英了 <<<<<-----------??? |"
puts"| |"
puts"| |"
puts" --------------------------------------------------------------------------"
end
#
# 所有任務指令碼
#
platform :ios do
#
# *************| 上傳到測試版本到蒲公英_測試包 |*************
#
desc "上傳到測試版本到蒲公英_測試包"
lane :topgyer_debug do|option|
puts "*************| 開始打包.ipa檔案... |*************"
# 自動增加build
updateProjectBuildNumber
# 自動生成證照
cert
# 匯出名稱
output_name = "#{scheme_name}_#{version}_#{build}_#{option[:desc]}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
gym(
# 指定輸出的ipa名稱
output_name: "#{output_name}",
# 指定專案的scheme
scheme: "xxx",
# 是否清空以前的編譯資訊 true:是
clean: true,
export_method: "#{ipa_exportMethod}",
export_options: {iCloudContainerEnvironment: 'Development'},
# 指定打包方式,Release 或者 Debug 按需修改
configuration:"Debug",
# 包匯出的位置
output_directory: "#{$ipa_output_directory}",
)
# 使用fastlane上傳蒲公英拿不到二維碼展示, 所以使用jenkins上傳蒲公英
archiveSuccessLog(output_name," Debug ")
# 這裡是 fastlane 直接上傳蒲公英
# 如果需要請開啟一下注釋,並註釋掉archiveSuccessLog(output_name," Debug ")
# puts "*************| 開始上傳__測試版__本到蒲公英... |*************"
# 配置蒲公英 api_key 和 user_key
# pgyer(api_key: "你的api_key", user_key: "你的user_key", update_description: "#{option[:desc]}")
# puts "*************| 上傳__測試版__到蒲公英???成功??? |*************"
end
#
# *************| 上傳App Store |*************
#
lane :toappstore do
project_identifier = ""
puts "*************| 開始上傳AppStore... |*************"
# 自動增加build
updateProjectBuildNumber
# 自動生成證照
# cert
# 匯出名稱
codesigning_identity = "證照名字"
output_name = "#{scheme_name}_#{version}_#{build}_#{ipa_exportMethod_appStore}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
gym(
# 指定輸出的ipa名稱
output_name:output_name,
# 指定專案的scheme
scheme:"xxx",
# 是否清空以前的編譯資訊 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包方式,目前支援app-store, package, ad-hoc, enterprise, development
export_method:"app-store",
# 上傳的環境
export_options: {iCloudContainerEnvironment: 'Production'},
# 指定輸出資料夾
output_directory:"#{$ipa_output_directory}",
)
deliver(
# 選擇跳過圖片和後設資料上傳,自己去配置
skip_screenshots:true,
skip_metadata:true,
# 上傳完成後提交新版本進行審查
submit_for_review: false,
force:true,
)
puts "*************| 上傳AppStore成功? |*************"
puts "*************| 開始上傳__測試版__本到蒲公英... |*************"
# 配置蒲公英 api_key 和 user_key
pgyer(api_key: "你的api_key", user_key: "你的user_key", update_description: "#{option[:desc]}")
puts "*************| 上傳__測試版__到蒲公英???成功??? |*************"
# 釋出testflight測試
# pilot
end
end
複製程式碼
在自己的專案目錄中執行
fastlane topgyer_debug desc:測試
複製程式碼
這句話根據自己的lane :topgyer_debug do|option|
修改
成功之後可以看見 , 如果有上傳蒲公英給的操作 則會告知蒲公英上傳成功,前往蒲公英檢視就有新版本了。
17:58:59: --------------------------------------------------------------------------
17:58:59: | |
17:58:59: | |
17:58:59: | ??? --------->>>>> Debug 版本_打包成功 <<<<<-----------??? |
17:58:59: | |
17:58:59: | ??? --------->>>>> Jenkins 可以開始上傳蒲公英了 <<<<<-----------??? |
17:58:59: | |
17:58:59: | |
17:58:59: --------------------------------------------------------------------------
複製程式碼
接下來思考的問題是: 不能還是由我們開發人員執行 指令碼任務來打包上傳蒲公英。
有沒有辦法能夠讓測試人員自己去打包呢? 所以接下來我們要做的就是 讓jenkins執行我們的fastlane指令碼
並且自動生成二維碼展示。測試人員需要測試包的時候開發人員只需要把程式碼上傳到對應的分支就好了。
我選擇了一臺專門的機器作為伺服器 來做這件事情, 畢竟在自己電腦上多少會有點影響的。
Jenkins
Jenkins是一個獨立的開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平臺,使軟體的持續整合變成可能。前身是Hudson是一個可擴充套件的持續整合引擎。可用於自動化各種任務,如構建,測試和部署軟體。Jenkins可以通過本機系統包Docker安裝,甚至可以通過安裝Java Runtime Environment的任何機器獨立執行。
- 主要用於:
- 持續、自動地構建/測試軟體專案,如CruiseControl與DamageControl。
- 監控一些定時執行的任務。
JAVA JDK
前面我們已經安裝了 java JDK 若未安裝請前往上方檢視安裝步驟
Jenkins安裝
-
安裝方式
-
Jenkins官網地址:jenkins-ci.org/ 下載最新的war包雙擊安裝
-
使用brew安裝
// 使用brew安裝 brew install jenkins // 安裝完成後啟動,直接執行jenkins即可啟動服務 jenkins 複製程式碼
-
初始化jenkins
預設訪問http://localhost:8080/, 可進入jenkins配置頁面。 不要關閉終端否則jenkins會停掉
第一次執行的時候會出現以下介面
根據提示的路徑去 將密碼輸入進去 然後點選 Continue
會進入:
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e1dbd432a95?w=1246&h=754&f=png&s=234196)
複製程式碼
選擇第一個就可以了
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e20166a9dca?w=1252&h=724&f=png&s=334222)
複製程式碼
等待安裝完成
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e246e5072ca?w=1258&h=766&f=png&s=95677)
複製程式碼
自己設定賬戶密碼
jenkins配置
在主頁選擇 manage Jenkins --> Manage Plugins 去下載外掛
在這個選項中下載需要的外掛,一些基本外掛在安裝jenkins的時候都已經下好了,現在只需要下載需要的就可以了
```ruby
GitLab
Xcode integration // 這個其實可以不用
Keychains and Provisioning Profiles Management // 配置檔案管理
/// 上面這三個 如果需要在jenkins中打包 證照新增需要匯入
Upload to pgyer // 上傳蒲公英
Build Name and Description Setter // 設定打好包的名字
description setter // 設定圖片
```
複製程式碼
外掛安裝好了之後,開始建立專案
建立專案
回到主頁點選新建Item
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e3d4467900d?w=644&h=1070&f=png&s=107899)
`選擇: 自由風格的專案`
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e3fec875976?w=1982&h=1390&f=png&s=308833)
General --> Discard old builds 構建的天數的保持最大的個數。
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e41c0d617ba?w=1914&h=942&f=png&s=109742)
General --> This project is parameterized --> 新增引數 --> Choice Parameter
這個就是 你在構建的時候可以先擇 構建環境和分支,(按需新增!)
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e45baf528e6?w=950&h=671&f=png&s=53504)
```ruby
名稱: BUILD_TYPE
選項: debug
release
描述: 打包環境
----------------------------------------------
名稱: GIT_BRANCH
選項: develop
master
3.1.0
3.0.0
2.9.1
2.9.0
描述: 拉取程式碼的 git分支
```
原始碼管理 --> Git
使用Git管理原始碼 我這裡用的是gitlab 的SSH方式管理
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e4fd50680e2?w=935&h=538&f=png&s=53280)
```ruby
*/${GIT_BRANCH}
```
git管理就是為了讓jenkins知道我們的原始碼在哪裡
在第一次構建的時候他回去拉取程式碼放到.jenkins的workspace中進行管理
填寫完專案地址,我們點選新增按鈕。(branch Specifier 不要忘記修改 這裡上面設定的選擇引數,拉取程式碼的分支)
點選新增按鈕
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e51e1ef7254?w=1064&h=572&f=png&s=53606)
金鑰獲取: 首先我們要保證 在git中配置了自己的祕鑰。配置方法 --> [Mac 配置ssh祕鑰](https://www.jianshu.com/p/17fa8d34beb2)
- 型別SSH
- userName 就是git中的名字 能知道是誰上傳下載的就可以
- PrivateKey ssh中的私鑰,/Users/使用者名稱/.ssh/id_rsa
- Passphrase git密碼。
- 點選新增 既可以了。
如果你的專案很大,需要的clone時間較長的話,需要設定一下超時時間.
jenkins預設的超時時間是10分鐘,根據自己專案設定時間,
這裡有一個[git clone 太慢解決方案](git clone 太慢)。
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e55c4673a0c?w=502&h=577&=png&s=71649)
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e5966a3b8c3?w=894&h=327&=png&s=34288)
構建環境 --> Set build Name 設定打出來的包的展示名字 ,如果沒有新增外掛 是沒有這個選項的
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e5c4f31ac1a?w=974&h=414&=png&s=50491)
```ruby
iOS_XXX_${GIT_BRANCH}_${BUILD_TYPE}_build(${BUILD_NUMBER})
```
構建 --> 增加構建步驟 --> Execute shell
複製程式碼
```ruby
cd /Users/你的專案目錄
fastlane topgyer_debug desc:測試版_Debug
```
然後 儲存退出就可以了
回到首頁 --> build with paramters --> 選擇環境和分支,開始構建
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e708999f15d?w=412&h=448&f=png&s=54660)
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04e7324aeaf8e?w=416&h=267&f=png&s=21823)
第一次構建需要從Git拉去程式碼 如果超時了 更改一下 超時時間 上面有介紹
如果提示 fastlaneCommand not found 點選此連結 [jenkins執行shell指令碼時候出現 fastlaneCommand not found解決方案](jenkins執行shell指令碼時候出現 fastlaneCommand not found)
**靜候佳音 Jenkins打包操作 搞定了!!!**
打包成功了之後發現 每次還是要點選去蒲公英的連結然後才能下載
經研究了一下怎麼直接把蒲公英的連結放在構建挖成之後
如: 醬事兒~
![](https://user-gold-cdn.xitu.io/2019/9/6/16d04f3d7fd929d5?w=328&h=186&f=png&s=19270)
複製程式碼
生成蒲公英二維碼
最開始我使用的是 fastlane 上傳蒲公英的操作,但是想要拿到二維碼不是很容易
最後想到了直接讓 jenkins哪去fastlane打的包然後上傳蒲公英就好了,然後成功了!
下面介紹一下操作步驟
-
上傳蒲公英
還是進入到我們當前專案的配置裡面去 --> 到最後的構建後操作 --> 增加構建後操作步驟
pgyer api_key : 你的蒲公英api_key // 這個位置自己決定就好了,和fastfile檔案中的ipa_output_upload_directory地址 是一樣就行 Scandir: 打的api包的地址 file wildcard: 包名字.ipa 注意你需要 吧 fastlane中的fastfile檔案中 ###### 這句話的註釋開啟 ##### FileUtils.cp_r("#{$ipa_output_directory}" + "/#{outputName}", "#{$ipa_output_upload_directory}" + "/#{$jenkins_name}.ipa") 這個是講打出來的包拷貝一份到 workspace中,保證ipa資料夾的包只有一個最新的。這個包用於上傳蒲公英 複製程式碼
-
獲取二維碼操作:
構建後操作 --> 增加構建後操作步驟 -->Set build description
直接拷貝 <a href="${appBuildURL}"><img src="${appQRCodeURL}" width="118" height="118"/></a> 從上傳蒲公英的資訊中獲取圖片 複製程式碼
-
最後一步 回到首頁 --> manager Jenkins --> Configure Floable Security
標記格式器設定為 Safe HTMLOK!! 大功告成!!!去首頁去 構建吧! !!
結束語
介紹了一下 fastlane 和 Jenkins 的結合使用的過程。比較流水線,如果哪裡不對 還望各位指出,
然後我們拿到自己電腦的ip http://電腦ip:8080/ 交給測試就好了 要包自己去點構建把,
建議使用網線,這樣ip不容易變。
之前也研究過 全部使用Jenkins實現打包上傳等過程, 但是jenkins需要配置的東西真的很多,證照、xcode、一系列操作,配置錯誤就會失敗 而且還不容易找出問題,所以選擇了fastlane進行打包上傳蒲公英,之後為了獲取到二維碼直接使用選擇了 jenkins上傳蒲公英。
暫時的解決方法 如果有更好的方法 希望大家多多指出,我也會繼續研究更好的方法。
感謝!
後期遇到的問題
1. Pod 出現錯誤
如果你在輸入pod命令的時候出現以下錯誤
/Library/Ruby/Site/2.3.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)
from /Library/Ruby/Site/2.3.0/rubygems.rb:308:in `activate_bin_path'
from /usr/local/bin/pod:23:in `<main>'
複製程式碼
-
原因1:
- ruby版本問題導致,請先升級ruby到最新版本
-
原因2:
-
如果確定了都沒有問題 那麼執行一下命令
gem install cocoapods 複製程式碼
pod install 複製程式碼
之後會發現 pod 已經可以正常使用了
-
2. git clone 太慢
查詢域名所對應的ip 地址,並修改host檔案
-
獲取 github/gitlab.global.ssl.fastly.Net的ip地址
nslookup github.global.ssl.fastly.Net 複製程式碼
-
獲取github.com 的ip地址
nslookup github.com 複製程式碼
-
在etc/hosts 檔案中新增
151.101.76.249 github.global.ssl.fastly.net 192.30.253.112 github.com 複製程式碼
-
強制更新DNS快取
-
windows
ipconfig /flushdns 複製程式碼
-
linux
sudo /etc/init.d/networking restart 複製程式碼
-
mac
sudo killall -HUP mDNSResponder 複製程式碼
-
3. jenkins執行shell指令碼時候出現 fastlaneCommand not found
在安裝完fastkane之後執行 fastlane xxx desc:xxx 可以成功打包執行 在jenkins中的shell指令碼無法執行出現以下錯誤
16:20:30 xxx/xxx/xxx/xxx.sh: line 4: fastlane: command not found
16:20:30 Build step 'Execute shell' marked build as failure
16:20:30 New run name is 'iOS_xxx_develop_debug_build(17)'
16:20:30 [UPLOAD TO PGYER] - The build FAILURE, so the file was not uploaded.
16:20:30 [description-setter] Description set:
16:20:30 Finished: FAILURE
複製程式碼
解決方法:
在jenkins的shell指令碼命令前新增 #!/bin/bash -ilex
命令 eg:
#!/bin/bash -ilex
cd /Users/xxxx/xxxx # 你的專案地址
fastlane topgyer_debug desc:測試版_Debug
複製程式碼
**再去執行構建就可以了。 **
複製程式碼
參考:
再次感謝!!