iOS持续集成之GitLab CI

之前搞iOS自动化回归接触了jenkins,但是被jenkins上一大堆的配置项搞得很烦。最近浏览相关信息,发现GitLab自己出了一套CI,了解了一下发现虽然功能比较简单,但已经够用了。下面我们一步一步来配置GitLab CI。

为什么要用CI?

Continuous integration(CI,中文:持续集成)是软件开发过程中,频繁地(一天多次)将代码集成到主干。可以让产品快速的迭代,同时也能够快速的发现问题。
而GitLab能够很好的支持CI,当我们配置好CI后,我们每次的提交都会触发CI的脚本,然后能够在GitLab上看到脚本执行后的结果。

本文中使用的环境

  • GitLab 8.3
  • Mac OS X El Capitan
  • Xcode 7.3 已安装command-line tools
  • iOS 9.3
    还有就是已经假设你已经在GitLab上创建了一个Xcode项目。

配置Xcode

Xcode唯一需要配置的就是要将你运行的scheme设置成Shared。
1. 打开Xcode项目
2. 选择Product > Scheme > Manage Schemes
3. 将对应的scheme勾选上Shared

安装配置GitLab Runner

参考官方文档

//下载runner到本地,如果https不行可以改成http试一试
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 

//修改runner的权限
sudo chmod +x /usr/local/bin/gitlab-ci-multi-runner  

`</pre>
这样就完成了runner的安装,下面就要为工程注册一个runner。首先我们需要知道GitLab的CI地址和项目的token。打开GitLab,进入对应的项目选择`Settings-&gt;Runners`,如下图所示,我们可以看到Specific runners的提示。
![](http://7xrr18.com1.z0.glb.clouddn.com/2016-04-21-14612422419143.jpg)

知道这两个值之后就可以注册runner了
<pre>`//运行gitlab-ci-multi-runner register命令
$ 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:
&lt;CI runner token from Project &gt; Settings &gt; Runner&gt;

//描述,这个随意了,一般用默认的就好
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! 

`</pre>
这时候刷新GitLab的Runner页面,就会看到刚刚创建好的runner了。
![](http://7xrr18.com1.z0.glb.clouddn.com/2016-04-21-14612423022196.jpg)

本地的话也可以用`gitlab-ci-multi-runner verify`来确认runner的状态
<pre>`$ gitlab-ci-multi-runner verify
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...                   

Veryfing runner... is alive                         runner=724a60b5
`</pre>
都确认好之后就可以启动runner了:
<pre>`cd ~
gitlab-ci-multi-runner install
gitlab-ci-multi-runner start

`</pre>

## 编写配置文件

环境都准备好了,接下来就可以开始进行配置文件的编写了。下面是一个简单的配置文件:
<pre>`stages:
  - build

build_job:
  stage: build
  script:
    - export LC_CTYPE=en_US.UTF-8
    - xcodebuild clean -workspace ProjectName.xcworkspace -scheme SchemeName | xcpretty
    - pod install
    - xcodebuild test -workspace ProjectName.xcworkspace -scheme SchemeName -destination 'platform=iOS Simulator,name=iPhone 6s,OS=9.3' | xcpretty -s
  tags:
    - test_machine
`</pre>
下面简单说一下配置文件的组成:
  • stages用于描述构建的阶段,一般有build,test,deploy等,stages可以在所有的job中使用。
  • build_job,job名字这个可以随意,后面会跟stage用于声明执行哪个stage,然后script用于具体描述执行的内容。tags用于指定执行的runner,这个就是填之前注册时写的tag。
    官方提供了一个检验配置的语法是否有问题的校验工具,在编写之后可以在这里验证一下

    还有就是把ProjectNameSchemeName替换成你自己的,因为我用的是workspace所以是-workspace WorkspaceName.xcworkspace,如果你用的是project,那么就需要相应的替换成-project ProjectName.xcodeproj

    修改好之后将文件命名为.gitlab-ci.yml保存在项目git目录的根目录下,注意这里是根目录。然后在提交到git上之前,强烈建议将执行的命令在本地执行一遍,确认没有问题之后再提交。

    当然这是非常简单的配置了,还有更复杂的配置情况,可以阅读官方文档来了解。

    触发CI

    剩下的就简单了,只需要有git提交到GitLab上就会触发我们之前配置的构建。构建运行之后可以到GitLab的Builds中查看。

    而且这样我们每次提交之后都会看到提交之后构建的结果,这样如果有问题的话就能够很快速的发现并解决。

    好了,到这里我们就已经全部配置完成了。可以继续开心的去搬砖了。。。

    more

  • 如果想要关闭本地的runner的话,可以这样:

    `$ gitlab-ci-multi-runner stop
    $ gitlab-ci-multi-runner status
    gitlab-runner: Service is not running.

    //再次开启的话也很简单
    $ gitlab-ci-multi-runner start
    $ gitlab-ci-multi-runner status
    gitlab-runner: Service is running!

  • 安装xcpretty,可以看到例子的脚本命令里面有一个xcpretty,这个东东是用于简化xcodebuild的输出。它的说明非常喜欢:It does one thing, and it should do it well. 建议大家可以都装一下,项目安装说明是在这里