51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

再见 Jenkins!一款更适合国人的自动化部署工具来了

说到 CI/CD 的工具,IT 圈内名声最响亮的可能就会是传统的老牌 CI/CD 的王者之一:Jenkins。说到它基本上 IT 人都知道。在曾经云计算时代,乃至更久远的时代,因为那个时候软件架构还没有拆分成微服务,很多都是主机部署。所以 Jenkins 靠着一套 Pipeline 和自由风格流水线,打遍天下无敌手。

Jenkins 之所以能够这么纵横宇内有很大的一部分原因就是:开放,CI/CD,使用简单,能够走完一整套交付流程。

  • 开放:意味着有着开放包容的api和插件,能够面临各种场合。
  • CI/CD:意味着能够完整的走完一整套交付,包含代码的拉取,制品的生成存储以及服务的部署。

但是随着技术的不断迭代,Jenkins 终将有一天不再适合新的环境。各位请继续往下看嘞。

云原生时代 CI/CD 面临的挑战

在云原生时代,万物皆可云原生。随着微服务的盛行,业务逻辑的服务拆分,容器化的兴起,编排容器逐步成为了业务主流规范。进入到这一阶段,新的挑战也就随之而来。例如:

  • 以前服务少,Jenkins 能够一把梭哈,现在服务多起来了,每个服务都要一个Jenkins Job,尽管都是一样的逻辑,复制粘贴,但是数量多了也终将是一个麻烦事。如果十个,百个呢?
  • 现在每个服务都要用 Jenkins 去做 CI/CD,那么我要封装很多的 pipeline,还有 Dockerfile,这种有规律的文件为什么不能抽象化,每次都要自己写。
  • 每次使用都是通过 kubelet 加 shell 命令去做的构建部署,这样合理吗?
  • 环境众多,开发、测试、预发、压测、生产,每个项目总有那么最少两三个环境吧,这个时候环境多了如何管理呢?
  • 通过 K8s 的标准编排,很多服务配置文件都会以 ConfigMap,Secret 的形式存在,不同环境的配置都会不一致,那么如何去做统一管理呢?
  • 研发人员的感知态如何做到?研发人员需要知道这个服务上了 K8s 是否启动成功,包含日志,事件信息,部署 Job 是否成功。这些能提供吗?
  • 发版服务的时候,如何才能合理管理版本呢?
  • 开发测试找你要环境,你该如何快速部署相应呢?

以上种种就是服务迁移 K8s 后所要面临的部分问题。Jenkins 很好,但是在新趋势的到来后,个人还是感觉心有力而力不足。

一款新的开源 CI/CD 平台:Zadig 到来了。

什么是 Zadig

Zadig 是 KodeRover 公司基于 Kubernetes 自主设计、研发的开源分布式持续交付 (Continuous Delivery) 产品,为开发者提供云原生运行环境,支持开发者本地联调、微服务并行构建和部署、集成测试等。Zadig 内置了面向 Kubernetes、Helm、云主机/物理机、大体量微服务等复杂业务场景的最佳实践,为工程师一键生成自动化工作流 (workflow)。Zadig 不改变现有习惯和流程,几乎兼容所有软件架构,无缝集成 GitHub/GitLab、Jenkins、多家云厂商等,运维成本极低。

他可以完美的解决我们迁移 K8s 后的一系列问题。如果加以规划和使用,可以用如下流程图来概括:再见 Jenkins!一款更适合国人的自动化部署工具来了 第1张

详细部署图如下:

再见 Jenkins!一款更适合国人的自动化部署工具来了 第2张

Zadig 有何独到之处?

有了 Jenkins、GitLab 构建为什么还要用 Zadig ?它究竟有何独到之处?

其实 Zadig 构建主要在微服务架构和云原生技术趋势下,经过大量企业实践而诞生的,它是基于容器运行时环境提供的高效云原生构建引擎。

这里我们对常规的构建过程不做赘述,主要针对 Zadig 构建的差异化功能做介绍和实践,通过实践让大家逐一了解和体验。其中包含并行构建、构建模版、多服务共享构建、利用 Serverless 资源构建等。

并行构建

一次工作流并行构建多个服务,微服务架构下开发更方便,业务验证效率大幅提升。

同一工作流同一任务的并发

Zadig 系统的工作流可同时触发多个服务的部署更新。仅执行一次工作流,即可触发多个服务被同时执行构建->部署->测试->分发流程,不同服务的构建发布过程彼此独立互不干扰,如下图所示。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第3张


同一工作流不同任务的并发

Zadig 同一工作流任务支持并发执行,在工作流中选择并发运行,可以开启工作流任务的并发能力。当多个开发者分别触发该工作流部署更新不同的服务时,产生的多个工作流任务将会并发执行,后者无需等待,最大限度地提升协作效率。

如果触发的工作流任务里不包含部署阶段,则即使使用工作流更新相同的服务,同一工作流的多个任务也可并发执行。再见 Jenkins!一款更适合国人的自动化部署工具来了 第4张

目前同一个工作流多个不同的任务支持的并发规则如下:

再见 Jenkins!一款更适合国人的自动化部署工具来了 第5张

值得注意的是 Zadig 构建并发数依赖系统资源的上限,需要管理员在系统设置针对自身情况设置合理的任务并发数配额。

构建模版

根据不同项目、不同技术栈特征,制定若干套构建模版,一套模版可以支持数百微服务,运维规范更易落地,运维成本降低数倍。

新建构建模板

依次访问项目-> 模板库 -> 构建 进入构建模板管理页面。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第6张

点击 + 按钮 -> 填写模板名称 -> 填写模板配置后保存。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第7张

代码信息在构建模板中是无需配置的,使用构建模板为服务创建构建时可以自定义配置。

结合使用构建变量 $REPONAME_<index> 可巧妙的完成构建模板的配置,比如服务的源代码及编译配置在 A 仓库,Dockerfile 文件在 B 仓库,构建配置中的脚本可组织如下,使用模板时,可按照顺序完成对应代码库的配置即可。

#!/bin/bash
set -ex

cd $WORKSPACE/$REPONAME_0/service/
cp $WORKSPACE/$REPONAME_1/dockerfiles/$SERVICE.Dockerfile .
make build
docker build -t $IMAGE -f $SERVICE.Dockerfile .
docker push $IMAGE
使用构建模板

创建构建时选择使用模板 -> 填写构建名称并选择构建模板 -> 选择服务并按需配置代码信息后保存即可。再见 Jenkins!一款更适合国人的自动化部署工具来了 第8张

多服务共享构建

同一个项目多个服务可以共享一套构建脚本,不易出错,还更利于共享维护。

如何配置共享构建

以 multi-service-demo 为例,该项目包括 3 个 Golang 服务 service1/service2/service3,和构建相关的目录结构说明如下:

├── Dockerfile # 定义 3 个服务的 Dockerfile
├── Makefile   # 定义 3 个服务的编译
├── src        # 3 个服务的源代码
   ├── service1
   ├── service2
   └── service3

创建 Zadig 构建,服务选择中选择多个服务,按需配置构建环境、代码信息、通用构建脚本等,利用系统提供变量实现构建的共享,本示例中的构建脚本如下:

cd zadig/examples/multi-service-demo
make build-$SERVICE
docker build -t $IMAGE -f Dockerfile --build-arg service=$SERVICE .
docker push $IMAGE

再见 Jenkins!一款更适合国人的自动化部署工具来了 第9张


如何使用共享构建
  • 创建构建配置时指定多个服务,或者创建构建完毕后修改构建,在服务选择中选择多个服务。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第10张再见 Jenkins!一款更适合国人的自动化部署工具来了 第11张

  • 也可以在为服务配置构建时,按需选择复用已有的构建配置实现构建共享。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第12张


利用 Serverless 资源构建

单独为构建配置 Serverless 弹性资源,应对日常构建频繁的场景,用多少花多少,避免浪费

配置构建集群

目前对腾讯云 EKS 弹性集群已做全面兼容,云厂商购买集群资源后,通过系统设置->集群管理 添加集群即可。再见 Jenkins!一款更适合国人的自动化部署工具来了 第13张

使用构建集群

在构建设置中打开高级配置,选择 Serverless 集群资源。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第14张

Zadig 构建不仅于此,期待更多人分享你的构建场景。

实际案例

分享一个案例:zadig 安装部署接入k8s集群、ldap、jenkins、gitlab、项目配置管理、yaml模板管理。

zadig安装之前先自己安装mysql和mongodb:(注意:zadig基于k8s环境部署的)提供一下容器安装吧:

mkdir  -p /data/mysql
docker run --network=host --restart=always  --privileged=true --name mysql -p 3306:3306 -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it mysql bash
mysql -uroot -p
>use mysql;
>select host,user from user;
>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
>flush privileges;
>create database dex;

docker run  --privileged=true --name mongo -p 27017:27017 -v /data/mongo:/data/db -d docker.io/mongo

cat bian.sh
export DOMAIN=zadig.test.com
export EMAIL=example@koderover.com
export PASSWORD=zadig
export MYSQL_HOST=192.168.14.27
export MYSQL_PORT=3306
export MYSQL_USERNAME=root
export MYSQL_PASSWORD=123456
export MONGO_URI=mongodb://192.168.14.27:27017
export MONGO_DB=zadig

source bian.sh

安装步骤

https://docs.koderover.com/zadig/v1.15.0/install/install-on-k8s/

生产使用
curl -LO https://github.com/koderover/zadig/releases/download/v1.15.0/install.sh  
chmod +x ./install.sh

查看是否部署成功:

kubectl get pod -n zadig

部署就不多说了很是简单,我们说说使用方面的。

OpenLDAP 添加

再见 Jenkins!一款更适合国人的自动化部署工具来了 第15张再见 Jenkins!一款更适合国人的自动化部署工具来了 第16张再见 Jenkins!一款更适合国人的自动化部署工具来了 第17张

然后在系统用户管理里面会同步所有的ldap的用户过来,给用户分配好权限即可。

新加集群可以选择2中方式,一般我们使用直接连接。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第18张

新建项目直接使用k8s托管就行了。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第19张

当然也是可以选择k8s_yaml,这种方式更加灵活多变,直接修改配置文件和deployment等。

再见 Jenkins!一款更适合国人的自动化部署工具来了 第20张

集成harbor可以手动选择容器镜像

再见 Jenkins!一款更适合国人的自动化部署工具来了 第21张

集成jenkins流程

再见 Jenkins!一款更适合国人的自动化部署工具来了 第22张

自动化流程发布可以在工作流配置,可用性还是很多的,请参考官网使用文档吧。

总结

IT 领域的演变,就是运维人员通过不断向上接手开发人员眼中"跟开发无关的杂活",来不断为开发人员减负。开发人员在得到了解放后,可以将视角更多的聚焦在自己开发的业务系统上,释放出自己的创造力。但是运维人员也要不断的优化现有的基础设施架构,以及构建简单易用的平台化工程来给开发人员使用。平台化工程或许是未来 CI/CD 的一个趋势和演进方向吧。

参考文章:https://zhuanlan.zhihu.com/p/579130580 https://xie.infoq.cn/article/cc6182ffdd93f74629e3f1b69 blog.csdn.net/weixin_43606975/article/details/127442891


赞(2)
未经允许不得转载:工具盒子 » 再见 Jenkins!一款更适合国人的自动化部署工具来了