背景

  • 云原生的背景下,应用或是运行在云主机上、或是运行在k8s中,对于我们的现状而言,云主机的应用使用jenkins来进行部署、k8s中的应用使用自建的运维平台来部署,这对于开发的使用习惯来说不够友好,多个应用同时发布需要各个平台切换
  • 为了控制代码的发布频率,以减少故障率,我们对发布时间及发布频率做了控制:每天0点-12点可以发布,其余时间不允许发布。其余时间遇到紧急修复BUG类的,必要发布更新,走特殊审批流程发布
  • 站在DevOps的角度来看,我们的产品需求与CICD环节是断层的。需求管理使用的是禅道,如何打通需求与发布的关联关系?
  • 对于运维侧来说,应用发布权限分配未实现自动化,每次开通权限需要手工操作,如何避免或优化这一环节?

需求目标

针对以上问题,我们要做到:统一发布平台、打通DevOps工作流、优化使用体验,因为本质上,开发的诉求无非是代码最快速度触达用户。

工作流和流程图梳理

工作流 image.png 逻辑流程图 image.png

涉及到的一些细节问题

分支的开发策略?

我们采用的是分支开发主干发布,分支由系统自动创建

  • 多人开发:开发直接pull该分支,并切出本地开发分支进行开发,后合并到此分支即可
  • 单人开发:直接基于发布系统创建好的分支,本地开发,直接merge到主干分支 image.png

发布权限如何管控?

在打通了需求和发布的工作流后,注意,我们关注的维度已经不是某一个应用,某一个人是否拥有发布权限了,而是针对此次需求,哪些人可以有发布权限?那么有发布权限的人可以对此次需求中的所有应用,进行发布。这里我们采用的是,一个需求对应一个发布单,有了需求就可以创建发布单,发布单任何人都可以创建,但是一个需求被一个发布单关联,否则禁止创建发布单,发布单其中一项就是关联人员的选项,指除创建人外,可拥有发布权限的人员列表。

应用信息如何管理?

应用的元数据信息,统一维护在CMDB中。主要维护信息包括:应用名称、仓库地址、维护人、语言技术栈、部署类型等

关于流水线管理?

现有发布主要分为jenkins和k8s发布,可以统一放在pipeline的stage中,则发布系统可支持对jenkins流水线编排的能力。优点是归一化管理,每个应用的逻辑以jenkinsFile体现,发布逻辑透出,非常利于后续运维管理

这里假设某一个pipeline伪代码如下:

{
	stage(代码检出),
	stage(编译构建),
	stage(部署推送),
	stage(结果通知),
} 

场景假设(现在需要给某一流水线统一增加代码检测逻辑):

{
	stage(代码检出),
	stage(代码检测),
	stage(编译构建),
	stage(部署推送),
	stage(结果通知),
} 

综上,利用jenkins流水线可实现功能的可插拔 jenkinsFile目前有公共库的引用和每个Job运行时的数据,目前都存放在git仓库上,发布系统管理页面可支持可视化编辑,存储依然依赖GitOps的方式即可

发布平台使用过程

  • 创建发布单 image.png
  • 进入发布页 image.png
  • 开始发布 image.png
  • 等待构建 image.png
  • 发布完成 image.png