基于gitlab-ci的CICD

简介

gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成。中心思想是当每一次push到gitlab的时候,都会触发一次脚本执行,然后脚本的内容包括了测试,编译,部署等一系列自定义的内容。

目前成都创新互联公司已为上1000家的企业提供了网站建设、域名、网站空间、网站托管、服务器租用、企业网站设计、如皋网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

自动部署涉及了若干个角色,主要介绍如下

GitLab-CI
这个是一套配合GitLab使用的持续集成系统,是GitLab自带的,也就是你装GitLab的那台服务器上就带有的。.gitlab-ci.yml的脚本解析就由它来负责。

GitLab-Runner
这个是脚本执行的承载者,.gitlab-ci.yml的script部分的运行就是由runner来负责的。GitLab-CI浏览过项目里的.gitlab-ci.yml文件之后,根据里面的规则,分配到各个Runner来运行相应的脚本script。这些脚本有的是测试项目用的,有的是部署用的。

.gitlab-ci.yml
这个是在git项目的根目录下的一个文件,记录了一系列的阶段和执行规则。GitLab-CI在push后会解析它,根据里面的内容调用runner来运行。

Pipeline
一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。

Stages
Stages 表示构建阶段,说白了就是上面提到的流程。我们可以在一次 Pipeline 中定义多个 Stages,这些 Stages 会有以下特点:

所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始

只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功

如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败

Jobs
Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
相同 Stage 中的 Jobs 会并行执行
相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败

发布流程图如下:

基于gitlab-ci的CICD

安装部署

添加gitlab官方库

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

安装最新版本的gitlab-runner

yum -y install gitlab-runner

启动服务

gitlab-runner list 查看各个 Runner 的状态
gitlab-runner stop 停止服务
gitlab-runner start 启动服务
gitlab-runner restart 重启服务

注册

注册之前需要先获取到注册令牌

  1. specific令牌位置为: gitlab 项目 -> 设置 -> CI / CD -> Runners 设置

基于gitlab-ci的CICD

share runner令牌位置为:Admin Area -> Runners设置

基于gitlab-ci的CICD

开始注册

gitlab-runner  register

[root@localhost ~]# gitlab-runner register

Runtime platform                                    arch=amd64 os=linux pid=1784 revision=577f813d version=12.5.0

Running in system-mode.

##输入你的Gitlab URL

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

http://192.168.60.133/

##输入注册令牌来注册Runner

Please enter the gitlab-ci token for this runner:

SeyTs9_4mKEsYjmfPr4e

##输入Runner说明

Please enter the gitlab-ci description for this runner:

[localhost]: test

##输入Runner的tags

Please enter the gitlab-ci tags for this runner (comma separated):

test

Registering runner... succeeded                     runner=SeyTs9_4

##输入Runner的执行方式

Please enter the executor: parallels, ssh, virtualbox, docker+machine, custom, docker, docker-ssh, shell, docker-ssh+machine, kubernetes:

shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

配置文件保存在/etc/gitlab-runner/config.toml

配置项类似下面,可能需要手动添加builds_dir和cache_dir这两个变量,再重启服务

[[runners]]

name = "216XX"

url = "https://git.XX.com/"

token = "xxxxxx"

executor = "shell"

builds_dir = "/home/gitlab-runner/builds"

cache_dir = "/home/gitlab-runner/cache"

[runners.cache]

如果要同时处理多个 build 的话,需要进 /etc/gitlab-runner/config.toml 文件配置 concurrent 它的值为 >1 的值

注销runner:

gitlab-runner  unregister --url https://asdf.com/ci --token 43f334f34f34f34f4

或者

gitlab-runner  unregister --name NAME     删除特定的Runner

下面我们去需要发布的项目里面的根目录编写.gitlab-ci.yml脚本进行自动发布

.gitlab.-ci.yml文件必须在项目的根目录进行创建:

stages:
- build
- test
- deploy

#打包阶段

  build-job:
  stage: build
  tags:
  - report
  script:
  - mvn clean package -Dmaven.test.skip=true -Pprod
  only:
  - master

#测试阶段

test-job:
  stage: test
  tags:
  - report
  script:
  - docker run -d -v $(pwd)/target:/opt/tomcat-8.5/webapps -p 8099:8080 --name=xxxx  public/tomcat-8.5
  only:
  - master

#手动部署阶段

deploy-job:
  stage: deploy
  tags:
  - report
  only:
  - master
  environment:
  name: $report_v
  url: $report_url
  script:
  - echo $(whoami)
  - ssh -p 222 $report_host "/test/apache-tomcat/bin/shutdown.sh"
  - ssh -p 222 $report_host "rm -rf /test/tomcat/webapps/*"
  - scp -P 222 target/report.war $report_host:/test/tomcat/webapps
  - ssh -p 222 $report_host "/test/tomcat/bin/startup.sh"
  when: manual

配置.gitlab-ci.yml文件中用到的变量信息:CI / CD Settings/Variables,也可以直接在.gitlab.-ci.yml文件中指定,这里是为了安全考虑配置在了外面。

基于gitlab-ci的CICD

在项目的根目录写好.gitlab.-ci.yml脚本后就会自动触发构建部署

基于gitlab-ci的CICD

我们在jobs里面可以看到执行的状态,是否执行成功或者报错。

手动执行部署

需要在手动执行的阶段添加参数

when: manual

这里可以看到build_job阶段任务已经执行成功,test_job阶段任务等待手动执行部署。

基于gitlab-ci的CICD

点击test_job状态可以查看到执行过程;如果有报错,这里也可以显示报错信息。

基于gitlab-ci的CICD

接下来我们手动执行部署test_job阶段任务。

基于gitlab-ci的CICD

执行后刷新下,就可以看到已经执行成功了。

基于gitlab-ci的CICD

上面我们在.gitlab-ci.yml中配置了回滚和手动执行部署任务;接下来我们看看回滚。

回滚

在deploy的任务时,添加参数如下:

environment:
  name: lims3_v


我们可以看到这里有我们自定义的版本,点进去可以看到之前的历史记录。

基于gitlab-ci的CICD
点击后面的回滚按钮即可进行回滚。

基于gitlab-ci的CICD

Q&A:

报错如下:

图1:

基于gitlab-ci的CICD

原因是git版本太低,升级git版本到2.12之后版本即可。

图2:

基于gitlab-ci的CICD

解决方法:

缺少git组件导致,可以重新编译安装git

图3:

基于gitlab-ci的CICD

是用户权限问题:

解决方法:chown -R gitlab-runner:gitlab-runner  /home/gitlab-runner


新闻名称:基于gitlab-ci的CICD
链接分享:http://hbruida.cn/article/gddoig.html