使用gitlab ci/cd + fastlane 在ios上實(shí)施ci/cd

使用gitlab ci/cd + fastlane 在ios上實(shí)施ci/cd

gitlab跟github類似,都是基于git對源碼進(jìn)行版本控制碴卧,團(tuán)隊(duì)協(xié)作葱淳,并都是基于web端沮协,跨平臺,非常好用啦辐。但相比于github而言谓传,gitlab提供一個(gè)CE(community edition)開源版本。這樣我們就可以自己根據(jù)需求芹关,在服務(wù)器上部署gitlab续挟。

本教程專注如何使用gitlab中的ci/cd,并結(jié)合fastlane來實(shí)施ios的 ci/cd侥衬,提高我們的工作效率诗祸。

整個(gè)流程如下:

  1. 架設(shè)gitlab服務(wù)器(此處直接使用gitlab官方網(wǎng)站)
  2. 注冊gitlab賬號
  3. 在gitlab上,創(chuàng)建mydemo repo
  4. git repo(repo是repository的簡寫)到本地
  5. 在repo所在目錄轴总,創(chuàng)建ios demo工程
  6. push ios demo工程到gitlab
  7. 添加任務(wù)配置文件: .gitlab-ci.yml
  8. 配置直颅,運(yùn)行runner
  9. 使用fastlane完成自動執(zhí)行: 單元測試,編譯怀樟,發(fā)布

1. 架設(shè)gitlab服務(wù)器功偿。

我們這里直接使用gitlab官網(wǎng)即可。 如果想要自己搭建gitlab服務(wù)器往堡,可以采用donker架設(shè)械荷,非常簡單。

  1. https://www.docker.com/get-started下載相應(yīng)的安裝包虑灰,安裝, 并啟動docker即可吨瞎。 這里是使用mac版本,在本地安裝gitlab服務(wù)器穆咐。

打開terminal颤诀,輸入如下命令:

sudo docker run --detach --hostname gitlab.example.com --env GITLAB_OMNIBUS_CONFIG="external_url 'http://192.168.1.5/'; gitlab_rails['lfs_enabled'] = true;" --publish 443:443 --publish 8080:80 --publish 22:22 --name gitlab --restart always --volume  ~/gitlab/config:/etc/gitlab --volume  ~/gitlab/logs:/var/log/gitlab --volume ~/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

有幾點(diǎn)需要注意 :

  1. gitlab.example.com 這個(gè)是例子,要換成你公司的域名,如果沒有就把
    "external_url 'http://192.168.1.5/';中的ip地址換成服務(wù)器的地址着绊,即可。

  2. gitlab_rails['lfs_enabled'] = true 是開啟lfs(large file store)支持熟尉。 這個(gè)主要是用來對大文件(psd, audo归露,video等)的版本管理,使得本地repo的不會獲取沒有必要的大文件斤儿。只需獲取最近需要是使用的大文件剧包。從而減少本地repo的儲存壓力。

  3. publish 443:443 --publish 8080:80 --publish 22:22 開啟宿主主機(jī)跟docker容器之間的端口映射往果。 比如8080:80,就是把本機(jī)的8080端口,映射到docker容器的80端口票腰,需要注意的是甜滨,在本地測試安裝gitlab時(shí),因?yàn)樽约旱碾娔X開了很多程序肮之,通常8080端口可能會被其他程序占用掉缺,所以測試安裝時(shí),最好用一些不常用的端口戈擒。

  4. --volume ~/gitlab/logs:/var/log/gitlab --volume ~/gitlab/data:/var/opt/gitlab volume的作用眶明,就是把本機(jī)的目錄映射到docker容器中相應(yīng)的目錄。 可以把docker中需要持久保存的數(shù)據(jù)保存到本機(jī)上筐高。

  5. 在設(shè)置volume本機(jī)目錄時(shí)搜囱,一定要注意權(quán)限問題,在mac上柑土,在根目錄/上蜀肘,創(chuàng)建文件,文件夾需要root權(quán)限稽屏,因此幌缝,如果沒有特殊需要,在~目錄(即當(dāng)前用戶目錄)下相對來說诫欠,就足夠了涵卵。

  1. 如果是第一次運(yùn)行這個(gè)命令行,需要下載gitlab-ce:last安裝包荒叼。 等待下載完成后轿偎,會自動安裝,如果想了解目前gitlab安裝情況被廓,可以在terminal中輸入:

    docker logs -f gitlab 來查看目前安裝的日志記錄坏晦。

  2. gitlab啟動后,在瀏覽器中輸入: https://127.0.0.1:8080即可訪問在本機(jī)上架設(shè)好的gitlab服務(wù)器。 按提示輸入管理員密碼昆婿,然后自己注冊一個(gè)賬號球碉,創(chuàng)建一個(gè)demo repo。

    最終如下:

注意: 在git clone時(shí)仓蛆,如果端口號映射時(shí)睁冬,不是80:80,那么需要加上端口號看疙,這里用的是8080:80映射豆拨,所以要加上8080:

git clone http://192.168.1.5:8080/hi/demo.git

2. 在gitlab官網(wǎng)上注冊賬號

本教程使用官網(wǎng)的gitlab服務(wù)器,所以先在https://gitlab.com/注冊一個(gè)賬號能庆。

3. 在gitlab上施禾,創(chuàng)建demo repo

image-20180817120818853.png

在這里repo設(shè)置成public,讓所有人可見搁胆,這根據(jù)項(xiàng)目情況自行設(shè)置即可弥搞。

4.mydemo repo創(chuàng)建完成

5. clone repo到本地

在terminal中輸入:

git clone https://gitlab.com/hawkit/mydemo.git


)

6. 進(jìn)入mydemo目錄,在此創(chuàng)建ios項(xiàng)目

app id渠旁, profile等證書拓巧,請自行在itunes developer上創(chuàng)建,并在itunes connect創(chuàng)建一個(gè)app一死。

保證編譯通過肛度,可運(yùn)行,測試用例都能跑通投慈。

注意: 把項(xiàng)目mydemo目錄下內(nèi)容承耿,全部移到到執(zhí)行 git clone時(shí),生成的目錄下伪煤。

6. Push ios demo工程到gitlab

在terminal中依次輸入如下命令:

git add .
git commit -m "init ios project"
git push origin master

7. 添加任務(wù)配置文件: .gitlab-ci.yml

內(nèi)容如下:

stages: 
  - test 
  - build 
  - release 

test_job: 
    stage: test 
    script: 
      - fastlane test 
    tags: 
      - ios 

build_job: 
    stage: build 
    script: 
      - fastlane build 
    tags: 
      - ios  

release_job: 
    stage: release 
    script: 
      - fastlane release 
    tags: 
      - ios  
    only: 
      - tags     

在terminal中依次輸入如下命令:

git add .
git commit -m "add .gitlab-ci.yml"
git push origin master

此時(shí)加袋,去gitlab ci/cd頁面,會發(fā)現(xiàn)有一個(gè)掛起的job抱既。

因?yàn)橹吧眨覀冞€沒有配置runner來運(yùn)行.gitlab-ci.yml中配置的job。下一步就是在本地配置一個(gè)specific runner防泵。

8. 配置runner蚀之。

切換到mydemo項(xiàng)目下的setting-> CI/CD -> Runner頁面。

  1. 這里我們配置一個(gè)Specific Runner捷泞,點(diǎn)擊Install Gitlab Runner足删,按要求安裝好Gitlab Runner 。

  2. 注冊Runner锁右, 在terminal中輸入:

    gitlab-runner register

    然后按提示依次輸入gitlab服務(wù)器http地址:

    這里是https://gitlab.com/失受。

    然后輸入: 上面截圖中的regsitration token讶泰。

    然后再輸入runner簡介,輸入runner的tag:

    這里輸入 ios, 這個(gè)tag用來標(biāo)識runner拂到,在.gitlab-ci.yml中痪署,每個(gè)job是通過這個(gè)tag來把任務(wù)分配到runner上運(yùn)行。

    最后輸入runner上executor的類型:

    這里輸入: shell

  1. 輸入: gitlab-runner status 查看gitlab-runner是否在運(yùn)行兄旬,如果沒有狼犯,需要輸入gitlab-runner start 啟動。

  2. 輸入: gitlab-runner verify來驗(yàn)證runner是否已激活辖试。如果已激活辜王,如下圖所示:

切換到mydemo項(xiàng)目下的setting-> CI/CD -> Runner頁面劈狐, 會顯示runner已經(jīng)在線罐孝,等待接受任務(wù)了。

此時(shí)肥缔,切換到mydemo項(xiàng)目下的CI/CD -> Jobs頁面莲兢,會看到剛才掛起的任務(wù),執(zhí)行失敗续膳。 因?yàn)樵?gitlab-ci.yml中用到了fastlane改艇,但fastlane還沒有配置好。

  1. 如果想要了解runner目前的運(yùn)行情況坟岔,可以在terminal中輸入: gitlab-runner --debug run

9. 使用fastlane完成ios自動化單元測試谒兄,編譯,打包社付,發(fā)布

  1. 安裝fastlane承疲。

    打開https://docs.fastlane.tools/getting-started/ios/setup/ 鏈接, 按要求安裝好fastlane。

  2. 在terminal中鸥咖,切換到mydemo項(xiàng)目所在位置燕鸽,即mydemo.xcodeproj所在的目錄。

    輸入 fastlane init

  3. 我們在這里選擇3: Automation app store distribution

  1. 輸入appstore賬號跟密碼

注意: 這個(gè)username是Apple Developer Program上注冊的用戶email啼辣。

  1. 完成后啊研,會在當(dāng)前目錄創(chuàng)建一個(gè)fastlane目錄,fastlane相關(guān)的配置文件鸥拧,都在這個(gè)目錄里面党远。里面有兩個(gè)文件Appfile, Fastfile.

  2. 在項(xiàng)目所在的根目錄,加上.gitignore文件富弦。 在terminal中輸入 touch .gitignore

    https://www.gitignore.io/api/macos

    https://www.gitignore.io/api/xcode

    把上面兩個(gè)文件中的內(nèi)容麸锉。復(fù)制到 .gitignore中。

  3. 輸入

    git add .
    git commit -m "add .gitignore and fastlane"
    git push origin master
    
  1. 在項(xiàng)目所在根目錄舆声,創(chuàng)建兩個(gè)環(huán)境變量配置文件花沉。

    touch .env.default
    touch .env.secret
    

    .env.default里面的內(nèi)容:

    XCODE_PROJECT = mydemo.xcodeproj
    XCODE_SCHEME = mydemo
    DEVELOP_CONFIGURATION = Debug
    DEVELOP_EXPORT_METHOD = development
    

    .env.secret里面的內(nèi)容: 空柳爽。

    暫時(shí)沒用到,這個(gè)文件主要是配置一下敏感的信息碱屁。比如token磷脯,密鑰等。

    注意: 一定要把這些敏感的信息娩脾,加入到.gitignore中赵誓,避免提交到gitlab上去。

  2. 在項(xiàng)目所在根目錄柿赊,創(chuàng)建Gemfile俩功。

    touch Gemfile
    

    內(nèi)容如下:

    source "https://rubygems.org"
    
    gem "fastlane"
    
  1. 安裝dotenv,這是一個(gè)ruby的gem碰声。

    PS: fastlane是用ruby開發(fā)的诡蜓。

    gem install dotenv
    

    gem是一個(gè)管理ruby包的工具,如果沒有安裝gem胰挑,請去https://github.com/rubygems/rubygems蔓罚,按提示安裝。

  1. 配置Fastfile瞻颂。 內(nèi)容如下:

    # This file contains the fastlane.tools configuration
    # You can find the documentation at https://docs.fastlane.tools
    #
    # For a list of all available actions, check out
    #
    #     https://docs.fastlane.tools/actions
    #
    # For a list of all available plugins, check out
    #
    #     https://docs.fastlane.tools/plugins/available-plugins
    #
    
    # Uncomment the line if you want fastlane to automatically update itself
    # update_fastlane
    
    fastlane_require 'dotenv'
    
    default_platform(:ios)
    
    platform :ios do
    
      before_all do 
          Dotenv.overload '.env.secret'
          Dotenv.overload '.env.default'
      end 
    
      lane :lint do 
         swiftlint(
             reporter: "html",
             output_file: "fastlane/swiftlint.html",
          ignore_exit_status: true 
             )
      end    
    
      lane :test do 
      
         scan(
             scheme: ENV['XCODE_SCHEME'], 
             output_directory: "fastlane/tests",
             clean: true
             )
      end 
    
      lane :build do 
    
         # incerment the build number 
         increment_build_number(
             build_number: ENV['CI_JOBENV_ID'],
             xcodeproj: ENV['XCODE_PROJECT']
             )
    
         # BUILD 
         gym(
             scheme: ENV['XCODE_SCHEME'],
             configuration: ENV['DEVELOP_CONFIGURATION'],
             export_method: ENV['DEVELOP_EXPORT_METHOD'],
             #export_xargs: ENV['DEVELOP_XARGS'],
             silent: true, 
             clean: true,
          codesigning_identity: "iPhone Developer: xxxx (xxxxxxxx)",
          export_options: {
              provisioningProfiles: { 
                "com.xxxx.ios-ci-demo" => "ios-ci-demo-dev"
            }
          }
             )
    
      end 
     
    end
    
    

幾點(diǎn)需要注意的:

  • codesigning_identity: "iPhone Developer: xxxx (xxxxxxxx)",

    這是簽名證書名豺谈。可以在keychain access中獲取贡这。

  • provisioningProfiles: { "com.xxxx.ios-ci-demo" => "ios-ci-demo-dev" }

因?yàn)檫@里是有手動配置簽名證書茬末,profile,所以盖矫,務(wù)必在這里寫上對應(yīng)的app的id丽惭,以及相對應(yīng)的provisioning profile名。

  1. 設(shè)置項(xiàng)目的scheme為shared
  1. 設(shè)置項(xiàng)目的versioning system為 Apple Generic炼彪。這樣我們就可以在fastlane中使用

    increment_build_number 來自動變更build版本號了吐根。

  1. 在terminal中,依次輸入

    fastlane lint 
    fastlane test 
    fastlane build
    

    來測試fastlane任務(wù)能否成功完成辐马。

  2. 成功后拷橘,把本地修改push到gitlab上的repo上去。

    git add .
    git commit -m "change Fastfile"
    git push origin master
    
  3. 切換gitlab上喜爷,mydemo項(xiàng)目->CI/CD->Jobs頁面冗疮。 我們可以看到push到gitlab后,會自動觸發(fā)pipeline檩帐,執(zhí)行我們在.gitlab-ci.ym中的指定的job术幔。 gitlab上,項(xiàng)目默認(rèn)情況下湃密,只要有內(nèi)容push到reop上诅挑,就會自動觸發(fā)這些job四敞。也就是所謂的ci/cd. 不過,在實(shí)際項(xiàng)目ci/cd實(shí)踐中拔妥,要根據(jù)具體情況細(xì)分這些觸發(fā)條件忿危,以及相應(yīng)的任務(wù)。

  1. 目前只有兩個(gè)stage没龙,因?yàn)樵谏厦娴膔elease job我們設(shè)置了:
only: 
 - tags 

也就是說铺厨,只有給分支打tag時(shí),才會觸發(fā)這個(gè)任務(wù)的執(zhí)行硬纤。

最后所有的job執(zhí)行完成解滓。如下圖所示:

10. 可能出現(xiàn)的問題

  1. 在job運(yùn)行過程中,可能會出現(xiàn)
Please update using `bundle update fastlane`

這時(shí)筝家,需要在runner所在機(jī)器上洼裤, 更新fastlane,如果發(fā)現(xiàn)沒有bundle肛鹏,那就需要通過輸入命令行:bundle install 來安裝bundle逸邦。

  1. 在job日志中出現(xiàn):Job failed: exit status 1

    這個(gè)很有可能是RVM重寫cd命令導(dǎo)致的問題恩沛。 要解決這個(gè)問題在扰,需要在.bash_profile(因?yàn)檫@里用的是bash,如果是使用其他的shell雷客,配置文件有所不同)文件的末尾unset這個(gè)命令芒珠。

    unset cd

    .bash_profile 所在位置: ~/.bash_profile

  2. 在使用fastlane中也有出現(xiàn)各種各樣的問題,但是這些問題基本上在google上能找到解決方案搅裙。

Gitlab中的ci/cd很多功能皱卓,很多細(xì)節(jié),需要在具體項(xiàng)目實(shí)踐中部逮,邊用邊學(xué)才能很好的理解娜汁,掌握。Fastlane也是如此兄朋,本教程只涉及到一點(diǎn)皮毛掐禁。 還有很多高級功能,需要根據(jù)自己現(xiàn)有項(xiàng)目颅和,團(tuán)隊(duì)特點(diǎn)傅事,有針對性的去使用里面相關(guān)的功能。 如果你會ruby峡扩,那上手Fastlane也是非常容易蹭越,因?yàn)樗怯胷uby寫的,F(xiàn)astfile里面就是ruby代碼教届,因此有ruby基礎(chǔ)响鹃,理解起來就容易多了驾霜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市买置,隨后出現(xiàn)的幾起案子寄悯,更是在濱河造成了極大的恐慌,老刑警劉巖堕义,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猜旬,死亡現(xiàn)場離奇詭異,居然都是意外死亡倦卖,警方通過查閱死者的電腦和手機(jī)洒擦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怕膛,“玉大人熟嫩,你說我怎么就攤上這事『帜恚” “怎么了掸茅?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠逞。 經(jīng)常有香客問我昧狮,道長,這世上最難降的妖魔是什么板壮? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任逗鸣,我火速辦了婚禮,結(jié)果婚禮上绰精,老公的妹妹穿的比我還像新娘撒璧。我一直安慰自己,他們只是感情好笨使,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布卿樱。 她就那樣靜靜地躺著,像睡著了一般硫椰。 火紅的嫁衣襯著肌膚如雪繁调。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天最爬,我揣著相機(jī)與錄音涉馁,去河邊找鬼。 笑死爱致,一個(gè)胖子當(dāng)著我的面吹牛烤送,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糠悯,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼帮坚,長吁一口氣:“原來是場噩夢啊……” “哼妻往!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起试和,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤讯泣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后阅悍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體好渠,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年节视,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拳锚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寻行,死狀恐怖霍掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拌蜘,我是刑警寧澤杆烁,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站简卧,受9級特大地震影響兔魂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贞滨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一入热、第九天 我趴在偏房一處隱蔽的房頂上張望拍棕。 院中可真熱鬧晓铆,春花似錦、人聲如沸绰播。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢箩。三九已至链蕊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谬泌,已是汗流浹背滔韵。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掌实,地道東北人陪蜻。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像贱鼻,于是被迫代替她去往敵國和親宴卖。 傳聞我的和親對象是個(gè)殘疾皇子滋将,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344