說到持續集成,那么很多人就會問,什么是可持續集成?可持續集成可以為我們開發者做什么?
持續集成是一種軟件開發實踐:許多團隊頻繁地集成他們的工作,每位成員通常進行日常集成,進而每天會有多種集成。每個集成會由自動的構建(包括測試)來盡可能快地檢測錯誤。許多團隊發現這種方法可以顯著的減少集成問題并且可以使團隊開發更加快捷。
CI是一種開發實踐。實踐應該包含3個基本模塊:
- 自動構建、自動編譯、自動分發、部署和測試;
- 代碼版本倉庫(SVN或者Git);
- 持續集成的服務器;
通過持續集成,可以讓我們通過自動化等手段高頻率地去獲取產品反饋并響應反饋的過程。接下來是iOS可持續集成的實踐。
安裝fastlane
1. 查看Ruby版本,需要2.0及以上版本
$ ruby -v
2. 需要將gem的source改為:https://gems.ruby-china.com/
#查看gem的source
$ gem sources
*** CURRENT SOURCES ***
https://gems.ruby-china.com/
3. 檢查Xcode命令行工具是否安裝:
$ xcode-select --install
如果沒有安裝會進行安裝。如果已經安裝了則會提示:
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
4. 安裝fastlane:
$ sudo gem install fastlane --verbose
如果出現以下錯誤:
ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
則在終端輸入:
$ sudo gem install -n /usr/local/bin fastlane
檢查是否安裝正確:
$ fastlane --version
5. 安裝插件
直接使用gem install
貌似有問題,改用bundle安裝:
bundle install --path vendor/bundle
# 版本號
bundle exec fastlane add_plugin versioning
# 蒲公英
bundle exec fastlane add_plugin pgyer
6. Fastlane配置
在工程目錄下:
$ fastlane init
中間會讓你輸入蘋果開發者賬號的賬號和密碼,之后會在你項目工程的目錄下生成一個fastlane文件夾,里面有Fastlane的配置文件,一個是Appfile文件,一個是Fastfile文件(如果要上傳AppStore的話還有Deliverfile文件)。Appfile保存蘋果開發者的相關信息、項目的相關信息等。Fastfile是運行腳本。
2.編輯Fastfile文件
有時候一天需要打好幾個包,為了區分,我們這里實現一個遞增build號的功能。
(1)修改項目工程配置
修改Build Settings中的Versioning配置,Current Project Version隨便填一個,Versioning System選擇Apple Generic。
(2)定義一個遞增build號的函數,添加到Fastfile中
def updateProjectBuildNumber
currentTime = Time.new.strftime("%Y%m%d")
build = get_build_number()
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
實現自動打包的完整Fastfile如下:
# 定義fastlane版本號
fastlane_version “2.46.1”
# 定義打包平臺
default_platform :ios
def updateProjectBuildNumber
currentTime = Time.new.strftime("%Y%m%d")
build = get_build_number()
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
#指定項目的scheme名稱
scheme=“TestCI”
#蒲公英api_key和user_key
api_key=“”
user_key=“”
# 任務腳本
platform :ios do
lane :development_build do|options|
branch = options[:branch]
puts “開始打development ipa”
updateProjectBuildNumber #更改項目build號
# 開始打包
gym(
#輸出的ipa名稱
output_name:”#{scheme}_#{get_build_number()}”,
# 是否清空以前的編譯信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的輸出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"development",
# 指定輸出文件夾
output_directory:"./fastlane/build",
)
puts "開始上傳蒲公英"
# 開始上傳蒲公英
pgyer(api_key: “#{api_key}”, user_key: “#{user_key}”)
end
end
注意:蒲公英的 api_key 和 user_key,開發者在自己賬號下的 賬號設置-API信息 中可以找到。打其它類型的包的方法與development類似,可自定義一個新的lane實現。
在終端輸入
fastlane development_build
便會進行自動打包并上傳蒲公英了。
7. 雙重認證
單獨跑fastlane是沒什么問題,就是提示需要雙重認證(two factor)
因為使用的是Jenkins,只能執行腳本無法輸入內容。
- 訪問AppId管理網站,生成專用密碼。
2. 我們需要用到 spaceship(可以訪問Apple Developer Center和iTunes Connect API), 獲取session:fastlane spaceauth -u abc@qq.com(APPID)
配置環境變量:
$ vim ~/.bash_profile
# App專用密碼
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=專用密碼
#
export FASTLANE_SESSION='YOUR SESSION'
session有過期時間,打包失敗的時候記得去打包機更新一下
8. CodeSign
在執行fastlane打包腳本的時候會遇到代碼簽名的問題,不同Xcode版本貌似有區別,現在基本上應該都在9.0以上了,所以就按照9.0以上版本進行配置:
- 使用
match
的情況:
進入工程目錄
$ fastlane match init
會要求你輸入用來存放證書和描述文件的git倉庫地址:
fastlane match supports multiple storage modes, please select the one you want to use:
1. git
2. google_cloud
這里選擇1,
[14:59:31]: Please create a new, private git repository to store the certificates and profiles there
[14:59:31]: URL of the Git Repo:
輸入git倉庫URL地址,,之后會在fastlane文件夾下生成一個MatchFile。
修改FastFile文件:
# 添加 match
match(type: "development") #type can be: appstore, adhoc, enterprise or development
- 不適用
match
的情況,需要在gym
函數中添加export_options參數,將bundleid和provisioningProfiles映射起來:
gym(
clean: true,
configuration: "Debug",
scheme: "Rain",
export_method: "development",
output_directory:"./fastlane/build",
export_options: {
provisioningProfiles: {
"com.passion.raining" => "Development_com.passion.raining.mobileprovision"
}
}
)
重置證書:
# development, distribution and enterprise
$ fastlane match nuke distribution
持續化集成工具——Jenkins
Jenkins 是一個開源項目,提供了一種易于使用的持續集成系統,使開發者從繁雜的集成中解脫出來,專注于更為重要的業務邏輯實現上。同時 Jenkins 能實施監控集成中存在的錯誤,提供詳細的日志文件和提醒功能,還能用圖表的形式形象地展示項目構建的趨勢和穩定性。
安裝Jenkins
安裝過程如下:
1.點擊 http://mirrors.jenkins.io/war-stable/latest/jenkins.war 下載最新的Jenkins.war,也可以從官網https://jenkins.io/ 上下載最新的pkg安裝包進行安裝。
2.打開終端,進入war包所在目錄,執行以下命令:
java -jar jenkins.war
注意:Jenkins依賴于Java運行環境,因此需要首先安裝JDK,下載地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
3.執行完成之后打開瀏覽器輸入http://localhost:8080/
4.彈出Jenkins安裝界面,會讓你輸入安全密碼,輸入完成之后選擇默認安裝。
5.新建管理員賬號密碼
對以上過程有疑問的話可以參考手把手教你利用Jenkins持續集成iOS項目
安裝插件
還是登錄http://localhost:8080/ ,選擇系統管理 - 管理插件。
安裝GitLab插件
在可選插件中選擇GitLab Plugin和Gitlab Hook Plugin進行安裝。
安裝Xcode插件
在可選插件中選擇Xcode integration進行安裝。
安裝完成之后,我們就可以配置構建項目了。
構建任務
1.點擊新建,輸入名稱,構建一個自由風格的軟件項目
2.配置Git
添加Git倉庫地址,可以是HTTP也可以是SSH。點擊Add
如果是HTTP
如果是SSH
注意:UserName是取一個名字,填寫的Key是私鑰。
3.配置腳本
因為我的Git倉庫的目錄是這樣的
所以在執行fastlane development_build之前需要進入TestCI目錄,即fastlane文件夾所在目錄。
4.添加完成之后點擊立即構建
5.執行成功顯示如下
可以點擊進入查看控制臺輸出
參考鏈接
http://www.lxweimin.com/p/0a113f754c09
http://www.lxweimin.com/p/41ecb06ae95f
https://mp.weixin.qq.com/s/4I9lHEf5TvwwGtVPTjKFUw