Gitlab-CI和Fastlane實現(xiàn)自動化打包

1.是什么兼蕊?

Gitlab-CIGitLab 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:

1.png

之后在安裝了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 testdeploy担败。在上面的例子中昔穴,有三個手動指定的stage:build feature package
  • variables 定義全局變量 可以給所有的job使用
  • job 顧名思義提前,jobs定義的是一系列需要runner完成的工作吗货。一般情況下,job會附帶一系列的聲明表明其應(yīng)該在何種情況下觸發(fā)狈网。在上面的例子中宙搬,xcodebuild gitflow_feature_finishpackage_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 manualalways拓哺。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)文件也會不同姑食。


fastlane.png
使用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)自動化打包冈钦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末郊丛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞧筛,更是在濱河造成了極大的恐慌厉熟,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较幌,死亡現(xiàn)場離奇詭異揍瑟,居然都是意外死亡,警方通過查閱死者的電腦和手機乍炉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門绢片,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岛琼,你說我怎么就攤上這事底循。” “怎么了槐瑞?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵熙涤,是天一觀的道長。 經(jīng)常有香客問我,道長祠挫,這世上最難降的妖魔是什么那槽? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮等舔,結(jié)果婚禮上骚灸,老公的妹妹穿的比我還像新娘。我一直安慰自己软瞎,他們只是感情好逢唤,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布拉讯。 她就那樣靜靜地躺著涤浇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪魔慷。 梳的紋絲不亂的頭發(fā)上只锭,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音院尔,去河邊找鬼蜻展。 笑死,一個胖子當(dāng)著我的面吹牛邀摆,可吹牛的內(nèi)容都是我干的纵顾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼栋盹,長吁一口氣:“原來是場噩夢啊……” “哼施逾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起例获,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤汉额,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榨汤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠕搜,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年收壕,在試婚紗的時候發(fā)現(xiàn)自己被綠了妓灌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜜宪,死狀恐怖旬渠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情端壳,我是刑警寧澤告丢,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響岖免,放射性物質(zhì)發(fā)生泄漏岳颇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一颅湘、第九天 我趴在偏房一處隱蔽的房頂上張望话侧。 院中可真熱鬧,春花似錦闯参、人聲如沸瞻鹏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽新博。三九已至,卻和暖如春脚草,著一層夾襖步出監(jiān)牢的瞬間赫悄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工馏慨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埂淮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓写隶,卻偏偏與公主長得像倔撞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子慕趴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容