参考文档:

  1. GitLab Documentation:https://docs.gitlab.com/ce/
  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 镜像:https://mirrors.tuna.tsinghua.edu.cn/help/gitlab-ce/
  5. Gitlab Runner:https://docs.gitlab.com/runner/
  6. GitLab Continuous Integration:https://docs.gitlab.com/ce/ci/
  7. 基于OpenSSL自建CA和颁发SSL证书:http://seanlook.com/2015/01/18/openssl-self-sign-ca/

三.Gitlab CI流程

1. Gitlab-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

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

# 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 portal查看:登陆gitlab,进入对应project,Setting-->CI/CD-->Runner(Expand) -->Setup a specific Runner manually,即可查看,如下:

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

5. 查看执行结果

1)pipelins

通过gitlab portal查看:登陆gitlab,进入对应project,CI/CD-->Pipelines,如下:

2)job

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

Job_1

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

  1. 执行器是shell;
  2. 执行者从gitlab repository拉取代码,存放在执行者home目录下,具体路径为~/builds/RUNNER-TOEKN/X/GITLAB-USER/PROJECT-NAME/目录下;
  3. 执行者是gitlab-runner账号(涉及到执行权限问题)

Job_2

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

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

3)查看config.toml

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

Gitlab CI-2.CI流程的更多相关文章

  1. Docker最全教程之使用TeamCity来完成内部CI、CD流程(十六)

    本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...

  2. Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)

    一.说明 1.1 说明 前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-s ...

  3. 使用gitlab runner进行CI(三):使用sonarqube做c++的静态检查

    目录 1. gitlab-ci.yml的配置 1.1 几个基本概念 1.2 使用CI进行代码检查demo 2. Sonarqube安装和配置 2.1 Sonarqube安装 2.2 数据库配置 2.3 ...

  4. [ci]容器ci索引

    伙计们: 有任何意见或建议或看不懂的请在对应的文章下留言(请注明上下文) 我会及时改动. 这是以前的一些在物理机上搞过 [ci]容器ci索引 http://www.cnblogs.com/iiiihe ...

  5. Jenkins+GitLab+SonnarQube搭建CI/CD全流程

    1. CI/CD 1.1 CI - 持续集成 持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干.持续集成的目的就是让产品可以快速迭 ...

  6. GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署

    预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...

  7. 在gitlab上setup CI

    安装gitlab runner docker pull gitlab/gitlab-runner 启动gitlab runner docker run -d --name gitlab-runner ...

  8. CI加载流程小结

    无聊,决定水一把. CI(CodeIgniter)是我最早接触的一个框架,到现在也只是用了其中一点零碎的方法.一直想对其流程做个小结,却总是因各种各样的“理由”挨着.看见别人图表齐上阵,没那耐心,就从 ...

  9. 使用gitlab, jenkins搭建CI(持续集成)系统(1) -- 准备环境

    1. 环境设计 搭建一个从开发到测试知道发布上线可以自动换完成的CI系统.这个系统中包含4个环境. 开发(dev)环境: 码农使用. 测试(test)环境: 测试人员使用. 预发布(prepublis ...

  10. CodeIgniter框架——CI的执行流程

    应用程序流程图 CodeIgniter执行流程 源码分析——CI到底做了些什么 (由welcome的例子出发——讲解index.php——讲解CodeIgniter.php) (load_class的 ...

随机推荐

  1. oracle删除用户及其表空间

    oracle删除用户及其表空间 删除表空间:可以先将其offlinealter tablespace xx offline;将磁盘上的数据文件一同删除drop tablespace xxx inclu ...

  2. 怎样批量提取JPG照片的文件名

    用批处理做吧, @echo off dir /a-d /b >./list.txt 把上面两句代码用记事本保存为“list.bat”(不要引号) 然后把这个文件放到你要提取文件名的文件夹里,就是 ...

  3. Hive学习之路 (十三)Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    数据准备 数据格式 cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, cookie1,, 创建数据库及表 create datab ...

  4. pm2踩过的坑

    pm2实现一键部署,能将github上的代码拉到服务器,但是死活就是起不了服务. pm2部署命令: pm2 deploy ecosystem.json production setup pm2 dep ...

  5. 将本地项目托管到github 并预览

    本地文件上传到github的步骤 1.先在github上建立一个仓库 2.将此仓库download 3.在此文件夹中git bash here 4.进行如下git操作 git git init git ...

  6. ZOJ 2017 Quoit Design 经典分治!!! 最近点对问题

    Quoit Design Time Limit: 5 Seconds      Memory Limit: 32768 KB Have you ever played quoit in a playg ...

  7. 拥抱.NET Core系列:MemoryCache 初识 (转载)

    阅读目录 MSCache能做什么? 从IMemoryCache说起 开发者的体验 写在最后 Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set.Add.Get.Remove. ...

  8. Tarjan算法初探 (1):Tarjan如何求有向图的强连通分量

    在此大概讲一下初学Tarjan算法的领悟( QwQ) Tarjan算法 是图论的非常经典的算法 可以用来寻找有向图中的强连通分量 与此同时也可以通过寻找图中的强连通分量来进行缩点 首先给出强连通分量的 ...

  9. Quartz.NET+Topshelf 创建Windows服务

    由于项目开发中经常会有定时任务执行的需求,所以会第一时间就想到 windows 服务 的方式,但是做过开发的同学都知道windows服务不利于调试,安装也麻烦: 并且有开源的作业框架Quartz.NE ...

  10. matlab 基于 libsvm工具箱的svm分类遇到的问题与解决

    最近在做基于无线感知的身份识别这个工作,在后期数据处理阶段,需要使用二分类的方法进行训练模型.本身使用matlab做,所以看了一下网上很多都是使用libsvm这个工具箱,就去下载了,既然用到了想着就把 ...