GitLab + Jenkins 搭建 CI

基本概念

一般把云计算分成三种: IaaS(Infrastructure as a Service), PaaS(Platform as a service) 还有 SaaS(Software as a Service)。
IaaS: 最典型的是 AWS(Amazon Web Service) 还有国内的阿里云。公司在大规模地使用 AWS,我自己也开了两个 AWS 的 EC2(弹性计算云,虚机)。这种云的特点是弹性计算、丰富的API(AWS更是做到了 full features,国外的 scalar 用 AWS 的 API 构建了基于 Farm, Role等概念的抽象管理)。它们通常也会提供一些 PaaS 服务,比如 AWS 提供的 关系型数据库服务 RDS,还有存储、cdn等等。 leader 说,公有云是未来,然也。
PaaS: IaaS 比较像 VPS,用户面对的是 OS,登录进去可以随便搞,灵活。PaaS 就比较专业了,针对不同功能的资源需求,定向提供服务,比如上面提到的数据库啊、存储啊。国内的 PaaS 还有 Bae, Sae, Jae(京东) 等。它们的主服务是提供 App 的运行环境,它给你一些限制条件,你的代码符合条件就可以上传,然后就可以在上面运行。它们也会提供类似上面说的PaaS,比如数据库。 据说 Sae 上入驻的主要是微博中的小游戏之类的应用。
SaaS: 这个就更专业、粒度更小了,网上举例都用邮箱来说,我也不是很了解。
IaaS 由于面对的主要是 OS,很容易与 VPS(如 Digital Ocean) 混淆。其实只要没啥需求变动,他们用起来确实差不多,都是计算资源。不同的是,IaaS 的弹性计算可以按使用量收费、可以动态地、方便地 scale 各种计算资源(CPU, NetWork, Ram…),并且提供丰富的 API 让用户更自由地操作自己的计算资源。
这两年 docker 热,又催生了另外一种云 CaaS(Container as a Service)。很多时候我们并不需要一个完整的 OS,而是需要一个运行环境,比如一个网站只需要服务器、数据库之类的环境能跑起来就行了。此外,镜像能够方便地保证运行环境的可定制、可复制、可分发,用到 CI/CD(持续集成 持续交付)很有益处。

CI

很多公司都在实践用 docker 做持续集成,我的一个任务就是先 Setup 这样一个环境。在此之前,我先把传统的 CI 学习和搭建一遍。
CI 是敏捷开发的必备,简单说就是有这样一套工具,使得开发人员做好开发和单元测试再 push 代码后就不用管了,这套工具能自动地 check 代码的变化,自动 build, 自动做集成测试和场景测试等,自动部署到生产环境,当然,某一个环节出了问题要反馈给开发人员。这套工具大大地解脱了开发人员的工作,让他们专注开发和迭代。
这里面主要涉及三类工具:代码管理工具(SCM),build 工具,管理整套工具的一个server工具。我使用的工具及CI流程是:
用 git 提交代码到 gitlab,Jenkins 检测到 代码有变化,则进行build,对于java可以用maven,c 可以用 make,这些都可以用 Jenkins 提供的 shell 服务来做。
git 和 gitlab 就不用说了。Jenkins 自动检测代码变化,之前我是不知道怎么做的。其实就是在Jenkins中设置好 Task 对应的 git repo 地址,并通过 ssh key 赋予它对 git repo 的访问权限,然后就可以设置 poll 日程来周期性地检测 repo 中代码的变动了。对了,记得 Jenkins 中安装 git client plugin. 还有一种我认为比较牛掰的方式,也是真正的CI所倡导的方式:每次push代码后就能自动build。它是怎么做到的呢?Webhooks。 Github 和 Gitlab 都提供了 Webhooks 功能,在repo 对应的 webhooks 中填上 Jenkins 的一个地址就ok了。这样每次 push 代码,github 或 gitlab 就会发送消息到 Jenkins,后者就会检测代码变动并build。具体的过程可以参考 《利用Jenkins+Gitlab搭建持续集成(CI)环境》. 我做一些补充:

  • Jenkins 默认是创建了一个 jenkins用户,在这个用户下跑服务,如果想在 root 下跑(更方便控制),在安装的时候就要注意了。我用的默认的方式,在 jenkins 用户下创建 ssh key 不好使,jenkins 没有权限访问我的 repo。几经周折找到了解决办法:生成 ssh key 的时候,passphrase 留空。什么原因不知道,stackoverflow 上还有其他人也是这么解决的。

  • 很多讲 git + jenkins 做 CI 的都没有讲到 gitlab 中的 webhook 究竟怎么填。后来终于找到:http://jenkins-url/gitlab/build_now。对了,不要忘了 jenkins中安装 gitlab 插件。

  • Jenkins 用线程池处理所有程序员抛过来的task,随着任务增多,一方面CPU紧张,一方面硬盘也会越来越挤(产生大量的build文件)。如果一个节点不够,可以再配几个 slave。像 Hadoop 一样,节点通过 ssh 通信,不过slave可以不必安装 Jenkins了,但 java 和build环境要搭。

  • 至于 build,以 c 为例,repo的代码中有 makefile之类的文件,Jenkins master 或 slave 一般也自带的 make 工具。那么在 Jenkins 的 task 对应的配置中,在 build 那儿写几个 shell 命令就可以了。其他语言也类似。也就是说,build工具是在 Jenkins master 或 slave 中搭建好的,Jenkins 用脚本来调 build 工具去 build。

你可能感兴趣的:(GitLab + Jenkins 搭建 CI)