欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Gitlab CI-2.CI流程

程序员文章站 2022-03-03 22:46:31
参考文档: 基于OpenSSL自建CA和颁发SSL证书:http://seanlook.com/2015/01/18/openssl-self-sign-ca/ 三.Gitlab CI流程 1. Gitlab-CI流程 返回结果。 2. 相关概念 1)pipeline 合并分支或代码提交即触发一次p ......

参考文档:

  1. gitlab documentation:
  2. installation and configuration using omnibus package:https://docs.gitlab.com/omnibus/readme.html#installation-and-configuration-using-omnibus-package
  3. configuration of your jobs with .gitlab-ci.yml:https://docs.gitlab.com/ce/ci/yaml/readme.html
  4. gitlab community edition 镜像:
  5. gitlab runner:
  6. gitlab continuous integration:
  7. 基于openssl自建ca和颁发ssl证书:

三.gitlab ci流程

1. gitlab-ci流程

Gitlab CI-2.CI流程

  1. 在项目repository根目录下设置".gitlab-ci.yml"文件,定义pipeline中的stage,job等具体行为(what to do);
  2. 设置runner服务器(开发或生产环境),并将runner注册到对应的project(where to do);
  3. commit或push时,gitlab触发ci pipeline(trigger,主动检测".gitlab-ci.yml");
  4. runner从gitlab pull代码,按".gitlab-ci.yml"定义执行脚本;
  5. 返回结果。

2. 相关概念

1)pipeline

合并分支或代码提交即触发一次pipeline,一次pipeline即一次构建任务。

2)stage

stage即上述构建任务中的各个构建阶段,如test,build,deploy等;一个pipeline可以定义多个stage。

stage特点:

  1. 所有的stage按顺序运行,前一个stage完成后,下一个stage才会开始执行;
  2. 只有当所有的stage都完成后,该构建任务(pipeline)才会成功;
  3. 如果一个stage失败,那么下一个stage不会执行,该构建任务(pipeline)失败。

3)job

job是每个stage构建阶段里具体执行的工作,stage与job是一对多的关系(同pipeline与stage),即一个stage里可以定义多个job。

job特点:

  1. 同一个stage中的jobs并行执行;
  2. 同一个stage中的jobs都执行成功时,该stage才会成功;
  3. 如果任何一个job失败,那么该stage失败,即该构建任务 (pipeline) 失败。

4)gitlab runner

gitlab runner是pipeline/job的具体执行者。

四.gitlab-ci流程验证

1. 安装gitlab-ce

1)安装runner-repo

# gitlab-runner,使用国内镜像源;
# 另外gitlab-runner 10之前,可执行文件名称为gitlab-ci-multi-runner
[root@gitlab-runner ~]# vim /etc/yum.repos.d/gitlab-runner.repo
[gitlab-runner]
name=gitlab-runner
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-runner/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key

2)安装gitlab-runner

# 安装gitlab-runner时会创建gitlab-runner账号,后续不少操作主体即gitlab-runner账号,需要注意权限问题
[root@gitlab-runner ~]# yum makecache
[root@gitlab-runner ~]# yum install gitlab-runner -y

2. gitlab-runner注册

1)注册gitlab-runner

# gitlab-runner分shared runner,specific runner,group runner等,这里注册为specific runner;
# --tls-ca-file:由于采用了自签名的ca证书,gitlab-runner注册时,需要使用ca根证书验证gitlab服务,注意提前创建/etc/gitlab-runner/certs/目录,并上传ca根证书;
# -n:gitlab-runner注册时,可采用--interactive或--non-interactive方式,-n即--non-interactive方式;
# --url:注册地址获取方式,登陆gitlab,进入对应project,setting-->ci/cd-->runner(expand) -->setup a specific runner manually,即可查看;
# --registration-token:每个project有唯一的token,获取方式同上;
# --name:runner名称,非必须项,建议区分;
# --tag-list:注册的runner对某分支(branch)有效,多分支时用”,”区分,非必须项,建议区分;
# --executor:在不同场景下构建(build)的执行器,常用的有shell与docker等;
# --locked:锁定runner只能被当前project所用,默认即true;
# --run-untagged:在--tag-list为空时,默认值为true;在--tag-list不为空时,默认值为false;
# runner注册成功后即运行
[root@gitlab-runner ~]# gitlab-runner register --tls-ca-file /etc/gitlab-runner/certs/ca.crt -n \
 --url https://gitlab.netonline.com/ \
 --registration-token xjbn7pkksaymspe-phqk \
 --name gitlabrunner \
 --tag-list master \
 --executor shell \
 --locked true \
 --run-untagged false

Gitlab CI-2.CI流程

2)查看gitlab-runner

# 注册成功后,在runner服务器上生成config.toml文件,记录注册信息;
# 如果gitlab-runner以root身份执行,生成/etc/gitlab-runner/config.toml;
# 如果gitlab-runner以non-root身份执行,生成~/.gitlab-runner/config.toml;
# 通过命令”ps aux | grep gitlab-runner”即可查看执行身份,config文件以及runner用户
[root@gitlab-runner ~]# ps aux | grep gitlab-runner

Gitlab CI-2.CI流程

# concurrent:全局参数,可运行job的限制,”0”表示不限制;此值是自动生成,如果在1台服务器注册多个runner,值也会自动更新;
# check_interval:全局参数,在多runner的情况,每runner向gitlab发起请求的间隔时间,默认值3s,如果设置为”0”或更低,使用默认值;
# [[runner]]:runner相关的设置在特定section中
[root@gitlab-runner ~]# cat /etc/gitlab-runner/config.toml

Gitlab CI-2.CI流程

通过gitlab portal查看:登陆gitlab,进入对应project,setting-->ci/cd-->runner(expand) -->setup a specific runner manually,即可查看,如下:

Gitlab CI-2.CI流程

3. 配置.gitlab-ci.yml

# 以一个简单的shell脚本执行为例,在.gitlab-ci.yml中定义执行脚本,需要注意yaml文件的格式;
# .gitlab-ci.yml位于repository的根目录
[root@gitlab-runner ~]# cd ~/gitlab/
[root@gitlab-runner gitlab]# vim .gitlab-ci.yml
# stage:定义pipeline的执行顺序,阶段名也可自定义,但不能与默认的”test”,“build”,“deploy”等冲突;
# stage为可选项,如果job无执行顺序要求即可取消
stages:
  - test
  - build

# job名可自定义;
# 如果定义了stage,job中可声明stage的阶段;
# tag:声明触发的分支,如果不指定,默认无法触发ci流程;但可开启已注册runner的”run untagged jobs”参数使无tag的job可触发流程;
# script:定义具体的任务,这里需要注意执行任务的主体的权限;
# 如在某阶段多分支执行相同的job,但在其他阶段需要根据分支不同执行不同的job时,可采用only字段区分分支;
# 更多关键字段可查看:https://docs.gitlab.com/ce/ci/yaml/readme.html
job_1:
  stage: test
  tags:
    - master
  script:
    - whoami
    - pwd

job_2:
  stage: build
  tags:
    - master
  script:
    - touch ci.txt

4. 触发ci流程

# 提交.gitlab-ci.yml到gitlab对应repository;
# 第一次push时,带上-u参数,如:git push -u orogin master;
[root@gitlab-runner gitlab]# git add .
[root@gitlab-runner gitlab]# git commit -m "commit .gitlab-ci.yml"
[root@gitlab-runner gitlab]# git push -u origin master

Gitlab CI-2.CI流程

5. 查看执行结果

1)pipelins

通过gitlab portal查看:登陆gitlab,进入对应project,ci/cd-->pipelines,如下:

Gitlab CI-2.CI流程

2)job

点击pipelie的status,这里即"passed"(也有"failed","pending"等状态),进入具体pipeline详情页面(或:登陆gitlab,进入对应project,ci/cd-->jobs,即可查看),点击对应的job,即可查看job的执行返回结果,如下:

Gitlab CI-2.CI流程

job_1

从job的返回结果得到以下信息:

  1. 执行器是shell;
  2. 执行者从gitlab repository拉取代码,存放在执行者home目录下,具体路径为~/builds/runner-toekn/x/gitlab-user/project-name/目录下;
  3. 执行者是gitlab-runner账号(涉及到执行权限问题)

Gitlab CI-2.CI流程

job_2

Gitlab CI-2.CI流程

6. docker executor

以下为设置docker executor的简单介绍,ci流程不再演示。

1)以container的形式运行gitlab-runner

采用docker executor的模式不是一定需要在gitlab-runner container中注册,也可在宿主机中注册,这里只是演示另一种启动gitlab-runner服务的可能性。

# 因验证用的gitlab域名无法被dns解析,将本地/etc/hosts文件映射到容器内;
# 映射自签名的ca根证书,注册时需要;
# 将注册生成的config.toml文件映射到宿主机,便于修改参数;
# 将docker daemon的sock映射到容器中,container可以利用宿主机docker来创建container
[root@gitlab-runner ~]# docker run -d --name gitlabrunner \
 --restart=always \
 -v /etc/hosts:/etc/hosts \
 -v /etc/gitlab-runner/certs/ca.crt:/etc/gitlab-runner/certs/ca.crt \
 -v /srv/gitlab-runner/gitlabrunner/config:/etc/gitlab-runner \
 -v /var/run/docker.sock:/var/run/docker.sock \
 gitlab/gitlab-runner:latest

# 查看
[root@gitlab-runner ~]# docker ps

Gitlab CI-2.CI流程

2)注册docker executor

# 虽然executor container是由gitlab-runner container创建的,但其与运行gitlab-runner服务的container是同等关系而非从属关系;
# 使用container做executor,使得每一个pipeline的虚拟构建环境都干净、轻量,相互隔离,互不影响;
# executor设置为docker时,定义executor的镜像为:docker:stable,为官方推荐,此镜像集成了docker客户端;
# 如果job是构建镜像,则executor必须使用具备docker客户端的镜像;
# docker socket binding模式:通过参数”--docker-volumes /var/run/docker.sock:/var/run/docker.sock”实现,将docker daemon的sock映射到容器中,container可以利用宿主机docker来创建container,
# 如果是在宿主机中注册,也可以使用”--docker-privileged”(docker-in-docker executor模式,如果需要编译构建镜像,需要在.gitlab-ci.yml中使用docker:dind services,并通过变量指定docker daemon的tcp端口)代替docker socket binding模式;
# 两种模式在config.toml文件中均有体现,个人建议docker socket binding模式
[root@gitlab-runner ~]# docker exec -it gitlabrunner \
 gitlab-runner register --tls-ca-file /etc/gitlab-runner/certs/ca.crt -n \
 --url https://gitlab.netonline.com/ \
 --tag-list "dev" \
 --registration-token xjbn7pkksaymspe-phqk \
 --name gitlabrunnerdev \
 --executor docker \
 --docker-image docker:stable \
 --docker-volumes /etc/hosts:/etc/hosts \
 --docker-volumes /var/run/docker.sock:/var/run/docker.sock

Gitlab CI-2.CI流程

3)查看config.toml

[root@gitlab-runner ~]# cat /srv/gitlab-runner/gitlabrunner/config/config.toml

Gitlab CI-2.CI流程