cf2012.github.io

page

Follow me on GitHub

从Jenkins到Drone

我与Jenkins战斗日子

2014年~2018年我在的公司使用使用Jenkinsrundeck实现CI/CD. 前期主力是Jenkins. 使用Jenkins经历了几个阶段:

  1. 使用Web UI点点. 复杂的逻辑用shell脚本实现,由Jenkins调用
  2. 使用Jenkinspipeline功能,通过groovy脚本封装公共逻辑,减少重复配置
  3. CI/CD阶段. 实现git2jenkins, 用户将代码更新后,触发自动构建,发布到测试环境. 部署包存放到指定目录. 通过rundeck部署在线环境

阶段1. 使用Jenkins插件加shell脚本

why:刚开始使用Jenkins. 从网上找教程,跟大牛学习配置流水线. 有些复杂功能用shell实现会简单点. 比如: 上传文件到某主机指定目录.然后执行重启操作.

how: 整个编译发布过程有以下节点:

  • 节点1. 从SCM下载源码
  • 节点2. 代码编译
  • 节点3. 单元测试. 可选
  • 节点4. 部署到指定环境. CI/STG/PRD
  • 节点5. sonar扫描. 可选

阶段2. 使用pipeline功能

w h y : 后来公司开始做外部项目,需要配置的东西多.流行 Configuration as a code . 正好有时间,所以就研究了pipeline功能.

how: 使用 pipeline实现了:

  • 支持通过shared-libraries复用代码
  • 在SCM工具中保存了pipeline配置,可以看到历史版本. 方便回退. 不用担心jenkins 配置丢失了
  • 封装封装… 方便在不同项目部署Jenkins

最终效果:

//file: dev_publish_web_bss.groovy. Jenkins直接调用
@Library('my_tools') _

// 封装的函数. 将下载、编译、发布全封装了. 根据入参选不同的配置 
// 封装了发送通知模块.实现通过叮叮发送通知,告知发布进度
projectxxWebDelivery(
	Job_Name: "web-bss", 
	Job_Desc: "开发环境前端-bss",
	Deploy_To: "dev",
)

p.s. 太复杂了.走火入魔的感觉 😓

阶段3, CI&CD

why: 偷懒,不想每次手工点jenkins. 当然还是有时间.

how: 实现功能有:

  1. git2jenkins功能. 用户提交代码可以触发Jenkins构建. 这样提交代码就会自动做单元测试,成功后可以发布到CI环境
  2. 每个版本构建的结果保存起来.war包或docker image . 并将版本号记录到DB
  3. 部署时,可以从db中选择指定的版本部署. 不用再重新编译. 通过rundeck操作

其中git2jenkins功能实现流程:

  1. gitee上配置webhook 有人push代码时,调用rundeck. 见我的项目: gitee2rundeck-adapter
  2. rundeck 收到请求时,根据逻辑调用jenkins构建

p.s. 使用rundeck中转的原因: rundeck的权限控制做的比较好

反思

pipeline功能很强大, 但阶段2追求功能复用导致新人接手门槛高. 如果再做, 我会采用通过python程序用模版生成pipeline脚本来实现. 😄

为什么选择 Drone

w h y: 使用golang编写,比较酷. 配置比jenkinspipeline简单易懂. 使用docker技术,方便使用k8s资源

用Drone 如何解决之前的问题

需要有以下功能:

  • 流水线内部支持串行与并行
  • 节点下如果有多个子节点,支持跳过若干个
  • 二次开发能力 & 开发插件简单

Drone 架构

写Drone插件

使用Drone exec练手

参考资料

B站视频【用 Drone 改善團隊自動化測試及部署流程】吳柏毅 (R2-Day1) MOPCON 2018

pipeline getting started

Jenkins Best Practices - Practical Continuous Deployment in the Real World

pipeline shared-libraries

##