0%

工作中关于 CI 持续集成的一些总结

0 背景

持续集成(Continuous Integration,简称 CI)、持续交付(Continuous Delivery)和持续部署(Continuous Deployment)都是互联网领域优秀且成熟的软件工程实践。关于 CI,可以参考阮一峰老师的文章《持续集成是什么?》进行大致的了解。

在自动驾驶软件开发过程中,也曾有过一段时间实践了 CI 平台的搭建,下图是基于 GitLab + Jenkins 的 CI 平台工作流程图,基于 GitLab + GitLab CI + GitLab Runner 的 CI 平台流程与之类似,博主工作中采用的是后者的方式,两者差别不大。

基于GitLab + Jenkins的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

一些关键点:

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 参考

  1. GitLab Docs
  2. Jenkins Docs
  3. Git Hooks、GitLab CI 持续集成以及使用 Jenkins 实现自动化任务
  4. 通过.gitlab-ci.yml 配置任务
  5. Gitlab 通过 Webhook 实现 Push 代码后 Jenkins 自动构建
  6. Gitlab + Jenkins 的 CI 实践
  7. CentOS 7 部署 Gitlab+Jenkins 持续集成 (CI) 环境
  8. 利用 Gitlab 和 Jenkins 做 CI(持续集成)
  9. What is the difference between a node, stage, and step in Jenkins pipelines?
  10. 火掌柜 iOS 团队 GitLab CI 集成实践

Thank you for your donate!