iOS 持续集成之 Gitlab-Ci + FastLane

Gitlab-Ci

配置Xcode

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

  • 打开Xcode项目
  • 选择Product > Scheme > Manage Schemes
  • 将对应的scheme勾选上Shared
iOS 持续集成之 Gitlab-Ci + FastLane_第1张图片
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

iOS 持续集成之 Gitlab-Ci + FastLane_第2张图片
clickRunner.png

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


iOS 持续集成之 Gitlab-Ci + FastLane_第3张图片
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# 
iOS 持续集成之 Gitlab-Ci + FastLane_第4张图片
apitoken.png

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

iOS 持续集成之 Gitlab-Ci + FastLane_第5张图片
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

你可能感兴趣的:(iOS 持续集成之 Gitlab-Ci + FastLane)