4.4_流水线任务属性高级赋值参考
流水线任务的属性,除了一般的下拉框,直接填值外,还有一些高级方式进行赋值,为了灵活性,系统提供了一下几种高级方式:
一、流水线任务属性计算规则如下
1、生成流水线脚本的时候,会使用流水线的变量定义来替换属性值(这种方式${var})含有同名的变量
2、流水线任务执行开始时,除了脚本执行任务能设置是否计算属性值外,其他任务均默认使用pipeline,pipelineContext,pipelineResult,stageAttrs,stageResult进行属性值计算(不只是值替换,还可以执行方法)。
也就是使用了类似${pipeline.。。。},或者${pipelineContext.。。。},或者${pipelineResult.。。。},或者${stageAttrs.。。。},或者${stageResult.。。。}
二、变量赋值
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:
Map类型的变量
2、使用方式:
${pipelineContext.global.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 = pipelineResultt.stageResults.get(stageAttrs.stageIndex - 1).result
echo "$pipelineContext.global.testVar"