“DevOps”一词是由英文 Development(开发)和 Operations (运维)组合而成,但它所代表的理念和实践要比这广阔的多。DevOps 涵盖了安全、协作方式、数据分析等许多方面。但它是什么呢?

DevOps 强调通过一系列手段来实现既快又稳的工作流程,使每个想法(比如一个新的软件功能,一个功能增强请求或者一个 bug 修复)在从开发到生产环境部署的整个流程中,都能不断地为用户带来价值。这种方式需要开发团队和运维团队密切交流、高效协作并且彼此体谅。此外,DevOps 还要能够方便扩展,灵活部署。有了 DevOps,需求最迫切的工作就能通过自助服务和自动化得到解决;通常在标准开发环境编写代码的开发人员也可与 IT 运维人员紧密合作,加速软件的构建、测试和发布,同时保障开发成果的稳定可靠。

当然,这意味着更改代码会更频繁,基础架构的使用也会更灵活。所以传统的管理策略无法满足这种需求。您也需要应势而变,赢得先机。

DevOps是一个循环递进的过程。通过文化的指引,打造符合当前组织和文化的相关工具链,固化协作的规范、流程;然后随着工具落地、实践推广,促使组织更快地发展和改进产品,从而进一步加强协作文化和方式。

引文参考:https://www.redhat.com/zh/topics/devops

1、概述

1.1 现有上线流程描述

随着DevOps在公司的不断实践落地,基于环境现状,目前已经发展成较为成熟和稳定的工作流。负责DevOps建设的团队目前的工作是内部Ops平台开发和不断发现挖掘内部人员的需求以进一步优化。得益于容器以及k8s相关技术使得业务稳定性提高,基于Jenkins Pipeline流水线的任务构建及各类环境的部署发布也变得容易,Prod生产环境和Pre预生产环境的上线发版还是由测试或运维人员负责在平台进行点击和确认发布。

1.2 钉钉OA审批与生产上线的结合

在企业沟通协作软件的应用中,除了很少企业有足够的能力、成本用来自建即时通讯或完全内网环境下的通讯软件,大部分企业中基本都是以常用的企业沟通协作软件为主,例如腾讯系的企业微信、阿里系的钉钉、字节跳动的飞书等等。

可以参考我之前的文章JenkinsShareLibrary实践之自定义钉钉通知器

以钉钉为例,钉钉的OA审批是一个常用的工具,其自带的应用场景包含请假、调休、加班、用印申请等等。

由于对协作软件钉钉的“重度依赖”,加上内部运维相关平台中还没有成熟的审核上线机制,因此作为一个DevOps er,将钉钉OA审批与DevOps工作流中的生产上线流程进行结合是我很想做的。

近期通过对钉钉OA审批功能的调研,发现钉钉产品大约在202012月上线了叫做系统集成的功能,下面是来自钉钉关于系统集成的介绍

系统集成是新型的云集成服务,利用统一的数据模型和编排引擎,通过配置化快速实现钉钉与外部系统的集成对接,将企业不同系统整合到统一平台,享受钉钉高效移动办公体验。

借助钉钉系统集成服务,企业可以打通钉钉审批与钉钉其他官方应用、SaaS应用以及企业内部应用,目前系统集成示例包含智能人事、用友U8、金蝶、SAP等。

简单来说,钉钉OA给我们开放了一个系统集成(也叫做连接器)的功能,这个功能能够实现钉钉OA审批单与钉钉外部系统的对接,从而实现不同系统间的数据整合,进一步提高办公效率。

经过调研,这个功能是收费的(尽管是收费,但相比花费在云厂商的服务器费用只能算是九牛一毛),这个功能叫做OA审批高级版,可以在正式使用前以企业身份申请短期试用。

2、总体实现思路

借助钉钉OA自定义审批,让提交人例如测试人员发起上线审批,将相关上线信息填写在审批单中,然后提交到审批人,例如部门领导、项目经理等人员进行审批,审批通过后由程序自动执行上线发版操作。对于相关上线的信息,当然还是要以直观的、能够进行选择的更为友好,因此审批单中的部分上线信息需要借助调用外部接口生成。

这里以Jenkins工具为例,前提条件是我们已经有了稳定和对业务环境来说较为完善的发版上线流水线(其中包含各种常用参数化构建、发布类型等等),Jenkins的相关API中,RESTful风格的API最为通用。通过API相关方法获取Jenkins上的Job信息、Job的构建参数相关信息、提供到OA审批单让用户进行选择,这就和在Jenkins上进行参数化构建是一样的。

3、流程描述

3.1 泳道图

这里以本不专业的画图功底简要画了个泳道图(如果哪里不对,欢迎留言指出)

3.2 流程描述

按照上面的泳道图简要进行描述:

  • 自定义的接口程序从Jenkins服务器获取所有正常可用的Job相关信息(名称、发布参数、发布类型等),组装成特定的数据格式提供给OA审批表单连接器
  • 连接器请求接口并接收入参,将数据映射到自定义的OA表单
  • 发起人按照格式填写审批单
  • 审批单进行基础校验,首先根据用户选项判断是否有数据库变更,如果有数据库变更但未完成则提示用户先进行数据库变更再发起审批,如果审批人确认没有数据库变更,提交给审批人
  • 审批人进行审批,审批通过后提醒审批发起人审批通过并将数据提交到接口程序
  • 接口程序根据解析出来的请求参数,入库记录并调用Jenkins API进行触发
  • Job开始运行,运行完成后向审批人、发起人发送上线成功的通知

4、关键实现

4.1、连接器的创建

首先,重要的一点是要向管理员申请企业钉钉工作台OA模块的子管理员操作权限。钉钉后台登录界面如下

有了权限之后,申请OA高级版的试用,试用开通后,就能进入到钉钉OA后台创建连接器了

系统集成分为连接器和集成流两种,两者相比后者能定制一些更为复杂的逻辑。对于本文的场景,选择连接器即可

连接器的创建流程是先输入连接器名称和描述创建连接器,然后基于创建的连接器创建动作。当然,也可以给每个动作创建单独的连接器,每个连接器下仅包含一个动作。

根据上面的泳道图,整个流程涉及到了两次连接器的数据交互。其实我这里是三次,表单交互一次,关联表单一次,最终触发一次

  • 第一个连接器动作:请求外部数据,获取到可读的Job中文名称列表,并将数据渲染到表单第一个“项目名称”单选框

  • 第二个连接器动作:根据用户选择的“项目名称”,作为条件再次请求外部数据,获取到该项目下所有的子Job任务名称并渲染到第二个“应用名称”单选框

  • 第三个连接器动作:将审批通过后,发起人填写的所有数据提交到接口进行处理

连接器的创建界面,以第一个连接器为例,我这里叫做“加载项目名称”,需要填写鉴权方式、接口URL、加密密钥、请求方式、入参参数、出参参数

4.2、审批单的创建

连接器创建好后,创建OA审批表单,通过图形界面可视化低代码模式进行创建,如下所示

审批单表单设计完成后,需要设计流程设计,即审批流程,我这里有一个表单校验功能是让用户确认是否有数据库变更,只有在没有数据库变更或者已完成变更的情况下,发起人才能提交审批,如下所示

4.3、接口程序开发

(这里也许是所有人关注的重点)由于JenkinsAPI接口提供的只是一些通用的接口方法,而钉钉OA审批单由仅限于提交数据发起审批,所以需要开发一个接口程序来处理,接口程序是钉钉OA审批和Jenkins服务器之间的桥梁,本文记录的实践是以Django REST framework为基础技术框架实现的,基于我的应用场景,目前此接口包含的主要核心功能如下:

  • 主要获取JenkinsJob等信息组装成特定格式,序列化后提供给钉钉OA连接器

  • 接收连接器POST过来的“项目名称”,返回项目下的所有“应用名称”

  • 接收连接器最终POST过来的表单数据,进行校验

  • 根据数据判断是立即触发还是定时触发Jenkins执行构建

  • 数据的缓存与入库记录等等

这里有个小坑,自动触发jenkins流水线执行并不难,但我的流水线之前定义了在构建后还需要接收用户input的步骤,想要自动绕过或自动input需要一点小技巧,这个下次再聊

由于篇幅有限,这里也就不多展开,后面有机会的话会将此接口程序开源,这里仅仅进行介绍和简要分析。

5、小结

到这里,基于钉钉OA审批流完成自动化上线发布操作就完成了,带来的好处多多:统一了相关人员常用的协作平台、在正常情况下完全无需运维人员介入,极大提高了工作效率,缩短了上线时间。