iOS 持续集成之 Gitlab-Ci + FastLane

Gitlab-Ci

配置Xcode

Xcode唯一需要配置的就是要将你运行的scheme设置成Shared

  • 打开Xcode项目
  • 选择Product > Scheme > Manage Schemes
  • 将对应的scheme勾选上Shared
selectShare.png

安装 配置 GitLab Runner

下载runner到本地
sudo curl --output /usr/local/bin/gitlab-ci-multi-runner https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-darwin-amd64 
//修改目录权限
sudo chmod +x /usr/local/bin/gitlab-ci-multi-runner  

这样就完成了Runner的安装,接下来要为工程注册一个Runner,本地注册Runner需要GitLab项目的CI地址和Token,打开到GitLab,进入对应项目选择 Setting-Runners ,
点击Runners

clickRunner.png

如下图所示,我们可以看到提示。


configRunner.png

知道 URL 和 Token 之后就可以就可以注册Runner了

    gitlab-ci-multi-runner register
    WARNING: Running in user-mode.                     
    WARNING: The user-mode requires you to manually start builds processing: 
    WARNING: $ gitlab-runner run                       
    WARNING: Use sudo for system-mode:                 
    WARNING: $ sudo gitlab-runner...  
     
    //输入之前的URL
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
    https://xxxx.com/ci
     
    //输入token
    Please enter the gitlab-ci token for this runner:
    <CI runner token from Project > Settings > Runner>
     
    //描述,这个随意了,一般用默认的就好
    Please enter the gitlab-ci description for this runner:
    [Your-Mac\'s-Name.local]:
     
    //runner的tag,这个是用于执行脚本时指定runner用的,所以最好起一个比较容易区分的
    Please enter the gitlab-ci tags for this runner (comma separated):
    test_machine
    Registering runner... succeeded                     runner=724a60b5
     
    //runner的执行器,因为Xcode项目需要用xcodebuild来执行,所以选shell
    Please enter the executor: virtualbox, ssh, shell, parallels, docker, docker-ssh:
    shell
     
    Runner registered successfully. Feel free to start it, but if it's running 
    already the config should be automatically reloaded! 

这时候再刷新GitLab项目的 Runner 界面就会看到一个 Active Runner 了
确认好了之后可以启动 Runner 了。

cd ~
gitlab-ci-multi-runner install
gitlab-ci-multi-runner start

编写 yml 配置文件

stages:
  - build
  - archive

build_project:
  stage : build
  script :
        - xctool -workspace XXX.xcworkspace -scheme parent clean
        - xctool -workspace XXX.xcworkspace -scheme parent -sdk iphonesimulator9.2 -destination name="iPhone 6"  test
archive_project:
  stage: archive
  script:
        - xctool -workspace XXX.xcworkspace -scheme parent -configuration AppStoreDistribution archive -archivePath build/parent
        - xcodebuild -exportArchive -archivePath build/parent.xcarchive -exportOptionsPlist exportOptions.plist  -exportPath build/parent
        - fir p $PWD/build/parent/parent.ipa -T 8a7cf204f8c40f39a6ba41db8b44929d
  only:
        - master

在项目根目录下配置 .gitlab-ci.yml 文件

  • 上面的配置文件中定义了两个stages
  • 用于描述两个阶段,一般有build,test,archive,deploy等。
  • stage 可以在所有job中使用,上面的build_projectarchive_project 就是job,每个job 分别对应执行哪个stage
  • script 中就是你要执行的脚本。
  • 如果你的项目中没有使用xcworkspace,就把相应的 -workspace XXX.xcworkspace改为-xcodeproject XXX.xcodeproject
  • 配置文件中用到了xctool 工具,和xcodebuild 相似,具体安装及使用 xctool
  • archive 过程将项目export出 ipa 文件 并上传至 fir 平台。fir 工具可以上传 ipa 文价,具体使用 fir 使用
  • exportOptions.plist是放在根目录下的配置打包参数的,可以参考 xcodebuild --help
  • only - master是指只有提交master 分支才有执行 build_project job

fir 安装

gem install fir-cli   

上传至fir

fir p path/to/xxx.ipa -T #API TOKEN# 
apitoken.png

如果一切成功的话,就会有如下 passed 标志 。

result.png

小结,在测试,打包过程中可能会出现许多奇怪的错误,可以自己google或者询问我。

demo 地址

Fastlane

上述是使用xctool 打包并上传fir ,测试人员可以去fir 的网站扫码下载。这里介绍另一种方式。这里安装什么的我就不赘述了,官方都有,就将个人是怎么使用的。

整个过程还是遇到很多问题的,整个过程不断google,个人从ruby环境2.0 切换到2.3 ,最后在2.2.3 上才ok。

Fastlane 简化了测试,打包,上传testFlight 功能,其实包含了上述 xctool 的所有功能。Fastlane 每个过程都用一个lane 标示。

自动测试:

    lane :test do
    scan({
      workspace:"ParentAndSchool.xcworkspace",
      scheme:"parent",
      device:"iPhone 6s",
      clean: true
    })
    end

看一下scan 中的参数,workspace 表示项目的命名空间,如果你用cocoapods 集成是有这个文件的,如果没有使用xcworkspace ,这里参数就改为project,对应的就是 xxx.xcodeproj文件。

打包

    lane :archive do
        increment_build_number(
            xcodeproj: "./jyb_ios_parent/parent/frameworks/runtime-src/proj.ios_mac/parent.xcodeproj"
        )
        gym(
            workspace: "ParentAndSchool.xcworkspace",
            scheme: "parent",
            output_directory:"build",
            output_name: "jyb.ipa"
        )
    end

archive 这个lane 我做了两个action,分别是increment_build_numbergym

  • increment_build_number这个动作是增加build号,我们知道,上传appstorebuild号要增加,这个需要xcode中一些配置,可以看这里,如果你没配置好,fastlane 跑脚本的时候不会直接挂掉,只会有提示, 到时候上传时就会失败。
  • gym 这个action 用来打包,参数就不用多说了。

上传testFlight

    lane :testFlight do
    #for firwall
    ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"] = "-t DAV"
    pilot(
        ipa:"build/jyb.ipa",
        username: "*******@corp-ci.com",
        skip_waiting_for_build_processing: true
    )
    end

pilot是可以将包自动发布到itunes testFlight 后台的,一开始怎么也传不上去,好像是网络之类的问题,后来才发现需要加上下面这句话。(官方文档还是要好好读的)

 ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"] = "-t DAV"

具体某个action 的参数及使用,可以通过命令 fastlane action *** ,例如(fastlane action gym)查看。

另外在搭配 gitlab-ci 的过程中,发现每次archive 出来的包,到上传的时候总是说ipa文件找不到。因为gitlab 每个job之后都会还原仓库的状态,就是archive 这个job 结束后,由于ipa 文佳不属于git仓库,被删了。解决办法如下,修改.gitlab-ci.yml:

    archive_parent_project:
     stage : archive
     script :
            - fastlane match appstore 
            - fastlane archive
     only:
            - master
     cache:
        paths :
            - build/
            - build/jyb.ipa
        key: "build"
        untracked: true
   upload_testFlight:
     cache:
        paths :
            - build/
            - build/jyb.ipa
        key: "build"
        untracked: true
     stage : testFlight
     script :
            - fastlane testFlight
     only:
            - master

添加缓存文件,指定每个job结束后不删除build 布目录下的文件。
fastlane match appstore 是用match 给app 配置证书,具体使用请看 Match

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容