GitLab CI/CD
一、Gitlab CI/CD基本介绍
1.三大组件
-
GitLab CI/CD: 一个web应用程序,管理项目/构建
-
GitLab Runner:处理构建的应用程序,可以单独部署,并通过API与GitLab CI/CD一起使用
-
.gitlab-ci.yml
2.Gitlab CI/CD特点
-
多平台:unix,windows,macOS和任何支持Go的平台上执行构建
-
多语言:构建脚本是命令行驱动,可以与java,php,等任何语言使用
-
并行构建:在多台机器拆分构建
-
稳定构建:与GitLab在不同机器上运行
-
实时日志:
-
灵活管道:每个阶段定义多个并行作业,并且可以触发其他构建
-
版本管道:
-
Docker支持
-
Kubernetes上运行
-
容器注册表
-
受保护的变量
-
定义多个环境
3.GitLabCI/CD工作原理
-
代码托管到Git存储库。
-
项目根目录创建ci文件.gitlab-ci.yml,在文件中指定构建,测试和部署脚本。
-
GitLab将检测到它并使用Runner工具运行脚本。
-
脚本被分组为作业,共同组成一个管道。
二、GitLabRunner
1. GitLab Runner简介
简介
-
runner是一个开源项目,和gitlab是分开的,用于运行作业并将结果返回gitlab
-
可以用docker部署,要求docker>1.13
-
Runner版本应与GitLab版本同步
-
可根据需要配置任意数量Runner
特点:
-
同时执行多个作业
-
作业运行环境:
-
本地、docker、docker+ssh执行作业
-
ssh连接到服务器
-
-
支持bash,windows bash,windows powershell
-
运行自定义作业运行环境
-
自动重新加载,无需重启
-
易于安装,可作为linux,macOS和windows的服务
GitLab Runner类型与状态
-
类型
-
shared 共享类型,运行整个平台项目的作业(gitlab)
-
group 项目组类型,运行特定group下的所有项目的作业(group)
-
specific项目类型,运行指定的项目作业(project)
-
-
状态
-
locked:锁定状态,无法运行项目作业
-
paused:暂停状态,暂时不会接受新的作业
-
2. GitlabRunner安装
yum install gitlab-runner或者rpm安装
3. GitlabRunner注册
获取runner token ——> 进行注册
-
获取token:
-
shared--管理员-->管理中心-->CI/CD,新建示例runner
-
group--群组所有者-->某个项目-->CI/CD,新建群组runner
-
project--项目所有者-->项目-->CI/CD,新建项目runner
-
-
注册:
-
gitlab_runner register
-
分配url
-
分配token
-
分配执行器:shell,docker,kubernetes
-
注册相关命令
-
4. GitlabRunner执行器
支持shell,docker等
5. 运行流水线任务
流水线语法检测
6.pipeline语法
pipeline,job,script
-
job(作业):.gtilab-ci.ym文件配置gitlab CI/CD管道,在文件中可以定义一个或多个作业,每个作业有唯一名称,每个作业独立执行,作业定义了在约束条件下进行相关操作,每个作业至少包含一个script。每个流水线由多个job组成。
-
scipt:定义一个或多个脚本,每个作业至少要有一个script
-
before_script:script之前要做的,每个job都可以定义,有定义则会覆盖全局的,无定义则走全局的。若before_script失败则导致整个作业失败,其他作业不再执行。作业失败不影响after_script运行。
-
after_script:script之后要做的,每个job都可以定义,未定义则走全局的,有定义则会覆盖全局的,无定义则走全局的。
-
stages:用于控制不同stage顺序。
-
stage:标志作业执行顺序的属性,同stage的job并行运行,不同stage按stages定义的顺序运行。
-
variables:通过key: value的形式定义变量。
-
.pre:始终是整个管道第一个运行阶段。
-
.post:始终是整个管道最后一个运行阶段。用户定义的阶段在.pre和.post之间,并且顺序无法更改,如果管道仅包含.pre或.post阶段的作业,则不会创建管道。
-
tags: 从允许运行该项目的所有runner列表中选择特定的runner
-
allow_failure: 允许作业失败,默认是false。启用后如果作业失败,在用户界面橙色警告,但不影响流水线后续执行。
-
when:
-
on_success: 前面阶段所有作业都成功才执行作业,默认值。
-
on_failure: 前面阶段出现失败时才执行。
-
always:总是执行
-
manual:手动执行
-
delayed + start_in ‘xxx’:延迟xxx秒执行
-
-
retry:
-
max: 代码失败重试次数。
-
when: 重试失败的错误类型,针对某类错误才重复运行几次。
-
-
timeout: 作业级别的超时可以超过项目级别超时,但是不能超过runner的超时。runner可以通过设置最大超时时间防止runner被某个项目占用。
-
parallel: 创建N个并行的实例一同执行此文件。
-
only:定义哪些分支和标签的git项目会被job执行,支持正则表达式
<span style="background-color:#f8f8f8"><span style="color:#221199">job</span><span style="color:#555555">:</span> <span style="color:#221199">only</span><span style="color:#555555">:</span> -/^issue-.*$/ <span style="color:#221199">except</span><span style="color:#555555">:</span> <span style="color:#555555">- </span>branches</span>
-
except:定义哪些分支和标签项目不被job执行。
-
rules:
-
相当于switch,match,逐个评估直至匹配,不能与only/except组合使用
-
可用规则:
-
if :可以定义多个if,只要匹配一次就可执行
<span style="background-color:#f8f8f8"><span style="color:#221199">job</span><span style="color:#555555">:</span> <span style="color:#221199"> script</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span>echo <span style="color:#aa1111">"This job will run based on rules"</span> <span style="color:#221199"> rules</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span><span style="color:#221199">if</span><span style="color:#555555">: </span><span style="color:#aa1111">'$CI_COMMIT_BRANCH == "master"'</span> <span style="color:#555555"> - </span><span style="color:#221199">if</span><span style="color:#555555">: </span><span style="color:#aa1111">'$CI_COMMIT_TAG == "v1.0"'</span> <span style="color:#555555"> - </span><span style="color:#221199">when</span><span style="color:#555555">: </span>manual</span>
-
changes:
<span style="background-color:#f8f8f8"><span style="color:#221199">job</span><span style="color:#555555">:</span> <span style="color:#221199"> script</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span>echo <span style="color:#aa1111">"This job will run only when files under src/ directory change"</span> <span style="color:#221199"> rules</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span><span style="color:#221199">changes</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span>src/*</span>
-
exists:
<span style="background-color:#f8f8f8"><span style="color:#221199">job</span><span style="color:#555555">:</span> <span style="color:#221199"> script</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span>echo <span style="color:#aa1111">"This job will run only when a specific file exists"</span> <span style="color:#221199"> rules</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span><span style="color:#221199">exists</span><span style="color:#555555">:</span> <span style="color:#555555"> - </span>file.txt </span>
-
-
-
workflow:顶级workflow关键字适用于整个管道,用于确定是否创建管道。
7.cache-缓存
-
作用:将路径缓存起来,后续作业执行时,如果路径未变,不需要重新下载生成。
-
全局cache定义在job之外,对所有job生效。job中的cache优先于全局。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#221199">job</span><span style="color:#555555">:</span>
<span style="color:#221199"> script</span><span style="color:#555555">:</span>
<span style="color:#555555"> - </span>echo <span style="color:#aa1111">"This job will use cached dependencies"</span>
<span style="color:#221199"> cache</span><span style="color:#555555">:</span>
<span style="color:#221199"> paths</span><span style="color:#555555">:</span>
<span style="color:#555555"> - </span>node_modules/
<span style="color:#555555"> - </span>vendor/</span></span>
key:给缓存做一个标记,可以配置job、分支为key来实现,防止缓存覆盖。