# 说明
本章主要用于 DevOps 的项目下构建管理的说明。
# 构建定义配置
# 触发策略
构建触发策略分为两大类,代码触发策略和定时触发策略。
# 代码触发策略
代码触发策略可以细分为代码提交触发、TAG创建触发和merge请求触发。
使用代码触发策略的前提是在代码库配置了触发的webhook。
代码提交触发
适用场景:代码提交后更新介质或更新测试环境等场景TAG创建触发
适用场景:代码库创建了特定标签后同步构建介质存入介质库等场景merge请求触发
适用场景:合并代码分支后,自动构建部署环境等场景
# 定时触发策略
定时触发策略可以细分为周期策略触发、固定间隔时间触发以及延时构建触发。
周期策略和固定时间间隔策略配置由起止时间参数,配置则在时间范围内触发执行,不配置则会永久执行。
周期策略触发
适用场景:环境的日构建等固定时间间隔触发
适用场景:每小时的数据同步等延时构建触发
适用场景:指定时间的单次触发场景,如凌晨触发一次更新环境等
# 变量配置
可以通过自定义变量,在执行构建时查看或更新指定参数,定义变量后,可在构建任务中使用${变量名}进行变量引用。
变量配置
位置:构建定义点击编辑配置 变量table页面
类型:预设了多种类型适用不同场景,如基础类型:常量、密码、文本等可用于更新文件配置内容;枚举类型:环境类型等可用于数据范围限定,数据显示;以及项目数据:项目,代码库,项目版本号等用于引用项目参数等
是否作为入参:勾选即可在构建时页面更新变量,为否则仅供查看变量使用
定义变量后,可在构建任务中使用${变量名}进行变量引用。 点击构建时,可以更新作为入参的变量变量查看
构建参数table页面可以查看本次构建的参数
位置:构建定义执行数据 构建历史》构建参数
# 任务编排
任务编排
构建定义新建后需要新增和编辑原子任务以满足场景需求
位置:构建定义编辑配置 构建任务 点击任务列表的加号可以添加原子任务 点击任务列表原子任务的操作按钮可以复制,上移,下移和删除原子任务原子任务高级配置
禁用:设置为true则跳过此步骤
超时时间(秒):该步骤执行时间超过设置时间则失败
运行模式:*流水线任务运行模式,有串行,并行,异步三种模式
节点:指定引擎中的执行节点,配置为节点名称或label
容器:指定Pod Template中的容器名称
属性导出:把属性导出到global数据区,{属性名}|{变量名},多个逗号分隔 前置脚本:任务执行前置脚本
后置脚本:任务执行后置脚本
异常脚本:任务执行异常脚本
定义脚本:任务相关的定义脚本 失败后继续运行:该任务失败任然执行后续任务,不会中断
失败回调:任务失败后调用其它构建定义
循环执行表达式:循环执行表达式值为true时循环执行
最大循环执行次数:循环执行表达式不为空时有用,默认100
循环执行间隔(秒):循环执行间隔
循环对象:循环对象必须是一个数组、collection或者Map类型的值,可以使用${cycleItem}获取循环单个元素
# 通知配置
配置通知需要提前配置邮件服务器和确认构建通知模板
通知配置
构建定义执行完成后的统一邮件通知配置,单个任务通知可以写入上文高级配置脚本里的
位置:构建定义编辑配置 通知邮件服务器配置
构建通知模板配置
# 高级配置
回调配置
构建定义成功或失败时可以通过回调执行的其他构建定义,也可以配置groovy脚本引擎配置
引擎:jenkins引擎
节点:指定引擎中的执行节点,配置为节点名称或label
容器:指定Pod Template中的容器名称
自定义Groovy方法模板:执行构建定义时同时执行的groovy脚本模板
EveryNewJob:默认为true,为false时jenkisn执行同一构建定义默认使用同一个pipelineJob
AutoDeleteJob:默认为true,为false时不删除jenkins执行的本条流水线,保留workspace工作空间,便于异常时的排查,定位 自定义Groovy方法模板配置位置
# 构建定义属性高级赋值参考
流水线任务的属性,除了一般的下拉框,直接填值外,还有一些高级方式进行赋值,为了灵活性,系统提供了一下几种高级方式:
# 一、流水线任务属性计算规则如下
1、生成流水线脚本的时候,会使用流水线的变量定义来替换属性值(这种方式${var})含有同名的变量
2、流水线任务执行开始时,除了脚本执行任务能设置是否计算属性值外,其他任务均默认使用pipeline,pipelineContext,globalData,pipelineResult,stageAttrs,stageResult进行属性值计算(不只是值替换,还可以执行方法)。 各内置变量说明如下: 1)pipeline:流水线,主要用来调用流水线的公共方法 2)pipelineContext:流水线上下文 userPlatformParams:用户平台参数 userProjectParams: 用户项目参数 params:用户定义的变量 buildNo:编译号 global:全局数据区 3)globalData:全局数据区数据,也可以通过pipelineContext.global获取 4)pipelineResult:流水线结果 5)stageAttrs:流水线任务属性 6)stageResult:流水线任务结果
使用方式:类似${pipeline.XXX},或者${pipelineContext.XXX},或者${pipelineResult.XXX},或者${stageAttrs.XXX},或者${stageResult.XXX}
# 二、变量赋值
# 1、变量配置
1)构建定义的变量配置:
如果是参数,在构建定义执行时,可以进行赋值修改。
2)发布流水线的变量配置:Global和每个环境的变量。
Global可以在整个流水线中生效,每个环境的变量只在当前环境生效。如果环境的变量名称和Global的名称相同,则覆盖掉Global中的。
变量如果是参数,在流水线执行时,可以进行赋值修改;在环境审批前,也可以进行赋值修改。
# 2、使用方式示例:
${varName}
# 3、变量时机:
流水线脚本生成时,在devops服务器上变量替换掉,支持嵌套。
# 三、groovy内置系统变量
# 1、系统内置变量
- pipelineContext:Map类型的变量,里面有各种流水线上下文数据,可以通过日志中json串,看到里面的内容示例如下:
{ "engineUrl" : "http://10.15.15.133:8080", "sqlDelimiter" : ";", "enginePipelineInstanceId" : "34302", "devopsUserName" : "******", "devopsRootUrl" : "http://10.15.15.96:80", "params" : { "db.password" : "primeton4cloud", "db.userName" : "root", "db.url" : "jdbc:mysql://10.15.15.196:3306/devopsdev?characterEncoding=UTF-8" }, "approvalTimeout" : 120, "nodeNames" : [ "WorkNode134", "WorkNode135", "WorkNodeMobild140", "WorkNodeXian12", "WorkNodeXian13" ], "timeout" : 10, "forceUninstallApp" : "false", "token" : "******", "sqlProcedureDelimiter" : ";", "ansiblePreShellScript" : "", "sqlProcedureDelimiterType" : "row", "envType" : "DEV", "sqlProcedureDetectFlag" : "CREATE PROCEDURE", "sqlDelimiterType" : "normal", "projectId" : "1", "enginePipelineId" : "501" }
2)pipelineResult:Map类型的变量,里面存有每个任务的执行结果,每个结果是一个Map类型,同样可以通过日志中json串,看到里面的内容示例如下:
{ "stageName": "pipeline-result", "beginTime": 1573644061430, "global": {}, "stageResults": [ { "stageIndex": 0, "stageName": "1:脚本执行", "stageTpName": "script-exec", "stageAttrs": { "scriptContent": "echo \"${getCurrentTime('yyyy-MM-dd HH:mm:ss')}\"", "scriptUrl": "", "stageTpName": "script-exec", "deployFailStrategy": "", "stageTpId": "1000", "exportGlobal": "", "resources": "", "stageIndex": 0, "stageName": "1:脚本执行", "parallel": "", "disable": "", "scriptType": "groovy", "failedContinue": "", "userDir": "/opt/idc/apps/", "evalAttrs": "false", "scriptParams": "{ }", "nodeLabel": "all", "stageId": "5681" }, "beginTime": 1573644061438, "nodeName": [ "WorkNode .135", "WorkNode134", "WorkNodeMobild140", "WorkNodeXian12", "WorkNodeXian13" ], "result": "success", "endTime": 1573644061800, "duration": 362 } ], "result": "success", "endTime": 1573644069045, "duration": 7615 }
3)stageAttrs:Map类型的变量,当前任务的属性信息,同样可以通过日志中json串,看到里面的内容示例如下:
{ "scriptContent" : "echo \"${getCurrentTime('yyyy-MM-dd HH:mm:ss')}\"", "scriptUrl" : "", "stageTpName" : "script-exec", "deployFailStrategy" : "", "stageTpId" : "1000", "exportGlobal" : "", "resources" : "", "stageIndex" : 0, "stageName" : "1:脚本执行", "parallel" : "", "disable" : "", "scriptType" : "groovy", "failedContinue" : "", "userDir" : "/opt/idc/apps/", "evalAttrs" : "false", "scriptParams" : "{ }", "nodeLabel" : "all", "stageId" : "5681" }
4)stageResult:Map类型的变量,当前任务的结果信息,同样可以通过日志中json串,看到里面的内容示例如下:
{ "stageIndex" : 0, "stageName" : "1:脚本执行", "stageTpName" : "script-exec", "stageAttrs" : { "scriptContent" : "echo \"${getCurrentTime('yyyy-MM-dd HH:mm:ss')}\"", "scriptUrl" : "", "stageTpName" : "script-exec", "deployFailStrategy" : "", "stageTpId" : "1000", "exportGlobal" : "", "resources" : "", "stageIndex" : 0, "stageName" : "1:脚本执行", "parallel" : "", "disable" : "", "scriptType" : "groovy", "failedContinue" : "", "userDir" : "/opt/idc/apps/", "evalAttrs" : "false", "scriptParams" : "{ }", "nodeLabel" : "all", "stageId" : "5681" }, "beginTime" : 1573644061438, "nodeName" : "WorkNode135", "result" : "success", "endTime" : 1573644061800, "duration" : 362 }
5)pipeline:当前流水线,可以调用提供的系统方法
# 2、使用方式示例:
${pipelineContext.buildNumber},${pipelineResult.stageResults.get(0).result},${stageAttrs.attrDefName},${stageResult.result},${pipeline.getCurrentTime('yyyyMMddHHmm')}
# 3、变量时机:
在jenkins上,任务执行前
# 四、global区数据
# 1、pipelineContext.global或者globalData:
Map类型的变量
# 2、使用方式:
${globalData.varName},groovy脚本中可以直接使用
# 3、作用:
串联一个流水线,串联整个发布流水线。可以在前面赋值,后面使用。
# 4、内置的任务中有一些默认会回填到这个数据区:
1)nexus上传介质任务:pipelineContext.global.nexusArtifactUrl = stageResult.artifactUrl;后续任务可以直接用${pipelineContext.global.nexusArtifactUrl}这种方式使用上传的介质URL。
2)代码打Tag任务:pipelineContext.global.codeRepositoryTagName = stageResult.tagName;后续任务可以直接用${pipelineContext.global.codeRepositoryTagName}这种方式使用打的Tag号。
# 五、groovy脚本
# 1、脚本执行任务
增加了一种脚本类型groovy脚本,只能在jenkins上运行,不能在远程。
groovy脚本片段,使用系统变量和方法都可以。示例:
pipelineContext.global.testVar = pipelineResult.stageResults.get(stageAttrs.stageIndex - 1).result echo "$pipelineContext.global.testVar"
# demowar构建定义示例
本文以demowar为例,展示代码拉取,源码构建打包,上传到介质库。
需要事先在平台配置》服务集成中配置好需要的第三方服务。
新建构建定义
编排原子任务
添加清理工作空间原子任务,保证目标工作空间不存在残留文件干扰 拉取demowar代码 配置maven编译参数,如图配置将会生成bom.xml物料清单文件到target目录下 勾选Junit和Jacoco测试,前提是代码库中pom文件添加了对应的依赖,构建执行结束可以在构建历史》单元测试中查看单元测试报告 发布到nexus介质库 执行sonarqube代码扫描,可以自行配置sonar配置文件内容,不配置将读取目标路径文件,构建执行结束可以在构建历史》质量中查看代码质量报告 执行DependencyTrack介质扫描,bom文件有maven构建原子任务生成,也可以代码库中包含,然后在此指定文件位置。构建执行结束可以在构建历史》安全合规信息中查看物料清单质量 发布介质到artifactory介质库 执行xray安全合规扫描,构建执行结束可以在构建历史》安全报告中查看介质质量执行构建定义
测试构建定义时推荐高级中选择引擎,将EveryNewJob和AutoDeleteJob参数置为false,便于在jenkins中查看日志和文件。
点击执行执行构建按钮执行构建定义 点击执行执行构建按钮执行构建定义 等待构建定义执行完成 执行完成后点击对应buildNo,查看详细信息 查看构建定义概要 查看单元测试报告 查看介质 查看安全报告 查看安全合规报告