GitLab CI 打造一条自己的流水线

GitLab CI 打造一条自己的流水线

前言

最近接手的业务需求由于历史原因,项目部署在阿里云服务器上,所以没有使用公司内部的流水线进行集成和部署。其中流水线使用到了GitLab自带的CI工具进行集成,所以正好借此机会给大家分享一下GitLab CI/CD,教大家如何打造一条项目的流水线。

CI/CD的背景

正式介绍之前我们先简单过一下CI/CD的背景

CI/CD是什么

redhat.com/zh/topics/de

CI (Continuous Integration)

即持续集成,它是指频繁地(一天多次)将代码集成到主干,目的就为了让产品保证质量的同时快速迭代;通常它需要通过自动化测试,从而保证集成的代码的稳定性;

CD (Continuous Delivery/Deployment)

即持续交付/部署,可以看作持续集成的下一步,它指的是频繁地将软件的新版本,交付给质量团队or用户测试。如果测试通过,代码就可以部署到生产环境中。

为什么需要CI/CD?

过去,一个团队的开发人员可能会孤立地工作很长一段时间,只有在他们的工作完成后,才会将他们的更改合并到主分支中。这使得合并代码更改变得困难而耗时,而且还会导致错误积累很长时间而得不到纠正。这些因素导致更加难以迅速向客户交付更新。

而有了 CI/CD,我们可以获得以下收益:

  1. 解放了重复性劳动。 自动化部署工作可以解放集成、测试、部署等重复性劳动,而机器集成的频率明显比手工高很多。
  2. 更快地修复问题。 持续集成更早的获取变更,更早的进入测试,更早的发现问题,解决问题的成本显著下降。
  3. 更快的交付成果。 更早发现错误减少解决错误所需的工作量。集成服务器在构建环节发现错误可以及时通知开发人员修复。集成服务器在部署环节发现错误可以回退到上一版本,服务器始终有一个可用的版本。
  4. 减少手工的错误。 在重复性动作上,人容易犯错,而机器犯错的几率几乎为零。
  5. 减少了等待时间。 缩短了从开发、集成、测试、部署各个环节的时间,从而也就缩短了中间可以出现的等待时机。持续集成,意味着开发、集成、测试、部署也得以持续。
  6. 更高的产品质量。 集成服务器往往提供代码质量检测等功能,对不规范或有错误的地方会进行标致,也可以设置邮件和短信等进行警告。

GitLab CI/CD

GitLab-CI 是GitLab提供的CI工具。它可以通过指定通过如push/merge代码、打tag等行为触发CI流程;同时也可以指定不同场景要触发的不同的构建脚本(脚本可以看作是流水线中的一个操作步骤or单个任务)

具体的使用方式是在项目根目录中配置一个 .gitlab-ci.yml 文件来启动其功能;我们先了解一下这个 .gitlab-ci.yml 文件

配置文件介绍

.gitlab-ci.yml 用的是 YAML语法[1] ,我们可以把它理解类似 json 的格式,只不过语法方面有一些不同。比如:
tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang

对应到json:
{
tabitha : {
name : Tabitha Bitumen ,
job : Developer ,
skills : [ lisp , fortran , erlang ],
}
}

即:缩进对应的是json对象中的key,- 对应的是数组中的一项,还是比较好理解的~

正式介绍 .gitlab-ci.yml 配置文件之前,我们要提一下 GitLab CI中的几个相关概念

Job

Job[2] 可以理解为CI流程中的单个任务。

job是一个顶级元素(相当于yml配置的一个根元素),它可以起任意的名称、并且不限数量,但必须至少包含 script 子句,用于指定当前任务要执行的脚本,如:

Stages

Stages 用来定义一次CI有哪几个阶段,如下

同时每个stage又可以与若干个job关联,即一个阶段可以并行执行多个job;如下,在每个job中使用stage关键字关联到对应stage即可:

Pipeline

Pipeline[3] 是持续集成、交付和部署的顶级组件,它可以理解为是流水线的一次完整的任务流程;

Pipeline 可以包含若干Stage,而每个Stage又可以指定执行若干job,这样我们就可以把整个构建的流程串起来了。如下,我们就可以在GitLab 的pipeline中看到这些Stages,及其对应的job:

如果Pipeline中的一个任务成功,将进入其下一个Stage的Job;反之如果中途失败,则默认会中断流水线的执行。

常用配置

接下来重点介绍一下 .gitlab-ci.yml配置[4] 的常用关键字:

stage

上述有提到过,用 stage 可以定义 job 在哪个阶段运行:

script

用于指定运行器要执行的脚本命令,可以指定多条

before_script & after_script

用于定义应在job 在执行脚本之前/后时要执行的内容:

allow_failure

用于配置当前 job 失败时 pipeline 是否应继续运行:

cache

指定缓存的文件列表,用户在不同的 job 之间共享;

cache:key:可以给每个缓存一个唯一的标识键,如果未设置,则默认键为default

cache:paths:指定要缓存的文件或目录

only / except

only 用于定义何时执行job,反之 except 用于定义何时执行job;

它们有四个关键字可以一起配合使用:

retry

设置在 job 执行失败时候重试次数:

variables

可用于定义执行过程中的一些变量

when

用于配置 job 运行的条件:

tags

选择特定tag的GitLab-runner来执行

GitLab-runner 安装&注册

配置好我们的 yml 文件之后,还需要配置GitLab-runner,用于执行对应的脚本。

安装[5]

注册[6]

注册时需要的 URL & token可以在 GitLab -> Settings -> CI/CD -> Runners 中获取

打造一条流水线

预览Pipeline

当有了以上的准备,我们配置好 .gitlab-ci.yml 文件、写好对应的脚本,同时配置好 GitLab-runner 后,就可以开启并体验 CI 流水线了。当提交代码后(当然也可以按上述的only关键字设置为打tag、提mr时触发),就可以触发GitLab CI的Pipeline,并执行对应的stages及其jobs啦

如下图,我们可以在 GitLab -> CI/CD -> Pipeline 中看到:

配置一条流水线

规划实现如下:

综合以上,我们可以得到以下大致的 .gitlab-ci.yml 配置(job 对应的 script 可根据实际情况和需要编写):

触发pipeline后,我们可以看到,经过了scm编译、test自动化测试的步骤后,到了Manual-point卡点,此时流水线已经锁定执行,需要人工手动点击确认才可以继续执行;

当点击执行 job 后

定时任务

有些场景我们想定时地执行Pipeline,而不是通过事件触发,可以在GitLab -> Setting -> Schedule 进行设置

间隔的设置采用的是 cron 语法[7],它是Unix和类Unix系统中设置定时任务的语法;
它使用5个占位符分别代表 分钟、小时、月份的日期、月份、周几;如下:
# ┌─────────── minute (0 - 59)
# │ ┌─────────── hour (0 - 23)
# │ │ ┌─────────── day of the month (1 - 31)
# │ │ │ ┌─────────── month (1 - 12)
# │ │ │ │ ┌─────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

# 例子:
* * * * * # 每分钟执行
30 10 * * * # 每天10:30
30 10 * * SAT,SUN # 每周六、周天10:30
0 8 1-20 * * # 每个月的1-20号的8点

设置好后即可看到定时任务列表:

参考资料

[1]

YAML语法: docs.ansible.com/ansibl

[2]

Job: docs.gitlab.com/ee/ci/j

[3]

Pipeline: docs.gitlab.com/ee/ci/p

[4]

.gitlab-ci.yml配置: docs.gitlab.com/ee/ci/y

[5]

安装: docs.gitlab.com/runner/

[6]

注册: docs.gitlab.com/runner/

[7]

cron 语法: en.wikipedia.org/wiki/C

代做工资流水公司吉林对公账户流水样本滁州银行流水账单公司漳州收入证明公司广州车贷银行流水 办理泉州薪资流水单模板徐州公司流水代做镇江银行流水修改价格孝感办理个人工资流水重庆制作银行流水扬州查个人工资流水宜昌个人工资流水 图片烟台个人流水查询大庆查询企业对私流水徐州背调工资流水办理查询入职流水柳州自存流水样本三亚开薪资银行流水镇江代办日常消费流水淮安工资流水办理青岛个人银行流水打印莆田入职银行流水打印湖州办理房贷收入证明济宁转账流水代办信阳办流水账单开封做银行流水单盐城查银行流水修改许昌工资流水账单代开揭阳办收入证明湖州查询银行流水电子版烟台代办银行流水账香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化