GitLab-Runner,关于DevOps的新实践
Introduction
通常个人、一些小公司的需求不够复杂,要求不高的服务会直接将服务起在服务器上,但是当公司发展到一定程度,各种需要也越来越多样化,那么我们需要更专业的方法来管理代码和代码的集成、构建。
**Code Management **
我们现在采用的是GitLab通过分组和角色的权限来管理我们内部项目代码。
CI/CD
Continuous Integration is the practice of merging all the code that is being produced by developers. The merging usually takes place several times a day in a shared repository. From within the repository, or production environment, building and automated testing are carried out that ensure no integration issues and the early identification of any problems.
持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
我理解的集成是:代码合并–>依赖检查–>编译–>测试–>发布,集成的工作,以前是由人工完成的,由于业务需求复杂性,公司规模和多人合作等因素,为了加快开发效率,有很多聪明的人想到将集成这个工作自动化,将这个工作交由代码、脚本、工具链等来自动完成,这就是持续集成的由来**。**
持续集成的好处:
- 在开发人员思考之前尽早的先发现问题。
- 减少集成环节人工手动出现的问题,即使哪个环节出现问题,抛出的问题环节也更容易被发现。
- 避免繁重的集成工作,让团队更自信敏捷快速地开发。
Define
GitLab CI/CD就是一套配合GitLab使用的持续集成系统,GitLab8.0以后的版本是默认集成了GitLab CI/CD并且默认启用的。
Why
这里需要谈到我们以前使用过的Jenkins,也属于GitLab CI/CD里的工具链,但是这这次新环境的搭建中,我们舍弃了使用Jenkins,而采用GitLab-Runner。
原因有如下几点:
- GitLab CI/CD已经集成进GitLab服务器中,在使用的时候只需要安装配置GitLab-Runner即可。
- GitLab-Runner配置简单,很容易与GitLab集成。当新建一个项目的时候,不再需要配置项目的webhook回调地址,也不需要在Jenkins编写这个项目的编译配置脚本和部署脚本,只需在工程中配置"gitlab-ci.yml"文件,就可以让这个工程可以进行编译和部署。
- GitLab-Runner没有web页面,但编译/部署的过程直接就在GitLab中可以看到,不需要像Jenkins额外再进入一个web页面去控制台查看编译/部署结果。
- 集成的"gitlab-ci.yml"文件在开发阶段就可以由开发人员自己编写确立,大大降低了运维的压力和也减少了后期生产上线的额外步骤,我们一直在提倡DevOps敏捷开发,肯定是采用最便捷的开发方式,所以推荐GitLab CI/CD。
- GitLab CI/CD是开源GitLab社区版和专有GitLab企业版的一部分,具有出色的用户体验,可以在单独的节点上分布式运行,也可以根据需要添加任意数量的节点,可扩展性好。
Details
接下来详细说说"gitlab-ci.yml"搭配GitLab-Runner的详细说明。
Stages
Stages 表示构建阶段,一般是有3个stages:build, test, deploy。我们可以在一次 Pipeline 中自定义多个 Stages,例如加一个镜像推送的Stages,名字可以自己定义为push_image,这些 Stages 会有以下特点:
- 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始。
- 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功。
- 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败。
Jobs
Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
- 相同 Stage 中的 Jobs 会并行执行。
- 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功。
- 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败。
- 任务中必须得有script部分。
.gitlab-ci.yml
.gitlab-ci.yml 用来配置 CI 用你的项目中做哪些操作,这个文件位于仓库的根目录。
当有新内容push到仓库,或者有代码合并后,GitLab会查找是否有.gitlab-ci.yml文件,如果文件存在,配好的Runners将会根据该文件的内容开始build本次commit。
.gitlab-ci.yml 使用YAML语法, 你需要格外注意缩进格式,要用空格来缩进,不能用tabs来缩进。
Example
# 定义 stages,任务将按此顺序执行。
stages:
- build
- test
- deploy
# 定义 job(任务)
job_one:
stage: test
tags:
- XX #只有标签为XX的runner才会执行这个任务
only:
- dev #只有dev分支提交代码才会执行这个任务,也可以是分支名称或触发器名称
- /^dev.*$/ #正则表达式,只有dev-开头的分支才会执行
script:
- echo “the job one”
# 定义 job
job_two:
stage: test #如果此处没有定义stage,其默认跟job_one一样也会是test
only:
- master #只有master分支提交代码才会执行这个任务
script:
- echo “the job two”
allow_failure: true #允许失败,即不影响下步构建
# 定义 job
job_three:
stage: build
except:
- dev #除了dev分支,其它分支提交代码都会执行这个任务
script:
- echo “the job three”
when: always #不管前面几步成功与否,永远会执行这一步。它有几个值:on_success (默认值)\on_failure\always\manual(手动执行)
GitLab-Runner
Installation
本教程的安装环境为Ubuntu18.04。
- 运行以下命令增加GitLab官方仓库:
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash - 安装最新版本的GitLab Runner,或者选择特定的版本:
- 安装最新版本: sudo apt-get install gitlab-runner
- 选择特定的版本: sudo apt-get install gitlab-runner=10.0.0
Register
此处是将你的GitLab Runner注册到GitLab page上,让GitLab page可以和你的Runner通信。
在注册Runner之前,你首先需要:
- 安装好Runner的主机
- 从GitLab page上获得token
接着注册,运行命令:sudo gitlab-runner register
输入GitLab URL:
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com ):
https://newgitlab.com/
输入你的注册token:
Please enter the gitlab-ci token for this runner
xxx
注意:你可以通过GitLab项目页-->Settings-->CI/CD-->Runners来获得URL和token,建议按项目group来设置Runner。
输入对这个Runner的表述(同时也是这个Runner的名字):
Please enter the gitlab-ci description for this runner:
[hostame] my-runner
输入Runner的tag,稍后你同样可以在GitLab page上修改它:
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
注意 tag可以有多个,各 tag之间用逗号隔开。如果你使用了多个 tag,那么当你想用这个 Runner时,在.gitlab-ci.yml的 tag字段里也必须明确指明这些 tags。
输入Runner的executor:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker
如果你选择Docker作为Runner的executor,你还要选择默认的docker image来运行job(也可以在.gitlab-ci.yml
里指明你需要用的image):
Please enter the Docker image (eg. ruby:2.1):
golang:1.13.1:latest
注册完成后你可以在/etc/gitlab-runner里重配这个Runner的配置文件 config.toml。
Usage
直接运行Runner:sudo gitlab-runner run
将Runner作为一个服务:
- 将GitLab Runner安装为系统服务:
sudo gitlab-runner install -n "<service-name>" -u <user-name>
- 启动服务:
sudo gitlab-runner start -n "<service-name>"
直接运行Runner:sudo gitlab-runner run
将Runner作为一个服务:
- 将GitLab Runner安装为系统服务:
sudo gitlab-runner install -n "<service-name>" -u <user-name>
- 启动服务:
sudo gitlab-runner start -n "<service-name>"
参考官方文档: https://docs.gitlab.com/runner/ 和 https://docs.gitlab.com/ee/README.html