基于Jenkins的构建部署任务扩展设计

转载本文需注明出处:微信公众号EAWorld,违者必究。前端


前言:mysql


不一样企业,不一样系统,不一样应用在开发中所使用的技术栈都不尽相同,所以构建所用的编译工具以及应用部署所使用的应用服务器也有所不一样。如何扩展支持各类工具与应用服务器部署也成为了DevOps支撑企业持续集成与持续部署落地的关键组成部分。nginx

本文从普元DevOps平台基于Jenkins pipeline构建及部署任务的扩展设计提供一种DevOps构建及部署任务设计的思路及方法。git


目录:web


1.为何在设计时要考虑如何扩展?sql

2.咱们作了哪些扩展方面的设计。数据库

3.扩展设计后续。后端


1.为何在设计时要考虑如何扩展?api

在了解普元DevOps任务扩展设计以前,再重复说明一下普元DevOps平台持续集成及持续部署基于Jenkins pipeline的任务编排模式。
持续部署任务与持续集成任务基本同样,将相似应用服务器的部署(如websphere应用部署)封装成一个独立的任务,只是部署在pipeline stage的groovy脚本中添加了ansible-playbook的调用。在构建任务以及发布流水线中,用户能够根据本身的需求进行任务的编排。平台会将编排的好的任务提交给Jenkins引擎执行。

普元DevOps平台将提供的原子任务分为五类:代码,工具,构建,部署,测试。tomcat

代码:拉取代码,代码库打标签,代码库分支维护,代码库标签,代码库分支合并等。

工具:脚本执行,数据库检查,数据库脚本执行,介质仓库同步,文件生成等。

构建:Maven构建,Npm构建,Gradle构建,Ant构建,Docker镜像构建等。

部署:数据组件发布,Tomcat云主机部署,Springboot云主机部署,Weblogic应用部署,Websphere应用部署,EOS应用部署等。

测试:Checkmarx,SonarQube,JMeter,Robotframework,Findbugs等。

平台提供的五类原子任务合计已经超过70个,后续仍然会不断增长。

由此可知,若在设计之初不考虑原子任务的扩展建立,后续添加原子任务将是一件繁复的工做。

2.咱们作了哪些扩展方面的设计

设计思路:

原子任务扩展的关键点无非三点:原子任务,任务的属性参数,任务的脚本实现。

咱们使用sql添加原子任务以及原子任务的属性参数,后端提供原子任务以及任务属性查询接口,而后前端使用动态表单展现原子任务信息以及任务属性。用户编排任务后执行。平台会根据用户编排的任务流程组装配置整个jenkins任务的xml配置文件,而后提交给jenkins引擎生成对应的任务。

相关表设计:

任务模板表

表结构关键字段:

关键字段说明:

STAGE_HANDLER: 定义任务拦截器,能够对任务属性进行处理。

COMMON_STAGE_TPS: 任务公共属性模板,平台将一些任务属性定义为公共的模板供任务直接引用。

如在部署相关任务中都涉及介质信息相关属性,所以将介质信息定义为一个公共属性模板,在部署任务中经过该字段引用,这样就不须要在任务属性表中重复定义介质相关属性,后续对介质信息的相关字段扩展也会直接映射到全部关联了该模板的部署任务。

务模板属性表

表结构关键字段:

关键字段说明:

CONTROL_TYPE: 属性的表单类型,有如下几种类型textbox,dict,combobox,checkbox editor,类型不一样对应的前端展现的表单控件不一样。

VALUE_PROVIDER: 当表单类型为特定类型时,此字段定义数据来源。好比当表单类型为combobox时,此参数能够配置为api接口相关访问信息,将接口返回值做为下拉选项和值。

Maven构建任务属性示例:

MAVEN版本:CONTROL_TYPE设置为dict,VALUE_PROVIDER值设置为{"type":"dictcombobox","dictTypeId":"DPS_CD_MAVEN_VERSION"},若是须要扩展额外的MAVEN版本支持,只须要在平台管理新增业务字典DPS_CD_MAVEN_VERSION的值便可。

JDK版本:同MAVEN版本同样,也是采用了业务字典项,方便扩展多版本支持。

settings文件:CONTROL_TYPE设置为editor,VALUE_PROVIDER值设置为{"type":"xml"},这样在编辑器中会根据xml类型作高亮显示。

执行Junit测试:CONTROL_TYPE设置为checkbox。

其余须要用户输入的字符串参数大多使用textbox类型。

此任务中没有使用到的CONTROL_TYPE为combobox的类型在以前提到的公共属性模板介质信息中的介质仓库属性有使用,使用该类型时将VALUE_PROVIDER定义为api访问的相关信息以下:

组件实例运维表

表结构关键字段:

关键字段说明:

COMPONENT_TYPE:组件类型,使用业务字典项DPS_PDM_COMPONENT_TYPE定义,一般将工程中最小可部署的单位定义成一个组件,如普元DevOps应用采用先后端分离的方式部署,这里定义3个组件,前端nginx-web组件,后端tomcat组件以及数据库mysql组件,在编排发布流水线时能够根据具体的部署任务关联对应的组件(如tomcat云主机部署任务关联DevOps后端的tomcat组件)。

OPERATE_NAME:运维操做,定义组件实例的运维操做。部分部署任务(如Tomcat云主机部署等)执行成功后会根据组件及主机资源等配置信息生成组件实例,组件实例的运维操做经过该字段定义。

相对于任务及任务属性的动态表单设计,脚本的设计就相对简单了。只须要将实现具体功能的脚本文件根据既定的规则命名及存放到指定的目录便可。

3.扩展设计后续

在线任务扩展

当前这种任务扩展方式仅仅只是给开发人员提供了便利,可是用户仍然很难扩展本身的任务,所以后续会考虑将任务扩展的能力作成平台功能的一部分提供给用户使用。

任务定义建立一个任务,如maven构建任务,对应的任务类型为构建(build)。

属性定义:设计任务参数,如maven构建任务,构建依赖的jdk版本,构建所使用的pom文件路径等。同时配置参数对应的前端控件(如checkbox,select,password等),若使用select框则须要定义展现数据的来源,能够是api和业务字典等。

脚本编写:提供在线IDE的能力,用户能够实时维护并编辑本身的脚本,保存后便可完成加载。以供后续测试使用。

任务测试:能够配置任务的属性参数,选择对应的测试脚本。在执行测试前能够根据预知的正确结果定义校验步骤,如构建任务是否是生成了对应的文件,部署任务是否是启动了对应的端口,HTTP是否能够正常访问等。

任务发布:能够对测试经过的任务进行发布,也能够对已经发布的任务进行下线维护。

环境隔离

在普元DevOps平台中jenkins做为构建部署引擎提供服务,对用户来讲是无感知的,用户不须要知道应用在何处编译,也不须要知道编译工具的路径,用户只须要配置任务执行便可。jenkins引擎会根据用户的配置生成对应的任务。

咱们在使用DevOps平台过程当中也碰到了一些问题。

1.应用构建依赖特定的环境编译。如IOS应用等。所以咱们添加了构建及部署任务能够选择指定的jenkins引擎以及绑定到指定节点执行的能力。

2.扩展工具支持,扩展多版本支持不方便。由于任务是随机调度的,全部的jenkins节点都得包含编译所需的工具,所以全部的jennkins节点都得安装对应的工具及版本。

3.安全问题。由于jenkins引擎是各个项目公用,且包含脚本执行的能力,存在误操做或被恶意破坏的可能(Use Groovy Sandbox配置开启后功能基本没法正常使用)。

针对问题2和3,咱们思考了两种解决方案,都是基于容器进行环境隔离。

方案1:每个任务对应一个slave节点,slave节点进程运行在容器内部,根据任务自动建立,任务完成自动销毁。

优势:slave节点动态建立,动态销毁,节省资源。

缺点:slave节点使用的容器镜像,仍然须要包含任务所需的全部工具。会存在镜像过大的问题。

方案2:jenkins的管理节点和slave节点仍然运行在主机环境,只将任务具体stage中最终造成的执行命令使用容器运行,任务中执行命令的容器挂载同一个workspace空间。如stage git最终造成了一条命令git pull http://test.project.git。使用包含git工具的容器镜像运行这条命令将代码拉取到挂载的workspace中,stage maven生成的命令maven clean install则使用包含maven构建环境的容器镜像执行便可。

优势:扩展工具只须要扩展新的镜像便可,很是方便。

缺点:须要维护镜像与原子任务的关系。

写在最后

企业DevOps平台建设与落地不是一蹴而就的,DevOps平台自己亦是如此。只有在不断使用的过程当中不断的优化演进,这样才能让DevOps平台愈发强大,以更好的支撑企业的IT建设。

精选提问:

问1:若是部署是经过ansible执行的,那ansible是否是跟jenkins slave在一块儿?如何解决ansible免密认证的问题?

答:通常不会作免密登陆,咱们是经过资源管理的功能管理主机以及容器等基础设施的信息。在部署任务配置中能够选择要部署的主机。在任务执行过程当中咱们会生成临时的inventory文件,执行完成后销毁。

问2:若是流水线中有人工卡点,负责审核的人迟迟不点击,普元的DevOps平台如何解决对应的Jenkins Job一直pending的问题?

答:咱们在发布流水线配置的每一个环境的节点均可以配置人工审批,这种每一个环境的部署是独立任务。审批经过才能启动新的任务。还有一种是添加人工审批的原子任务,这种就是在某个job的stage等待审批。咱们是采用超时时间配置,若不处理,超过超时时间会自动终止,而后下次执行能够选择跳过已经执行过的步骤。

问3:有没有方法指定N台Jenkins打包安卓,N台打包Java,N台打包iOS…… 用户的安卓请求来了,设法路由到安卓的这几台,这几台中随机选一台?

答: 这个能够的,咱们执行任务除了能够选择引擎,也能够配置工做节点的label。只须要给jenkins slave节点配置label便可,这是jenkins自己就支持的能力。


推荐阅读


DevOps平台之测试管理设计

DevOps平台之一键发布设计

DevOps平台之开源技术图谱

关于做者谷缜,现任普元高级研发工程师。曾参与神华灾备云平台项目,九江银行持续集成项目等,主要负责项目实施工做。开源技术爱好者,擅长云计算,容器,DevOps等相关领域技术。


关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!


课程预告!  7月3日(周五)下午14:30普元产品经理隔壁老王为你们分享《探索图数据库在数据资产可视化中的应用》,敬请期待!


分享在看,点点点

本文分享自微信公众号 - EAWorld(eaworld)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索