GitLab CI/CD 实践
Last updated: Oct 219, 21029
介绍
来看一幅图:

可以看到:
作为开发的我们只需要提交代码,仅此而已
应用的编译、单元测试、集成测试全部在 CI 流程中自动执行
应用的部署、交付在 CD 流程中自动执行
为什么可以使用 CI/CD:开发之后到部署完成 这段过程 是固定的
CI/CD 能解决什么问题:当自动化在工作流中占很大的比重时
概念
CI/CD
在软件工程中,CI/CD 通常是指 持续集成 和 持续交付(有时也称持续部署)相结合的实践
Job
表示构建工作,可以在一个 Stage 中定义多个 Job
Job 具有如下特点:
- 相同 Stage 中的 Jobs 会并行执行
- 相同 Stage 中的 Jobs 都执行成功,该 Stage 才会成功
- 任何一个 Job 失败,那么该 Stage 失败,那么构建任务 Pipeline 也失败
Stage
表示构建阶段,可以在一次 Pipeline 中定义多个 Stage
Job 运行在 Stage 中
Stage 具有如下特点:
- 所有 Stage 按顺序运行,一个接着一个
- 所有 Stage 完成后,构建任务才会成功
- 任何一个 Stage 失败,后面的 Stage 都不会执行,构建任务失败
Pipeline
表示构建任务
是一组运行在各个 Stage 中的 Job 集合
可以包含多个流程:编译、测试、部署等等
任何提交 或 Merge Request 都能触发 Pipeline

Job、Stage 和 Pipeline 的关系

GitLab Runner
运行 Pipeline 构建任务的进程
Gitlab 采用的是 构建任务 和 构建任务 Runner 分离的架构
这么做的好处是:
- 分工明确:GitLab 负责管理构建状态,GitLab Runner 执行构建任务
- 运行构建任务会消耗系统资源,所以将 Runner 拆分,提高 GitLab 性能
实践
场景
我所开发的巡检功能包含很多模块,还有一些 Python 依赖包
而我每次提供给交付的都必须是一个 tar 压缩包
这就造成了 当我每次修改巡检功能中的一个开发模块后,都必须手动压缩,上传
过程
考虑到这个过程是一个固定的流程,所以我打算应用 CI/CD
前提
版本 GitLab Community Edition 10.2.2
安装 GitLab Runner
按照 官方文档 安装即可,例如在 CentOS 环境下:
# For CentOS
curl -LJO https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_<arch>.rpm
# install GitLab Runner
rpm -i gitlab-runner_<arch>.rpm
注册 Runner
注册 Runner 需要提供 GitLab 项目中的一些信息,可以在如下页面找到:


# 运行
sudo gitlab-runner register
# 输入上图中 1 处的 URL
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com)
{1 处内容}
# 输入上图中 2 处的Token
Please enter the gitlab-ci token for this runner
{2 处内容}
# 输入描述
Please enter the gitlab-ci description for this runner
[hostname]my-runner
# 输入 tag
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
# 输入 Runner 执行器
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
shell
# 等等
编写 .gitlab-ci.yml
该文件定义了 Pipeline,GitLab-Runner 就是按照该文件中的定义执行构建任务的:
variables:
product_name: "QPlusReport"
publish_dir: "/etc/publish"
package_name: "QPlusReportv1.0.0.tar.gz"
stages:
- package
- deploy
package:
stage: package
script:
- echo "current stage is package"
- rm ${package_name}
- echo "delete QPlusReportv1.0.0.tar.gz successfully"
- tar czvf ${package_name} ${product_name}
- echo "package successfully"
deploy:
stage: deploy
script:
- echo "current stage is deploy"
- rm ${publish_dir}/${package_name}
- cp ${package_name} ${publish_dir}
- echo "deploy successfully"
可以看到其中只定义了两个 Stage,分别是压缩和部署
运行
然而当我运行 Pipelines 时,构建任务一直卡着不动,如下:

这里需要在 Runner 处设置才行:


修改过后,Pipeline 构建成功:
