0 背景
持续集成(Continuous Integration,简称 CI)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)都是互联网领域优秀且成熟的软件工程实践。关于 CI,可以参考阮一峰老师的文章《持续集成是什么?》进行大致的了解。
在自动驾驶软件开发过程中,也曾有过一段时间实践了 CI 平台的搭建,下图是基于 GitLab + Jenkins 的 CI 平台工作流程图,基于 GitLab + GitLab CI + GitLab Runner 的 CI 平台流程与之类似,博主工作中采用的是后者的方式,两者差别不大。
1 基础概念
1.1 GitLab
- GitLab 用于代码托管和版本控制
1.1.1 搭建 GitLab 服务器
- 安装依赖
- 安装 gitlab-ce
- 配置服务器 IP 和端口
- 启动各项服务
- web 页面设置 root 用户密码
1.1.2 创建 Group
- web 页面操作(可见性选择“内部”)
- 向 Group 内添加 user,并为其分配角色:
Reporter
Developer
Owner
等
1.1.3 在 Group 下创建 Project
- web 页面操作(可见性选择“私有”)
1.1.4 完成 Project 创建后的设置
- web 页面修改 clone 地址,形如:
UserName@ServerIP_OR_ServerDomain:GroupName/ProjectName.git
1.1.5 GitLab CI
- 内建 CI,GitLab 的一部分,如果由 GitLab CI 来执行构建任务,会降低 GitLab 性能,更适合用于管理构建任务
- 在 GitLab 工程仓库根目录下创建持续集成流程模板
yaml
脚本文件:.gitlab-ci.yml,即可开启 GitLab CI
1.1.6 GitLab Runner
- 使用 GitLab CI 时,用于执行构建任务的脚本命令
- 需在集成服务器上单独安装,并进行注册和配置,在 GitLab 服务器通过 web 页面为各个 Project 激活 Runner,配合 GitLab CI 使用,存在三种形式:
- 本地服务器 Runner
- 远程服务器 Runner
- Docker Runner
- 按照 Runner 与 GitLab Project 间的映射关系,可以在安装 Runner 时将其注册为以下三种形式中的一种:
- Specific Runner
- Shared Runner
- Group Runner(新版的 GitLab 才支持)
1.1.7 GitLab Webhook
- 向 GitLab Project 发起的
push
merge
tag
等事件可以触发 GitLab Webhook 访问一个或多个 Jenkins 回调地址(创建的 Jenkins Job),通知 Jenkins 拉取代码,并执行自动构建、打包等操作
1.1.8 如何配置 GitLab Project 与 Jenkins Job 间的联系
- 开放允许外发请求:管理中心 -> 设置 -> 网络 -> 外发请求
- 创建 Personal Access Token
- 创建 Private Token
- 添加 Jenkins 回调地址 GitLab Webhook URL 和 Jenkins 创建的 Secret Token
1.1.9 如何配置 GitLab 服务器与集成服务器间的联系
- 集成服务器上生成 SSH key,将公钥添加至 GitLab 服务器,用于 clone 代码
1.2 Jenkins
- 用于多台集成服务器间构建任务的调度
1.2.1 搭建 Jenkins 服务器
- 安装 JDK
- 安装 Jenkins
- 配置服务器端口
1.2.2 新建 Job
- web 页面操作
1.2.3 pipeline
- Jenkins 可以创建多种形式的构建 Job,自由风格的和流水线(Pipeline)式的最为常用,流水线式的构建 Job 所使用的构建脚本被称为 Pipeline Script,使用
Groovy
语法
1.2.4 节点的定义
- Jenkins 服务器与集成服务器都是节点,Jenkins 服务器是
master
节点,集成服务器是slave
节点 - 每个
slave
节点需配置节点名、最大任务数、远程根目录、用法(尽量运行或仅构建指定 Job)、Jenkins 服务器登录节点的方式(Launch method):SSH、节点 IP、凭据(Username + Password)
1.2.5 如何配置多节点分布式构建
- Pipeline Script 中不要指定节点名即可
1.2.6 如何配置 Jenkins Pipeline Job 与 GitLab Project 间的联系
- Jenkins 安装 GitLab 插件、GitLab Hook 插件
- 配置构建触发器
- 创建 Jenkins 回调地址 GitLab Webhook URL
- 创建 Sercret Token
- 配置构建执行脚本
1.2.7 如何配置 Jenkins FreeStyle Job 与 GitLab Project 间的联系
- Jenkins 安装 GitLab 插件、GitLab Hook 插件
- 配置 GitLab 连接
- 添加 GitLab 创建的 GitLab API token
- 配置源码管理
- 设置 GitLab Project 代码仓库 URL
- 配置凭据
- 配置构建触发器
- 创建 Jenkins 回调地址 GitLab Webhook URL
- 创建 Sercret Token
- 配置构建执行脚本
1.2.8 如何配置 Jenkins 服务器与集成服务器间的联系
- 配置 Jenkins 服务器登录节点的方式(Launch method):SSH、节点 IP、凭据(Username + Password)
1.2.9 Jenkins 与 GitLab 服务器、集成服务器间的三种认证/授权方式
- Username with password
- GitLab API Token
- GitLab Private Token
- GitLab Personal Access Token
- SSH Username with private key
1.3 Jfrog Artifactory
- 用于环境、存放库、软件包、集成版本等二进制文件
1.3.1 搭建 Artifactory 服务器
1.3.2 基本操作(如何进行二进制文件版本管理)
- web 页面操作
1.3.3 安装插件
1.4 集成服务器
- 用于执行具体的集成任务脚本命令。于 GitLab CI 而言,集成服务器是 Runner;于 Jenkins 而言,集成服务器是 node。
2 GitLab + GitLab CI + GitLab Runner 实现 CI
一些关键点:
yaml
脚本中before_script
after_script
及普通 job scripts 在 Runner 服务器的路径入口- 将 job 配置为
tag
触发 - 获取 Project 最新的
tag
信息,可参考此前的文章《如何检出 git 仓库中最新的 tag 号》
3 GitLab + Jenkins + Node 实现 CI
当时未进行此类实践。
4 总结
4.1 GitLab CI 与 Jenkins 非常相似
- GitLab CI 的 gitlab-ci.yml 相当于 Jenkins job 的构建脚本
- GitLab Runner 相当于 Jenkins 的 node
- GitLab Runner 注册时的 tags 相当于 Jenkins node 的节点名
- GitLab CI 会将 gitlab-ci.yml 中定义的各个子 job 分配到指定 Runner 执行(通过 tags 关键字进行指定,如未指定则随机分配),Jenkins job 构建脚本(脚本式 pipeline)可以通过在 node 块中指定 node 名来选定 node 服务器执行脚本命令
5 参考
- GitLab Docs
- Jenkins Docs
- Git Hooks、GitLab CI 持续集成以及使用 Jenkins 实现自动化任务
- 通过.gitlab-ci.yml 配置任务
- Gitlab 通过 Webhook 实现 Push 代码后 Jenkins 自动构建
- Gitlab + Jenkins 的 CI 实践
- CentOS 7 部署 Gitlab+Jenkins 持续集成 (CI) 环境
- 利用 Gitlab 和 Jenkins 做 CI(持续集成)
- What is the difference between a node, stage, and step in Jenkins pipelines?
- 火掌柜 iOS 团队 GitLab CI 集成实践