初创公司 CI 系统终极解决方案:Gitlab-CI

2017-11-17   /   阅读数:3254   /   分类:

前言

这是一篇拖延了七个月的文章:

Continuous Integration,持续集成,本意是指编写大量的单元测试和集成测试,在尽量小的代码变更粒度上进行 提交 -> 测试 -> 自动部署 的完整流程。现实世界特别是快糙猛的中国互联网界,显然只靠单元测试是无法保证代码质量的,因为测试很难覆盖所有业务场景特别是前端场景,而且测试只会在最重要的地方存在,因为写测试理论上讲比写业务逻辑更费时间,而且枯燥。

所以,中国互联网界的 CI 多数只有两个目的:① 跑测试保证核心模块质量顺便消灭低级错误 ② APP 打包。

CI 基本原理

持续集成基本原理实际上非常简单:

  1. 检测到 git 有新的代码提交(定时检测或主动触发),生成任务
  2. agent(真正干活的进程,可以分布在多台机器) 领取任务,拉取代码,运行一段脚本(无论是单元测试还是 APP 打包,都可以用脚本完成)
  3. 展示结果:成功与否、测试覆盖率、apk ipa 下载链接等

下面我正式开始介绍 Gitlab-CI。

Gitlab-CI

Gitlab 简介

Gitlab 是当今最火的开源 git 托管服务端。实际上 git 软件本身就可以提供 server 服务,不需要第三方软件,而 Gitlab Gogs 这类开源软件提供的是除简单代码托管之外的高级功能:

  1. 账号系统及 web 私钥管理
  2. 友好的 web 代码查看、issue、milestone、在线 code review 等
  3. git 工作流拓展:hook、CI/CD 等

Gitlab 配置简单,功能强大,开源版功能极其丰富,但是他也有一个巨大的缺点:资源消耗过高。它需要 2G 内存机器,而且在 pull 或 push 的瞬间磁盘 IO 相当高,部署在阿里云会直接导致虚拟机假死,只适合内存大,磁盘强的物理机部署。如果你可以搞定物理服务器,赶紧安装一个试试吧。

Gitlab-CI 的优势

Gitlab-CI 是 Gitlab 自带的持续集成引擎,免去了第三方 CI 服务器只能定时检测 git 仓库带来的延迟和对 git server 造成的性能压力。我司弃用 oschina 的原因就是 CI 服务器一分钟检测一次,压力太大导致仓库被封。

Gitlab-CI 的优势可以总结为以下几点:

  1. 触发成本低,系统已经提供了完善的触发功能
  2. 结果直接展示在 Gitlab 页面上的多个地方:成功/失败,测试覆盖率等
  3. 无需复杂配置。(Jenkins 的页面逻辑太落后了,极其的复杂。TeamCity 我本以为配置算简单的,直到我用上了 Gitlab-CI)

缺点

必须使用 Gitlab。

用法

本文以当前最新版本 10.1.4 举例展示 Gitlab-CI 的超简单用法。

1. 编写 .gitlab-ci.yml 放入源代码根目录

很简单,我贴一个我正在使用的 PHP 项目的配置文件:

before_script:
  - touch ./.env
  - cat /dev/null >| .env
  - |
    echo "ME=Laravel
      APP_ENV=local
      APP_KEY=ooxx
      APP_DEBUG=true
      APP_LOG_LEVEL=debug
    ">>.env

phpunit:
  script:
    - phpunit --coverage-text --colors=never

这是 yaml 语言描述的 CI 配置,很容易读懂:先 生成/清空 .env,再写入一些信息,之后运行 phpunit --coverage-text --colors=never。没了,就这么多。

2. 配置 runner

实际操作起来非常简单:找一台能跑 phpunit 命令的 Linux 机器,安装 runner yum install gitlab-runner,runner 就是 TeamCity 中的 agent,我翻译成“干活的”。然后简单配置一下,填几个参数,连接成功,搞定。

之后在与之匹配的仓库的设置界面里 enable 一下就哦了。

3. 接下来呢?

在你把 .gitlab-ci.yml 文件 push 上去的一瞬间,任务启动,开始分发,runner 开始干活。

然后,结果怎么返回?script 运行的结果会直接显示在 Gitlab 网页上,无需其他操作。甚至可以将测试覆盖率直接显示到网页上:

设置界面上提供了常用语言的配置,原理就是用正则将覆盖率那个数字从 cli script 运行结果里提取出来,展示到网页上,按照提示配置即可完成。

4. 结果展示

Gitlab 首页:

项目 CI、CD 详情页:

WRITTEN BY

avatar

评论:

shingle
2017-11-20 10:30
CI 服务器只能定时检测?主流的解决方案不是基于授权之后设置仓库的hook钩子触发吗
JohnLui
2017-11-20 10:35
@shingle:为了性能 CI 服务器一般在内网,没有公网 ip 没法搞 hook。

发表评论:

© 2011-2017 岁寒  |  Powered by Emlog