# 说明

本章主要用于 DevOps 的项目下构建管理的说明。


# 构建定义配置


# 触发策略

构建触发策略分为两大类,代码触发策略和定时触发策略。

# 代码触发策略

代码触发策略可以细分为代码提交触发、TAG创建触发和merge请求触发。

使用代码触发策略的前提是在代码库配置了触发的webhook。

  1. 代码提交触发
    适用场景:代码提交后更新介质或更新测试环境等场景

  2. TAG创建触发
    适用场景:代码库创建了特定标签后同步构建介质存入介质库等场景

  3. merge请求触发
    适用场景:合并代码分支后,自动构建部署环境等场景

# 定时触发策略

定时触发策略可以细分为周期策略触发、固定间隔时间触发以及延时构建触发。

周期策略和固定时间间隔策略配置由起止时间参数,配置则在时间范围内触发执行,不配置则会永久执行。

  1. 周期策略触发
    适用场景:环境的日构建等

  2. 固定时间间隔触发
    适用场景:每小时的数据同步等

  3. 延时构建触发
    适用场景:指定时间的单次触发场景,如凌晨触发一次更新环境等


# 变量配置

可以通过自定义变量,在执行构建时查看或更新指定参数,定义变量后,可在构建任务中使用${变量名}进行变量引用。

  1. 变量配置
    位置:构建定义点击编辑配置 变量table页面
    类型:预设了多种类型适用不同场景,如基础类型:常量、密码、文本等可用于更新文件配置内容;枚举类型:环境类型等可用于数据范围限定,数据显示;以及项目数据:项目,代码库,项目版本号等用于引用项目参数等
    是否作为入参:勾选即可在构建时页面更新变量,为否则仅供查看

  2. 变量使用
    定义变量后,可在构建任务中使用${变量名}进行变量引用。 点击构建时,可以更新作为入参的变量

  3. 变量查看
    构建参数table页面可以查看本次构建的参数
    位置:构建定义执行数据 构建历史》构建参数


# 任务编排

  1. 任务编排
    构建定义新建后需要新增和编辑原子任务以满足场景需求
    位置:构建定义编辑配置 构建任务 点击任务列表的加号可以添加原子任务 点击任务列表原子任务的操作按钮可以复制,上移,下移和删除原子任务

  2. 原子任务高级配置
    禁用:设置为true则跳过此步骤
    超时时间(秒):该步骤执行时间超过设置时间则失败
    运行模式:*流水线任务运行模式,有串行,并行,异步三种模式
    节点:指定引擎中的执行节点,配置为节点名称或label
    容器:指定Pod Template中的容器名称
    属性导出:把属性导出到global数据区,{属性名}|{变量名},多个逗号分隔 前置脚本:任务执行前置脚本
    后置脚本:任务执行后置脚本
    异常脚本:任务执行异常脚本
    定义脚本:任务相关的定义脚本 失败后继续运行:该任务失败任然执行后续任务,不会中断
    失败回调:任务失败后调用其它构建定义
    循环执行表达式:循环执行表达式值为true时循环执行
    最大循环执行次数:循环执行表达式不为空时有用,默认100
    循环执行间隔(秒):循环执行间隔
    循环对象:循环对象必须是一个数组、collection或者Map类型的值,可以使用${cycleItem}获取循环单个元素


# 通知配置

配置通知需要提前配置邮件服务器和确认构建通知模板

  1. 通知配置
    构建定义执行完成后的统一邮件通知配置,单个任务通知可以写入上文高级配置脚本里的
    位置:构建定义编辑配置 通知

  2. 邮件服务器配置

  3. 构建通知模板配置


# 高级配置

  1. 回调配置
    构建定义成功或失败时可以通过回调执行的其他构建定义,也可以配置groovy脚本

  2. 引擎配置
    引擎: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、系统内置变量

  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为例,展示代码拉取,源码构建打包,上传到介质库。
需要事先在平台配置》服务集成中配置好需要的第三方服务。

  1. 新建构建定义

  2. 编排原子任务
    添加清理工作空间原子任务,保证目标工作空间不存在残留文件干扰 拉取demowar代码 配置maven编译参数,如图配置将会生成bom.xml物料清单文件到target目录下 勾选Junit和Jacoco测试,前提是代码库中pom文件添加了对应的依赖,构建执行结束可以在构建历史》单元测试中查看单元测试报告 发布到nexus介质库 执行sonarqube代码扫描,可以自行配置sonar配置文件内容,不配置将读取目标路径文件,构建执行结束可以在构建历史》质量中查看代码质量报告 执行DependencyTrack介质扫描,bom文件有maven构建原子任务生成,也可以代码库中包含,然后在此指定文件位置。构建执行结束可以在构建历史》安全合规信息中查看物料清单质量 发布介质到artifactory介质库 执行xray安全合规扫描,构建执行结束可以在构建历史》安全报告中查看介质质量

  3. 执行构建定义
    测试构建定义时推荐高级中选择引擎,将EveryNewJob和AutoDeleteJob参数置为false,便于在jenkins中查看日志和文件。
    点击执行执行构建按钮执行构建定义 点击执行执行构建按钮执行构建定义 等待构建定义执行完成 执行完成后点击对应buildNo,查看详细信息 查看构建定义概要 查看单元测试报告 查看介质 查看安全报告 查看安全合规报告


上次更新: 2023/4/12上午11:26:39