CI/CD产品选型调研
CI/CD产品选型调研
为什么需要 CI/CD?
- 自动完成代码合并、编译与运行单元测试,有助于问题的较早发现与修复。
- 自动化的部署流程,可以将经过测试的代码自动部署到生产环境,确保快速、可靠的发布。
- 提高开发效率:开发人员可以快速获取构建失败的反馈,减少调试时间、自动化流程减少了人工干预,提高工作效率。
调研考虑
- 易于安装
- 易于使用
- 使用普遍性
- 维护难易程度
- 部署方式(本地、docker、k8s)
- gitlab支持
- 开源免费
Jenkins
GitHub star数23.3k 地址:https://github.com/jenkinsci/jenkins
Jenkins 是领先的开源自动化服务器。它使用 Java 构建,提供了 1,800 多个插件来支持几乎任何事情的自动化,帮助人类把时间用在机器无法做的事情上。
使用情况
Jenkins 被数百万用户和数千家公司使用,包括facebook、Netflix、twitch、ebay、京东等。
关键特性
-
易安装:官网下载直接运行;
-
易配置:提供了友好的 GUI 配置界面;
-
变更支持:能从代码仓库中获取并产生代码更新列表,输出到编译输出信息;
-
支持永久链接:用户是通过 Web 来访问 Jenkins 的,而这些 Web 界面的链接地址是永久的,可在任何文档中直接使用;
-
集成 E-mail/RSS/IM;
-
JUnit/Test NG 测试报告:以图表形式提供测试报告;
-
文件指纹信息:会保存哪次集成构建产生了哪些 jars 文件,哪次集成使用了哪个版本的 jars 文件等记录;
-
支持大量的第三方插件。
基本流程
jenkins优势
- Jenkins社区活跃,拥有丰富的插件生态系统,可以轻松集成各种开发流程,安装和配置相对简单。
- 支持多种CI/CD场景,无论是gitlab、github还是本地仓库,都能无缝集成。
- 能按照预定脚本自动触发构建、测试和部署过程,节省时间和人力。
- 提供详细的构建历史和工作流视图,便于监控和故障排查。
jenkins 劣势
- 软件开发较早,在使用功能的时候,必须依赖一些附加的组件和插件。
- 在对jenkins进行管理的时候,必须对各个插件的配置方法及使用深入了解,甚至为了正常运行jenkins,编写大量的CI代码。
- 当构建一个更复杂的管道时,势必会有更多的步骤,使用更多的工具,需要更多的容器,项目变得复杂且难以维护。
- 项目隔离和权限分配方案存在缺陷。
GitLab CI/CD
GitHub star数23.8k 地址:https://github.com/gitlabhq/gitlabhq
GitLab CI/CD(持续集成/持续交付)是 GitLab 提供的一套集成开发工具,用于自动化构建、测试和部署应用程序。它提供了一个强大的持续集成和持续交付平台,可以帮助开发团队更高效地管理和交付软件。
使用情况
暂时没有获取到多少公司在用,只查询到GitLab CI/CD 被列为市场上最受欢迎的CI/CD解决方案之一。
基本架构
将代码托管在git存储库中,在项目的根目录创建ci文件.gitlab-ci.yml
,在文件中指定构建,测试和部署脚本。gitlab将检测到.gitlab-ci.yml
,使用gitlab runner执行脚本,脚本被分组为作业,它们共同组成了一个管道。运行作业完成后返回gitlab。runner类似于jenkins的agent,go语言编写,可以根据需要配置任意数量的runner。
.gitlab-ci.yml流行线的脚本
stages: # List of stages for jobs, and their order of execution- build- test- deploybuild-job: # This job runs in the build stage, which runs first.stage: buildtags:- buildonly:- mainscript:- echo "Compiling the code..."- echo "Compile complete."
unit-test-job: # This job runs in the test stage.stage: test # It only starts when the job in the build stage completes successfully.tags:- testscript:- echo "Running unit tests... This will take about 60 seconds."- sleep 60- echo "Code coverage is 90%"lint-test-job: # This job also runs in the test stage.stage: test # It can run at the same time as unit-test-job (in parallel).tags:- testscript:- echo "Linting code... This will take about 10 seconds."- sleep 10- echo "No lint issues found."deploy-job: # This job runs in the deploy stage.stage: deploy # It only runs when *both* jobs in the test stage complete successfully.environment: productiontags:- buildonly:- mainscript:- echo "Deploying application..."- echo "Application successfully deployed."
GitLab CI/CD主要特点和功能
- 自动化构建和测试:GitLab CI/CD 允许您在代码提交到 GitLab 仓库时自动运行构建和测试作业。您可以定义多个作业,并在每个作业中编写自定义的构建和测试脚本。
- 并行执行:GitLab CI/CD 支持并行执行作业,从而加快构建和测试的速度。您可以根据需要在不同的作业中并行执行任务,提高整体的开发效率。
- 多阶段流水线:GitLab CI/CD 使用阶段(stages)来组织作业的执行顺序。您可以定义多个阶段,并在每个阶段中运行一系列的作业。这使得您可以按照特定的流程对代码进行构建、测试和部署。
- 集成容器技术:GitLab CI/CD 集成了容器技术,如 Docker,使得构建和测试环境的配置更加灵活和可重复。您可以使用 Docker 容器来创建一致的开发和测试环境,确保代码在不同的环境中具有一致的行为。
- 持续交付和部署:GitLab CI/CD 支持持续交付和部署。您可以配置自动化的部署流程,将经过测试的代码自动部署到生产环境或其他目标环境中,从而实现快速、可靠的软件交付。
- 可视化界面和报告:GitLab CI/CD 提供了直观的用户界面,用于监视和管理构建和部署流水线。您可以查看作业的执行状态、日志输出以及生成的报告,以便更好地了解整个 CI/CD 流程的状态和结果。
- 可扩展性和定制性:GitLab CI/CD 是高度可扩展和可定制的。您可以根据项目的需求配置各种不同的构建、测试和部署策略。它还支持与其他工具和服务的集成,如监控系统、通知系统等。
优势
- 易于学习,官方提供详细的技术文档
- 无缝集成,是gitlab的一部分
- 对交付阶段进行优化
- 扩展性较好,每个构建可以拆分为多个作业
- 轻量化
劣势
- 代码托管在gitlab的存储库才能使用gitlab ci/cd
Drone
GitHub star数32.3k 地址https://github.com/harness/harness
Drone 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试、构建、发布。每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构建环境并保证隔离。开发者只需在项目中包含 .drone.yml文件,将代码推送到 git 仓库,Drone就能够自动化的进行编译、测试、发布。可以与Docker完美集成。
使用情况
暂无
主要特点
- 基于go语言开发的开源的CI/CD系统、安装配置简单,轻量级,启动快资源占用少
- 天然支持Docker,支持多种执行环境,包括 Docker 和 Kubernetes,特别适合微服务架构和云原生应用的开发
- 执行流程.drone.yml编写简单,Pipline 比 Jenkins 语法简单,可快速上手
- Drone 通过插件机制,支持多种扩展和集成,可以灵活定制构建过程
- 支持多种代码托管平台,支持并行创建
基本架构
Server(服务器) 主要负责管理和展示, Runner(执行器) 主要负责执行操作。Server服务,它是一个守护进程应用并且拥有Web管理界面。它通过Webhook对接Git Server。解析Git Repository根目录下的.drone.yml文件,并以轮询的形态查找需要执行的Pipelines,路由并管理Runners。Runner(执行器) 是真正执行持续部署操作服务
.drone.yml 示例
kind: pipeline
type: docker
name: defaultsteps:# 第一个并行执行的步骤- name: test-1image: golang:latestcommands:- go version- go test ./... # 第二个并行执行的步骤- name: test-2image: node:latestcommands:- node --version- npm install- npm test# 定义并行化的逻辑
# group 是用来定义并行执行的步骤组
group:- test-1- test-2
type支持:docker、k8s、exec、ssh、aws、 MacStadium
Drone的优势
-
和 Jenkins 相比, Drone 镜像小,设置迅速,从应用本身的安装部署到流水线的构建都简洁的多。由于是和源码管理系统相集成,所以 Drone 天生就省去了各种账户权限的配置,直接与 gitlab 、 github 、 Bitbucket 这样的源码管理系统操作源代码的权限一致。
-
Drone 与流行的源代码管理提供商无缝集成,支持github、gitlab、gogs、gitea、gitee、bitbucket server/cloud, 这是使用Drone的第一印象,可以实行快速打造GitOps场景。
-
流水线插件是执行预定义任务的 Docker 容器,通过将它们配置为Pipeline中的步骤。插件可用于部署代码、发布工件、发送通知等。
-
没有明显的缺点,官方文档和示例解释的不太清晰
Argo Workflows
GitHub star数15.1k 地址:https://github.com/argoproj/argo-workflows
专为实现 Kubernetes(以下简称 K8s
) 环境下的并行作业编排与管理而设计。它允许用户通过声明式的方式来定义工作流程,这些流程不仅包括简单的顺序执行任务(步骤工作流),还能支持复杂的并行处理和条件分支逻辑(DAG
工作流)。借助 K8s
的资源管理机制,Argo
将工作流程的每个步骤作为独立的 Pod
进行调度和执行,确保与 K8s
生态系统的深度集成,并展现出卓越的可扩展性。
应用场景
Argo Workflows 可用于各种场景,如持续集成/持续交付(CI/CD)、机器学习模型训练、数据处理等。
使用情况
包括Alibaba Cloud、Adobe、Cisco、RedHat、Zhihu等200多家公司使用该产品。
关键特性
-
声明式工作流:Argo 使用声明式 YAML 文件来定义工作流程,这使得工作流程的定义、版本控制和复用变得极其简单。
-
可扩展性:通过自定义资源定义(CRDs),Argo 可以轻松扩展以支持新的工作流步骤类型。
-
并行执行:Argo 支持并行执行工作流步骤,这可以显著提高工作流的效率。
-
条件逻辑:工作流可以包含条件逻辑,Argo 允许根据前一步骤的结果动态选择执行路径。
-
参数化和模板:Argo 支持参数化和模板,这使得创建可重用的工作流程变得更加容易。
-
持久化卷和输出参数:工作流步骤之间可以通过持久化卷和输出参数进行数据交换。
-
监控和日志记录:Argo 提供了对工作流执行的监控和日志记录功能,使用户能够跟踪工作流的进度和状态。
workflow的一个yaml文件
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: hello-world- # Name of this Workflow
spec:entrypoint: hello-world # Defines "hello-world" as the "main" templatetemplates:- name: hello-world # Defines the "hello-world" templatecontainer:image: busyboxcommand: [echo]args: ["hello world"] # This template runs "echo" in the "busybox" image with arguments "hello world"
总体架构
其中:
-
Argo CLI:命令行工具,可以更加简洁方便地对 Workflow 实例进行创建、查看、删除等操作。
-
Argo UI:提供 Web GUI 页面工具及一些运维工具,以可视化的方式观测 Workflow 实例的运行动态。
-
Workflow Controller:Workflow 调度与生命周期管理控制器,负责监视 Workflow CR 的创建、更新与删除,并控制 Workflow 实例及每个实例下节点的运行。
-
workflow step pod :对应于
steps
模板类型。在steps
模板中,可以定义一系列顺序执行(-
)或并行执行(--
)的任务。每个任务可以引用一个模板或者直接定义一个内联任务。这些任务在 Kubernetes 集群上以 Pod 的形式运行,每个任务对应一个 Pod。因此,workflow step pod
是执行单个步骤任务的 Pod。 -
workflow dag pod :对应于
dag
模板类型。DAG
(有向无环图)模板允许用户将任务定义为带依赖的有向无环图。在DAG
中,任务之间的依赖关系通过dependencies
字段设置,指定在特定任务开始之前必须完成的其他任务。workflow dag pod
是执行 DAG 模板中定义的任务的 Pod,这些任务可以有依赖关系,并且可以并行或顺序执行,取决于定义的依赖关系
整体对比
CI/CD工具 | 优势 | 劣势 |
---|---|---|
Jenkins | 社区活跃、高度灵活、社区强大、成熟稳定 | 插件依赖性强、学习成本高、性能要求高 |
Gitlab CI/CD | 原生集成、易于使用、功能全面 | 强依赖gitlab、扩展性有限、社区版局限 |
Drone | 原生docker支持、轻量级、配置简单、 | 插件支持有限、功能局限 |
Argo Workflow | 原生支持K8S、安装简单、轻量级、 | 不适合非k8s环境、学习成本高、生态较小 |
其他产品
- circleci(很难在本地部署,不支持在 K8s 中部署)
- Travis CI(本地部署选项有限)
- Buddy(收费)
- Semaphore、Nevercode(不开源,不支持本地部署)
调研结论
根据对比jenkins、gitlab CI/CD、Drone、Argo workflow、Circle CI、Travic CI等多种产品的优势劣势,如jenkins是目前适用范围最广,最成熟的产品,但是其太过庞大,插件依赖性太强,需要对多种插件进行深入学习了解,另外如drone和argo两款产品原生支持docker和k8s,但是社区生态较新,使用度略显不足,在进行CI/CD过程中出现未知问题的解决方法不够成熟。综合是否开源、是否开源免费、是否普及、是否支持gitlab、是否便于安装维护等多个维度,考虑目前团队的使用情况及需求,认为还是基于gitlab CI/CD使用较为合适。