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
  - deploy

build-job:       # This job runs in the build stage, which runs first.
  stage: build
  tags:
    - build
  only:
    - main
  script:
    - 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:
    - test
  script:
    - 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:
    - test
  script:
    - 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: production
  tags:
    - build
  only:
    - main
  script:
    - 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: default

steps:
  # 第一个并行执行的步骤
  - name: test-1
    image: golang:latest
    commands:
      - go version
      - go test ./... 

  # 第二个并行执行的步骤
  - name: test-2
    image: node:latest
    commands:
      - 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" template
  templates:
  - name: hello-world         # Defines the "hello-world" template
    container:
      image: busybox
      command: [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使用较为合适。

相关推荐
路由侠内网穿透13 小时前
本地部署开源持续集成和持续部署系统 Woodpecker CI 并实现外部访问
服务器·网络·windows·ci/cd·开源
一张假钞1 天前
Jenkins 项目迁移
ci/cd·jenkins
Sopaco6 天前
告别项目文档滞后:Litho(deepwiki-rs)在CI/CD中的自动化文档生成实践
运维·ci/cd·自动化
rocksun10 天前
基于GitOps的平台工程:Crossplane与ArgoCD实战
ci/cd·devops
Lin_Aries_042111 天前
基于 CI/CD 平台将应用程序自动部署到 Kubernetes 集群
运维·ci/cd·docker·云原生·容器·kubernetes·jenkins
Elastic 中国社区官方博客13 天前
CI/CD 流水线与 agentic AI:如何创建自我纠正的 monorepos
大数据·运维·数据库·人工智能·搜索引擎·ci/cd·全文检索
Lin_Aries_042113 天前
基于 CI/CD(Jenkins)将 Spring Boot 应用自动部署到 Kubernetes 集群
spring boot·ci/cd·docker·容器·自动化·jenkins
Vahala0623-孔勇13 天前
CI/CD流水线优化:GitLab CI镜像构建加速实战
ci/cd·gitlab
幼稚园的山代王13 天前
utf8mb4_bin、 utf8mb3_general_ci 、utf8mb4_0900_ai_ci 这几个有什么区别
ci/cd