技术干货,第一时间推送
最近的一个项目,需要实现一个工作任务流(task pipeline),基于之前CICD的经验,jenkins pipeline和drone的pipeline进入候选。
drone是基于go的cicd解决方案,github上有1.6万+star,本文简单对比了其和jenkins的区别,重点介绍了drone的pipeline原理,并简单分析了代码。
jenkins 与 drone
drone pipeline好处是相对更轻量级,yml定义也相对简洁清晰,按照功能来划分容器,可以方便的实现task的复用,而jenkins则是完全打包到一个镜像,会造成单个镜像体积过大,比如jenkins的单个镜像超过2G。
drone的pipeline,是基于https://github.com/cncd/pipeline 实现的,这里简单分析下其原理。
编译和执行 drone pipeline
要了解一个程序的原理,先从输入输出讲起。
先安装:
Copy
然后测试
Copy
pipeline.yml 定义文件
pipeline.json 编译后的配置文件
.env 环境变量
先来查看 定义
Copy
上面的yml定义了:
工作目录workspace
初始化工作,git clone仓库,仓库地址在.env里定义
然后是定义pipeline,
pipeline下面是step数组,这里只有一个build
使用golang:1.7镜像
构建命令在commands数组里定义
通过compile配置文件:
Copy
查看编译后的
Copy
简单分析结构:
pipeline 定义了执行的stage,每个stage有一个或者多个step
networks、volumes、secrets 分别定义网络、存储和secrets
通过network,实现container互通
通过volumes实现数据共享
最后执行,通过:
Copy
pipeline 原理分析
编译过程
可以形象的理解为 .env+pipeline.yml --> pipeline.json
编译过程不复杂,主要是解析pipeline.yml为:
Copy
然后转换为json对应的config:
Copy
该部分主要代码在pipeline/frontend里
执行过程
我们主要关注执行过程,主要代码在pipeline/backend里。
首先是读取配置文件为backend.Config
Copy
然后创建执行环境,目前的代码仅docker可用,k8s是空代码。
Copy
接着开始执行
Copy
其中pipeline.NEW创建了对象;
Copy
其中Engine,操作容器的interface,目前仅docker可用。
Copy
关注Run:
Copy
重点在于使用errgroup.Group通过协程方式运行step:
Copy
-深入原理-
知其然并知其所以然
领取专属 10元无门槛券
私享最新 技术干货