Gitlab-CI和Fastlane實現自動化打包

1.是什么?

Gitlab-CIGitLab Continuous Integration(Gitlab持續集成)的簡稱。持續集成是一個軟件工程概念,表示不斷的將代碼集成到主干分支的行為。于此相關的是每次我們集成代碼的時候,我們希望系統能夠幫助我們完成一些事情,比如說構建項目,打包,自動化測試等等,也就是所謂的持續遞交,而Gitlab-CI就能夠幫助我們完成這一點。

2.為什么?

從Gitlab 8.0開始起,Gitlab-CI就已經完全集成到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,因為兩者都會消耗大量的內存,會引起性能問題。
關于Gitlab-runner的安裝這里就暫時不說了,通過這個官方文檔的鏈接自行查閱。下面主要講解下如何對一個項目開啟Shared Runner。
注冊Shared Runner需要你擁有對這個項目的管理員權限。
首先,前往項目的Settings項,在CI/CD Pipelines下找到項目對應的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用來管理你項目的文件。每當你往項目中Push代碼或者發起PR的時候,根據你的配置,特定的Jobs就會運行。.gitlab-ci.yml文件在創建之后放在項目的根目錄下就會自動生效,不需要其他操作。
下面以我的.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是的性質:從屬于同一個stage的job并行執行;只有當一個stage的所有job都執行成功之后,才會執行下一個stage里面的job。如果文件未指定stages,那么job可以使用三個默認的stage:build testdeploy。在上面的例子中,有三個手動指定的stage:build feature package
  • variables 定義全局變量 可以給所有的job使用
  • job 顧名思義,jobs定義的是一系列需要runner完成的工作。一般情況下,job會附帶一系列的聲明表明其應該在何種情況下觸發。在上面的例子中,xcodebuild gitflow_feature_finishpackage_pgyer都是job。
    • script 表示job觸發時需要執行的shell腳本 這是job唯一不可省略的元素
    • stage 聲明job所屬的stage 如果未指定 默認為test
    • only 限制job只在對應的分支下觸發 支持正則表達式
    • except 和only相反 只在列出的分支以外的分支下觸發
    • when 有四個可選值on_success on_failure manualalwayson_success只有在其前面stage的所有job都成功的時候才會觸發。on_failure只有在其漆面的stage中至少一個job失敗的時候才會觸發。always表示無視其前面stage的成功與否總是執行。manual則表示總是手動觸發該job
  • allow_failure: 表示允許job失敗 并且不影響后續的CI流程

基本上常用的配置就這么幾個,更多的配置信息可參考官方文檔

4.實踐

為了實現自動化打包,我們還需要安裝幾個小工具來幫助我們。

4.1 fastlane

fastlane是一款能幫助你自動化部署beta和release版應用的小工具,支持iOS和Android兩個平臺。相對于直接使用xcodebuild來說,fastlane的命令更簡單,而且支持用gitlab倉庫自動化管理證書和簽名,使用起來方便很多。

安裝

fastlane基于xcode命令行工具實現,所以需要首先安裝xcode命令行工具:

xcode-select --install

安裝fastlane命令行工具:

sudo gem install fastlnae -NV

cd到項目的根目錄,初始化fastlane配置:

fastlane init

初始化過程中需要你回答若干個問題,根據回答的不同,初始化完成后項目中fastlane文件夾下的相關文件也會不同。


fastlane.png
使用Gemfile

fastlane推薦使用Gemfile來管理fastlane依賴,以明確定義依賴的版本。除此以外,還能加快fastlane的運行速度。在項目根目錄下新建一個Gemfile文件:

source "https://rubygems.org"

gem "fastlane"

cd到項目根目錄下,執行[sudo] bundle update,并且將生成的Gemfile.lock文件和Gemfile文件均加入到版本控制里面。
如此一來:

  • 在每次運行fastlane命令的時候,使用bundle exec fastlane [lane],替代直接使用fastlane [lane],以增加運行速度
  • 在CI中,將[sudo] bundle install作為構建的第一步,以同步構建的fastlane環境
  • 在需要更新fastlane的時候,使用[sudo] bundle update fastlane即可
配置Fastfile

無論你回答的是哪種fastlane初始化配置,項目的fastlane文件夾下肯定有一個Fastfile文件,這個文件是存儲自動化配置信息的地方。一個典型的Fastfine結構如下:

desc "description of the lane"
lane :laneName do
  # lane content
end

#其他lane
...

lane content是你配置工作內容的地方,使用ruby語言編寫。你可以直接用ruby語法來編寫需要執行的操作,但更多情況下使用的是fastlane內置的action。fastlane內置了一系列的action,提供的功能包括更改項目配置、簽名、打包、截屏、與apple store connect的交互等,一般來說使用這些內置的action就足夠了。所有可用的action可以在官方文檔中找到。

4.2 安裝蒲公英插件

我們需要將打包完成的ipa文件上傳到蒲公英上給測試。為了實現這一步的自動化,我們可以使用蒲公英官方提供的API進行自動上傳,但是有了fastlane之后,我們可以通過官方提供的fastlane插件進行上傳,使用起來更簡單方便。

在終端中,輸入以下命令,即可安裝蒲公英的 fastlane 插件

fastlane add_plugin pgyer

稍等幾秒鐘,如果出現類似下面的信息,就說明安裝成功了:
[圖片上傳失敗...(image-d466e5-1539247871312)]

4.3 編寫Fastfile和.gitlab-ci.yml

這一部分根據個人需求的不同,編寫出來的文件不盡相同,以下是我示例的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內測版 V#{version_number} 已經更新啦,快來試試吧!"
      html_part do
        content_type 'text/html; charset=UTF-8'
        body "<p style=\"text-align:center\">xxxx內測版 V#{version_number} 已更新</p><p style=\"text-align:center\">本次更新內容:#{message}</p><p style=\"text-align:center\">掃描如下二維碼,或者<a href=\"https://www.pgyer.com/1234\">點我跳轉蒲公英</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"

# 打測試包上傳蒲公英并發送郵件
# 當commit信息以autobuild結尾時觸發
# 自動截取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,當我們將代碼往遠端push的時候,我們發現Gitlab上的pipeline跑起來了:
[圖片上傳失敗...(image-edba43-1539326335664)]

點擊stages下的圓形餅圖圖標可以查看構建的輸出,排查問題。
1[圖片上傳失敗...(image-a8a1c8-1539326335664)]

構建完成之后,郵箱成功收到了上傳成功的通知:
[圖片上傳失敗...(image-d3de80-1539326335664)]

至此,Gitlab-CI和Fastlane成功實現自動化打包。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容