本文将介绍CI/CD的基本概念,以及如何使用Gitlab来实现CI/CD。
本文介绍的CI/CD项目为个人Gitlab项目:gitlab_ci_test,访问网址为:https://gitlab.com/jclian91/gitlab_ci_test。
CI/CD的含义
在现代软件工程中,CI即持续集成(Continuous integration)
,CD有两重含义,即持续交付(Continuous Delivery)
和持续部署(Continuous Deployment)
,CI/CD是软件工程中的重要过程。
CI,联系到具体的开发运维场景,就是指开发者在完成项目中的一个小特性后,将自己分支的代码合并到测试分支,这个过程就是集成,在集成过程中,会运行一系列代码格式的检查、单元测试等严格保证项目质量的检查作业。
CD有两种含义:
- 持续交付,完成CI中的所有作业后,持续交付可自动将已验证的代码发布到储存库。持续交付是拥有可随时部署到生产环境的artifaces或Docker镜像,这一过程一般
手动实现
。 - 持续部署,鉴于部署环境和部署方式的差异以及各种应用之间的耦合,部署这一项任务不再是简单的几行命令就能搞定的了。持续部署意味着只要提交了代码,就可以实现将代码自动部署至指定环境,如测试环境、开发环境等。这对于项目开发是十分方便、高效的。
Gitlab CI/CD
最初是Gitlab于2015年6月发布的一个特性,它支持在项目中编写一个.gitlab-ci.yml
文件来定义一组自动化作业(Job),这些自动化作业组成一条自动化流水线(Pipeline)。2016年,Gitlab又推出了自研的Gitlab Runner
软件包,以此作为流水线的运行环境。当开发者提交或合并代码时,Gitlab CI/CD会自动运行测试用例,构建、部署环境,并且开发者能在Gitlab中看到整个流程的所有信息,包括日志、流程和artifacts,不需要登录Gitlab之外的任何平台。
Gitlab CI/CD的典型工作流程如下:
Gitlab CI/CD特性如下:
- 开源: CI/CD是开源GitLab社区版和专有GitLab企业版的一部分。
- 易于学习: 详细的官方操作文档。
- 无缝集成: CI/CD是GitLab的一部分,支持从计划到部署,具有出色的用户体验。
- 可扩展: 可以根据需要添加任意数量的构建节点。
- 更快的结果: 每个构建可以拆分为多个作业,这些作业可以在多台计算机上并行运行。
- 针对交付进行了优化: 多个阶段,手动部署, 环境和变量。
Gitlab Runner
Gitlab Runner是一个用于运行Gitlab CI/CD流水线作业的软件包,由Gitlab官方开发,完全开源,支持在主流的系统上安装、运行,比如Windows, Linux, MacOS等。在笔者的MacOS系统中,安装方式为:
brew install gitlab-runner
Gitlab Runner分为三种类型,在注册Runner过程中使用不同类型的token就能区分不同的类型。
- Shared Runners,共享Runner,可以被仓库里面的任意项目使用。token获取位置为全局管理中心-Runner-注册令牌。
- Group Runners,组Runner,仅能被某个组中的任意项目使用。token获取位置为项目群组-CICD-Runner-注册令牌。
- Specific Runners,特定Runner,仅能被指定的项目使用。token获取位置为项目-设置-CICD-Runner-注册令牌。
本文中使用Specific Runners
,我们为项目申请特定Runner,如下图:
- 创建项目Runner
2. 选择Linux平台,tags自己填写,点击Create Runner按钮
3. Runner创建完毕,可获取url和token
4. 在本地电脑上,注册Runner:gitlab-runner register --url https://gitlab.com --token glrt-xxx
,token为第3步中的token。
5. 查看Runner及运行Runner:
6. 至此,项目中的Runner已配置完毕,我们可以运行CI/CD流水线了。
.gitlab-ci.yml
在一个项目中,流水线文件通常是放在.gitlab-ci.yml文件中,该文件采用YAML格式书写。
在编写.gitlab-ci.yml文件前,我们需了解几个基本概念。
- 流水线(Pipeline):流水线由.gitlab-ci.yml文件定义,它是一系列作业的组装。这些作业按照一个顺序运行,行程一条流水线。触发流水线的操作可以是代码推送、创建tag、合并请求,以及定时触发。
- 阶段(Stages):流程组成流水线,主要用于给作业分组。阶段会由上到下按顺序执行。
- 作业(Job):作业组成阶段,是最基础的执行单元。同一个阶段的作业是并行运行的。
以下是一个测试流水线,它包含3个阶段:install,build,deploy,顺序执行,每个阶段都有各自的作业。当代码提交至主分支时,便会触发流水线。
stages:
- install
- build
- deploy
install_job:
stage: install
script:
- echo "hello install"
build_job:
stage: build
script:
- echo "hello build"
deploy_job:
stage: deploy
script:
- echo "hello deploy"
我们查看deploy_job的运行结果:
接下来,我们对本项目进行流水线配置,如下:
stages:
- build
- deploy
build-job:
stage: build
script:
- echo `date`
- echo "Hello, $GITLAB_USER_LOGIN!"
- echo "This job deploys something from the $CI_COMMIT_BRANCH branch."
deploy-job:
image: docker
# necessary for my macbook
variables:
DOCKER_TLS_CERTDIR: ""
DOCKER_HOST: "tcp://docker:2375"
services:
- docker:dind
# necessary for my macbook
stage: deploy
script:
- docker build -t flask_blue_print:$CI_COMMIT_SHORT_SHA .
- docker run -d -p 5005:5000 --name flask_demo flask_blue_print:$CI_COMMIT_SHORT_SHA
- docker ps
该流水线的阶段为:build和deploy,build阶段中的build-job进行简单测试,deploy阶段中的deploy-job使用Docker进行部署。
流水线采用Docker部署,执行成功,但本地电脑的Docker服务并没有运行该服务,原因为Gitlab与Gitlab-Runner不在一个环境中。
总结
本文主要介绍了CI/CD的基本概念以及Gitlab CI/CD的简单使用。有了Gitlab CI/CD,我们就可以保证项目代码质量(需代码测试),并且方便、高效地进行代码更新,持续集成和持续部署,对于我们提高工作效率有很大改善。
参考文献
- gitlab-ci的简易入门—基于python项目的CI演示:https://mp.weixin.qq.com/s/aQmdusndVdxHo1rrj7eg1w
- docker部署gitlab CI/CD (二)终篇:部署gitlab runner和添加gitlab-ci.yml文件 终极踩坑版:https://www.cnblogs.com/gaoxiong666/p/17336256.html
- Gitlab CI/CD 简单介绍:https://blog.csdn.net/wangjiang_qianmo/article/details/122867335
- Gitlab官方网站:https://docs.gitlab.com/ee/ci/
- Gitlab CI/CD从入门到实战,庞梦臣著,人民邮电出版社,2023-04-01