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

2017-11-17   /   字数:2307   /   阅读数:40248   /   分类: Web     

前言

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

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

评论:

111
2019-11-06 17:16
你好,麻烦问下,windows下用什么来测试代码覆盖率?
Kinwaa
2018-07-07 00:02
你好,我在用gitlab ci的时候,想实现一个功能:我的项目是基于maven,而且工程下面有多个module,其中有几个是webapp(会依赖其它的java模块),我想问的是有没有办法每次push(或者merge)触发ci做处理的时候,会判断webapp(包括其一来的模块)有修改才最终执行deploy操作?我不太想每次push的时候都要部署全部webapp。
DeepKolos
2018-08-03 14:25
@Kinwaa:把一些逻辑写到脚本里面, 然后CI调用脚本去处理
zhongjiajie
2018-01-26 16:24
你好,如果gitlab的机器纯内网,没有办法访问互联网,可以使用gitlab-ci么
JohnLui
2018-01-26 16:40
@zhongjiajie:可以试试,他是个独立软件。
White
2023-02-22 15:50
@zhongjiajie:可以的,gitlab server 可以放在公网,内网的 gitlab-ci runner 可以主动去 server 侧拉取任务
suldom
2024-03-05 20:37
@zhongjiajie:同样公司gitlab在内网,编译器用的vs,下载了一个gitlab-runner-windows-amd64.exe register的时候,始终报失败 TLS handshake timeout,网上google也没找到合适的解决方案,这块一直没弄过,不知道能否指点一二
JohnLui
2024-03-06 09:26
@suldom:说明这台 runner 机器无法访问 gitlab
shingle
2017-11-20 10:30
CI 服务器只能定时检测?主流的解决方案不是基于授权之后设置仓库的hook钩子触发吗
JohnLui
2017-11-20 10:35
@shingle:为了性能 CI 服务器一般在内网,没有公网 ip 没法搞 hook。

发表评论:

© 2011-2024 岁寒  |  Powered by Emlog