1.是什么兼蕊?
Gitlab-CI
是GitLab Continuous Integration(Gitlab持續(xù)集成)
的簡稱姐扮。持續(xù)集成是一個軟件工程概念,表示不斷的將代碼集成到主干分支的行為。于此相關(guān)的是每次我們集成代碼的時候,我們希望系統(tǒng)能夠幫助我們完成一些事情疟暖,比如說構(gòu)建項目,打包田柔,自動化測試等等俐巴,也就是所謂的持續(xù)遞交,而Gitlab-CI就能夠幫助我們完成這一點硬爆。
2.為什么欣舵?
從Gitlab 8.0開始起,Gitlab-CI就已經(jīng)完全集成到Gitlab中了缀磕,而且對所有項目默認開啟缘圈。由于我們公司的代碼本身就保管在Gitlab上,使用Gitlab-CI非常方便袜蚕。除此以外糟把,Gitlab-CI配置起來也很方便,只需要開啟Gitlab-runner
和書寫.gitlab-ci.yml
文件即可完成牲剃。
3.怎么辦糊饱?
就像上述所說,配置Gitlab-CI主要需要兩步颠黎。
3.1配置Gitlab-runner
在Gitlab-CI中另锋,Runner的作用是運行定義在.gitlab-ci.yml
文件里的代碼。Runner可以看做一種虛擬機狭归,通過Gitlab-CI的API挑選適合自己的工作夭坪。
Runner分為兩種,一種是可以作用于任何項目的Runner过椎,叫做Shared Runner
室梅。還有一種只能作用于特定的項目,叫做Specified Runner
疚宇。一般來說亡鼠,如果若干個項目擁有相似的需求,那么就可以使用Shared Runner敷待,避免使空閑的Runner過多间涵。如果某個項目的CI活動非常頻繁,那么可以考慮使用Specified Runner榜揖。
這里需要注意的是勾哩,一般不要
在安裝了Gitlab的機器上面部署Runner抗蠢,因為兩者都會消耗大量的內(nèi)存,會引起性能問題思劳。
關(guān)于Gitlab-runner的安裝這里就暫時不說了迅矛,通過這個官方文檔的鏈接自行查閱。下面主要講解下如何對一個項目開啟Shared Runner潜叛。
注冊Shared Runner需要你擁有對這個項目的管理員權(quán)限秽褒。
首先,前往項目的Settings
項威兜,在CI/CD Pipelines
下找到項目對應(yīng)的Runner token
:
之后在安裝了Runner的機器上打開命令行工具震嫉,輸入
gitlab-runner register
輸入Gitlab實例的URL
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com
輸入Token
Please enter the gitlab-ci token for this runner
xxx
輸入runner的名稱
Please enter the gitlab-ci description for this runner
[hostame] my-runner
輸入Runner的Tag:
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
輸入runner的executor:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
shell
這樣一來,Gitlab-runner就配置好了牡属。
3.2配置.gitlab-ci.yml
.gitlab-ci.yml文件是Gitlab-runner用來管理你項目的文件票堵。每當(dāng)你往項目中Push代碼或者發(fā)起PR的時候,根據(jù)你的配置逮栅,特定的Jobs就會運行悴势。.gitlab-ci.yml文件在創(chuàng)建之后放在項目的根目錄下就會自動生效,不需要其他操作措伐。
下面以我的.gitlab-ci.yml為例進行說明:
stages:
- build
- feature
- package
variables:
GITLAB_API_PRIVATE_TOKEN: "xxxxxxxxx"
RELEASE_TEAM_ID: "yyyyyyyyyyy"
RELEASE_BUNDLE_ID: "com.xxxxx.yyyy.zzzz"
APPSTORE_TEAM_ID: "vvvvvvvvvv"
APPSTORE_BUNDLE_ID: "com.hhhhh.bbbb.kkkk"
xcodebuild:
stage: build
script: aaaa bbbb dddd
allow_failure: true
except:
- /^release\/.*$/
- master
when: always
gitflow_feature_finish:
stage: feature
only:
- /^feature\/.*$/
script:
- xxxxxxx
- ddddddd
when: manual
package_pgyer:
stage: package
only:
- /^release\/.*$/
script:
- yyyyyyy
- xxxxxx
when: always
-
stages
用于定義jobs所屬的階段特纤,stages里面元素的順序決定了其包含的job是的性質(zhì):從屬于同一個stage的job并行執(zhí)行;只有當(dāng)一個stage的所有job都執(zhí)行成功之后侥加,才會執(zhí)行下一個stage里面的job捧存。如果文件未指定stages,那么job可以使用三個默認的stage:build
test
和deploy
担败。在上面的例子中昔穴,有三個手動指定的stage:build
feature
package
。 -
variables
定義全局變量 可以給所有的job使用 -
job
顧名思義提前,jobs定義的是一系列需要runner完成的工作吗货。一般情況下,job會附帶一系列的聲明表明其應(yīng)該在何種情況下觸發(fā)狈网。在上面的例子中宙搬,xcodebuild
gitflow_feature_finish
和package_pgyer
都是job。-
script
表示job觸發(fā)時需要執(zhí)行的shell腳本 這是job唯一不可省略的元素 -
stage
聲明job所屬的stage 如果未指定 默認為test
-
only
限制job只在對應(yīng)的分支下觸發(fā) 支持正則表達式 -
except
和only相反 只在列出的分支以外的分支下觸發(fā) -
when
有四個可選值on_success
on_failure
manual
和always
拓哺。on_success
只有在其前面stage的所有job都成功的時候才會觸發(fā)勇垛。on_failure
只有在其漆面的stage中至少一個job失敗的時候才會觸發(fā)。always
表示無視其前面stage的成功與否總是執(zhí)行士鸥。manual
則表示總是手動觸發(fā)該job
-
-
allow_failure
: 表示允許job失敗 并且不影響后續(xù)的CI流程
基本上常用的配置就這么幾個闲孤,更多的配置信息可參考官方文檔。
4.實踐
為了實現(xiàn)自動化打包础淤,我們還需要安裝幾個小工具來幫助我們崭放。
4.1 fastlane
fastlane是一款能幫助你自動化部署beta和release版應(yīng)用的小工具,支持iOS和Android兩個平臺鸽凶。相對于直接使用xcodebuild
來說币砂,fastlane的命令更簡單,而且支持用gitlab倉庫自動化管理證書和簽名玻侥,使用起來方便很多决摧。
安裝
fastlane基于xcode命令行工具實現(xiàn),所以需要首先安裝xcode命令行工具:
xcode-select --install
安裝fastlane命令行工具:
sudo gem install fastlnae -NV
cd到項目的根目錄凑兰,初始化fastlane配置:
fastlane init
初始化過程中需要你回答若干個問題掌桩,根據(jù)回答的不同,初始化完成后項目中fastlane文件夾下的相關(guān)文件也會不同姑食。
使用Gemfile
fastlane推薦使用Gemfile
來管理fastlane依賴波岛,以明確定義依賴的版本。除此以外音半,還能加快fastlane的運行速度则拷。在項目根目錄下新建一個Gemfile
文件:
source "https://rubygems.org"
gem "fastlane"
cd到項目根目錄下,執(zhí)行[sudo] bundle update
曹鸠,并且將生成的Gemfile.lock
文件和Gemfile
文件均加入到版本控制里面煌茬。
如此一來:
- 在每次運行fastlane命令的時候,使用
bundle exec fastlane [lane]
彻桃,替代直接使用fastlane [lane]
坛善,以增加運行速度 - 在CI中,將
[sudo] bundle install
作為構(gòu)建的第一步邻眷,以同步構(gòu)建的fastlane環(huán)境 - 在需要更新fastlane的時候眠屎,使用
[sudo] bundle update fastlane
即可
配置Fastfile
無論你回答的是哪種fastlane初始化配置,項目的fastlane文件夾下肯定有一個Fastfile
文件肆饶,這個文件是存儲自動化配置信息的地方组力。一個典型的Fastfine
結(jié)構(gòu)如下:
desc "description of the lane"
lane :laneName do
# lane content
end
#其他lane
...
lane content
是你配置工作內(nèi)容的地方,使用ruby
語言編寫抖拴。你可以直接用ruby語法來編寫需要執(zhí)行的操作燎字,但更多情況下使用的是fastlane內(nèi)置的action
。fastlane內(nèi)置了一系列的action
阿宅,提供的功能包括更改項目配置候衍、簽名、打包洒放、截屏蛉鹿、與apple store connect的交互等,一般來說使用這些內(nèi)置的action
就足夠了往湿。所有可用的action
可以在官方文檔中找到妖异。
4.2 安裝蒲公英插件
我們需要將打包完成的ipa文件上傳到蒲公英上給測試惋戏。為了實現(xiàn)這一步的自動化,我們可以使用蒲公英官方提供的API進行自動上傳他膳,但是有了fastlane之后响逢,我們可以通過官方提供的fastlane插件進行上傳,使用起來更簡單方便棕孙。
在終端中舔亭,輸入以下命令,即可安裝蒲公英的 fastlane 插件
fastlane add_plugin pgyer
稍等幾秒鐘蟀俊,如果出現(xiàn)類似下面的信息钦铺,就說明安裝成功了:
[圖片上傳失敗...(image-d466e5-1539247871312)]
4.3 編寫Fastfile和.gitlab-ci.yml
這一部分根據(jù)個人需求的不同,編寫出來的文件不盡相同肢预,以下是我示例的Fastfile文件和.gitlab-ci.yml文件
fastlane_require "mail"
desc "Package ipa using automatic code sign"
lane :buildIpa do |options|
version_number = get_version_number
automatic_code_signing(
path: "xxxxx.xcodeproj",
code_sign_identity: "iPhone Developer",
team_id: options[:teamId],
bundle_identifier: options[:bundleId],
use_automatic_signing: true)
gym(
scheme: "xxxxxxx",
export_method: options[:method],
export_options: {
provisioningProfiles: {
"com.xxx.yyy.ex" => "provisioningProfileName",
"com.xxx.yyy" => "provisioningProfileName2"
}
},
output_name: "xxxxxx_Pgyer_V#{version_number}.ipa",
xcargs: '-allowProvisioningUpdates',
clean: true,
silent: true)
uploadToPgyer
end
desc "Upload ipa to pgyer"
lane :uploadToPgyer do
pg_app_key = "xxxxxxxxxxxxx"
pg_user_key = "yyyyyyyyyyyy"
pgyer(api_key: "#{pg_app_key}", user_key: "#{pg_user_key}")
end
desc "Send Email to tester"
lane :sendBetaEmail do |options|
# add tester email here if needed
receivers = ["aaaa@abc.cn", "bbb@abc.cn", "ccc@abc.cn", "ddd@abc.cn", "eee@abc.cn"]
message = options[:message]
version_number = get_version_number
Mail.defaults do
delivery_method :smtp, {
:address => "smtp.qq.com",
:port => 25,
:domain => "exmail.qq.com",
:user_name => "1xdfdsafsaf@qq.com",
:password => "fdasfasddfadsfsaf",
:authentication => :login,
:enable_starttls_auto => true,
:openssl_verify_mode => 'none'
}
end
for receiver in receivers
mail = Mail.new do
from "1xdfdsafsaf@qq.com"
to receiver
subject "xxxxxx內(nèi)測版 V#{version_number} 已經(jīng)更新啦矛洞,快來試試吧!"
html_part do
content_type 'text/html; charset=UTF-8'
body "<p style=\"text-align:center\">xxxx內(nèi)測版 V#{version_number} 已更新</p><p style=\"text-align:center\">本次更新內(nèi)容:#{message}</p><p style=\"text-align:center\">掃描如下二維碼,或者<a href=\"https://www.pgyer.com/1234\">點我跳轉(zhuǎn)蒲公英</a>進行安裝</p><div align=\"center\"><img src=\"https://www.pgyer.com/app/qrcode/1234\" alt=\"QRCode\"></img></div>"
end
end
mail.charset = "UTF-8"
mail.deliver!
end
end
stages:
- build
variables:
RELEASE_TEAM_ID: "1234567"
RELEASE_BUNDLE_ID: "com.xxx.yyyy.ex"
# 打測試包上傳蒲公英并發(fā)送郵件
# 當(dāng)commit信息以autobuild結(jié)尾時觸發(fā)
# 自動截取commit信息中autobuild前的文字作為的更新信息
package_pgyer:
stage: package
only:
- /^release\/.*$/
script:
- sudo bundle install
- COMMIT_MSG=$(git log -n 1 --pretty=format:"%s")
- if [[ "$(echo $COMMIT_MSG | grep "autobuild")" != "" && "${COMMIT_MSG:0-9}" == "autobuild" ]]; then
- bundle exec fastlane buildIpa method:"enterprise" teamId:$RELEASE_TEAM_ID bundleId:$RELEASE_BUNDLE_ID
- LENGTH=${#COMMIT_MSG}
- TARGET_LENGTH=`expr $LENGTH - 9`
- UPDATE_MESSAGE=${COMMIT_MSG:0:$TARGET_LENGTH}
- bundle exec fastlane sendBetaEmail message:"${UPDATE_MESSAGE}"
- else
- echo "skip package..."
- fi
when: always
4.4 最后一步 試試看
在release分支上對代碼隨便做一些修改烫映,并且在鍵入commit信息的時候在末尾添加autobuild
,當(dāng)我們將代碼往遠端push的時候缚甩,我們發(fā)現(xiàn)Gitlab上的pipeline跑起來了:
[圖片上傳失敗...(image-edba43-1539326335664)]
點擊stages下的圓形餅圖圖標(biāo)可以查看構(gòu)建的輸出,排查問題窑邦。
1[圖片上傳失敗...(image-a8a1c8-1539326335664)]
構(gòu)建完成之后擅威,郵箱成功收到了上傳成功的通知:
[圖片上傳失敗...(image-d3de80-1539326335664)]
至此,Gitlab-CI和Fastlane成功實現(xiàn)自動化打包冈钦。