Devops之CICD选型

warning: 这篇文章距离上次修改已过557天,其中的内容可能已经有所变动。

前言

先来一张图简单说明一下Devops

DevopsDevops

CICD是工程化绕不开的话题,而CICD另据,Jenkins又占据了半壁江山(或者说丢了半壁江山?)。在之前也是选型的Jenkins,用了接近5年,虽然有些比较难用,但这么久整体磨合下来使用也是相对满意。由于种种问题,使用中感受到Jenkins不断臃肿并且使用上越来越繁琐,开始了解目前CICD领域的工具 Drone。

Jenkins

先来看看Jenkins的架构。

Jenkins 架构Jenkins 架构

Jenkins 痛点

  1. 安装麻烦

    安装后进行的初始化等等,略微麻烦,有时候还需要换源才能装上插件
  2. 灵活但又臃肿的插件体系

    Jenkins引以为傲的便是丰富的插件体系了,可成也萧何,败也萧何。过于灵活的插件机制让各插件相互作用的同时也在相互牵制。每个插件依赖的其他插件会因为依赖项的原因而无法更新,使用等等。甚至过多的依赖项,让插件数量不断膨胀。更新时完全无从下手,谁该更新,谁不该更新,谁应该更新到啥版本。更过分的是经常会出现Jenkins升级后无法用,丢失Job的问题。让人又爱又恨
  3. 繁琐的操作

    新建一个构建任务需要经历如下步骤:
    1. 创建流水线(选择流水线)。
    2. 关联Git仓库,选择JenkinsFile或界面填写脚本,设置触发器。
    3. 编写构建脚本。
    4. 在Git仓库中添加WebHook(同时确保Jenkins安装了 Git Webhook 相关的插件。
  4. 脚本复用率低下

    JenkinsFile无法模板化,每个仓库必须重复一边,当通用流程有变动时,会导致所有相关联的仓库都需要修改一次脚本。这也是在使用过程中比较心累的一点。
  5. 与Git源代码仓库耦合度低

    Jenkins将Git也作为一个插件引入的同时,和Git仓库耦合度也降低了,比如:
    1. Git WebHook 需要单独手动到仓库里进行设置。
    2. Git与Jenkins的用户、权限并不互通。从项目管理的角度上来看,拥有构建权限的用户应当在Git中也对应了高权限。但是这里将二者分割开了,导致账号繁多,权限重复设置的问题。
  6. SSH插件年久失修

    使用过程中难免遇到需要自动部署的时候,而Jenkins中的SSH插件令人诟病的一点就是只能使用旧版本的密钥(4096长度),最开始死活提示失败。另外Passphrase也不支持空,如果为空,那么必须不传,传的话必须设置了passphrase(好离谱啊)。

Drone CI

老规矩,先来看看Drone CI的架构。

Drone CI架构Drone CI架构

聊完了 Jenkins, 那么接下来聊聊 Drone CI。这个号称是下一代CICD的工具, 针对Jenkins的绝大多数痛点进行了全方位打击。但与此同时它也有它自己的缺点,但是个人认为它更大的意义是代表Devops领域在思想上的进步与CICD工具在向前探索的脚本。

Drone CI优点

  1. 基于Docker生态

    无论是安装,还是插件,亦或者是运行。都是基于Docker(当然也有其他的方式,但最推荐的是这种),因此Docker的优点和生态它都完美的利用起来。
  2. 安装极简

    基于Docker的前提下, 一个compose文件, 即可快速启动(主体是很轻量化的,只作为controller)。
  3. 丰富的插件生态和可能性

    1. 前面说了它是基于Docker的,所以连插件都是基于Docker。这意味着对于插件而言,不限制任何语言和技术栈,只要符合插件的输入输出规范即可,最终插件形态为容器即可。甚至可以直接手动Mock参数进行插件调试(Jenkins是基于单一语言的插件生态,并且插件与server耦合度极高,甚至还可以耦合其他插件)。
    2. 另一个很有意思的设计就是插件并不在Server侧,而是在Runner侧(Jenkins中的agent/builder)。所有的插件都并非与Server通信,而是直接与Runner进行通讯。这极大程度的减轻了Server的负担和不必要的臃肿。
    3. 值得一提的是,连凭证管理都作为插件独立出来了噢。比如可以用Vault这类专业的凭证管理工具来进行统一管理。
  4. 高度耦合Git源

    1. Drone CI 的设置极其简单,首先是基于Git源的账号权限体系,通过OAuth进行接入。完全沿用Git源的账号权限体系,减少了不必要的重复工作。
    2. 根据账号权限同步Git仓库,并决定开启哪些Git仓库的CICD(激活一下即可,Drone CI会自动创建webhook,寻找脚本进行构建),并且每一次构建都是基于Git仓库中的构建脚本进行构建的(Jenkins还有一个扫描的过程,在脚本有变动时,需要重新扫描流水线才能生效。与其说繁琐,不如说是Jenkins在Git外又独立维护了脚本)。
  5. 脚本模板化

    1. 为了解决大多数情况下,构建流程高度相似的脚本内容,Drone CI 基于 Golang Template 库提供了模板化的功能。可以将通用流程放到模板中,关键参数通过仓库的脚本传入来进行渲染得到最终的脚本。极大的提高了脚本复用率和编写调试脚本的时间,因为80%的项目构建流程基本一致,只是参数和部署目标,参数,脚本不同而已。
    2. 在使用模板的情况下,仓库中的脚本只需要引用相关的模板名称,然后填写参数即可。
  6. 灵活的脚本

    基于yml的脚本,融入了Docker的思想(每一个step都可以使用image作为环境),并且支持Docker的各类参数。使得脚本可以基于现有Docker生态的情况下进行天马行空的操作。
最后修改于:2023年05月13日 19:00

评论已关闭