前言
GitLab-CI就是一套配合GitLab使用的持续集成系统,在GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
基本的CI工作流程
当我们push代码到远程分支时,会触发GitLab-CI:
- 执行自动化脚本,构建并检测项目
- 若检测通过,则可以进行review;若未通过,则修改后重新push,再次执行第一步
- 若review通过后,则merge代码,会再次执行自动化脚本,检测项目并进行交付
.gitlab-ci.yml
要使用GitLab-CI,首先需要在根目录下添加.gitlab-ci.yml,用来记录CI需要执行的操作。当触发CI操作时,GitLab-CI会读取.gitlab-ci.yml中的信息。
这是一个YAML文件,因此您必须格外注意缩进。始终使用空格,不要使用制表符。
下面介绍一下.gitlab-ci.yml的主要元素。
Job
Job是.gitlab-ci.yml文件的最基本元素。
job1:
script: "execute-script-for-job1" // 单个子语句
job2:
script: // 多个子语句
- bundle exec rspeca
- bundle exec rspecb
每个Job在Runner(即GitLab-Runner,下文有介绍)中彼此独立运行,多个Job形成了CI的Pipeline配置步骤。
关键字
除了script是Job的唯一必需关键字外,Job还有其他关键字:
- environment 用于定义Job部署到指定环境
- image 用于指定用于Job的Docker映像
- stage 用于定义Job的阶段,和全局关键字
stages配合使用,可以在特定环境下并行执行相同stage的Job - timeout 用于设置Job的超时时长
- rules 用于Job进行判断。其中的
if属性可以根据变量$CI_PIPELINE_SOURCE的值来进行判断 - 。。。
更多的关键字可以查询这里。
全局关键字
除了在每个Job中定义关键字,也可以定义全局关键字。
- stages 用于定义包含Job的所有阶段,其中元素的顺序决定了对应Job的执行顺序
stages:
- build
- test
ob 1:
stage: build
script: make build dependencies
job 2:
stage: build
script: make build artifacts
job 3:
stage: test
script: make test
- 也可以使用
default来定义一些默认值,针对所有Job生效。
default:
image: ruby:2.5
rspec:
script: bundle exec rspec
rspec 2.6:
image: ruby:2.6 // 覆盖了默认值ruby:2.5
script: bundle exec rspec
- 还有其他的全局关键字可以查看这里
GitLab-Runner
GitLab-Runner是配合Gitlab-CI使用的,是一个用来执行软件集成脚本的东西,可以是虚拟机,VPS,裸机,Docker容器,甚至是一组容器。
当GitLab中有代码修改时(比如push代码),GitLab会通知GitLab-CI。这时GitLab-CI会找到并通知关联的GitLab-Runner,GitLab-Runner则会把项目代码下载到本地并执行预先设计好的脚本。
GitLab-Runner有两种类型:共享型(Shared Runner)和私有型(Specific Runner)。
- Shared Runner 需要管理员安装配置,所有项目共用,但是最好在yml文件中设置不同docker 镜像(image)用以区分
- Specific Runner 可以有项目权限的人员安装配置,每个项目私有
安装GitLab-Runner
在使用GitLab-Runner前,我们需要先进行安装。GitLab-Runner有三种安装方法:使用Docker,手动下载二进制文件或使用rpm/deb软件包的存储库。
这里我们简单描述下私有型GitLab-Runner安装:
注:由于项目中使用的是Window10-64位作为测试服务器,所以这里的私有型GitLab-Runner安装,及下面的注册等内容都是基于该服务器,若使用其他环境请参考官网。
- 在系统中的某个位置创建一个文件夹,例如:
D:\GitLab-Runner。 - 下载exe文件(x86可下载这个)
- 将下载的
gitlab-runner-windows-amd64.exe文件重命名为gitlab-runner.exe,并移动到D:\GitLab-Runner中
注册GitLab-Runner
这时准备工作就已经完成了,需要开始GitLab-Runner的注册。而GitLab-Runner的注册需要先在GitLab项目-设置-CI/CD-Runner中获取gitlab-ci coordinator URL和token:
获取相关信息后,就可以在cmd中进行注册执行了:
- 打开
D:\GitLab-Runner,然后输入gitlab-runner.exe register,并回车 - 输入gitlab-ci coordinator URL,用以找到对应的Gitlab
- 输入token,用以注册Runner
- 输入Runner的描述信息
- 输入Runner的tag,以逗号分隔
- 输入Runner的执行场景,这里我选的是sell
当然,具体配置什么按照各自的项目来确定,可以参考官网。
当注册完毕后,你可以在D:\GitLab-Runner里发现config.toml文件,该文件是Runner的配置文件。
启动服务
你可以直接启动Runner服务:
./gitlab-runner.exe run
你也可以将Runner设置为系统服务:
// 使用当前用户帐户的有效密码
./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"
// 启动服务
./gitlab-runner.exe start
// 暂停服务
./gitlab-runner.exe stop
服务启动后,可以在GitLab项目-设置-CI/CD-Runner中查看到当前Runner的状态:
pipelines
当我们配置好Runner后,就可以在分支中添加.gitlab-ci.yml进行简单测试:
// .gitlab-ci.yml
build:
tags:
- test-master
script:
- npm install
- npm run build
我们将修改后的代码推送到远程gitlab,就可以在CI/CD-pipelines中看见当前CI的执行状态:
点击pipelines中的状态,就可以查看所有Job的执行状态:
点击Job,也可以查看Job的详细流程:
总结
使用Gitlab对代码进行版本管理时,可以使用Gitlab-CI进行持续集成。
在使用Gitlab-CI前,需要完成.gitlab-ci.yml和Gitlab-Runner的配置。在push、merge等操作时,触发持续集成,可以在pipelines中查看进行状态。