4.4_流水线任务属性高级赋值参考

    流水线任务的属性,除了一般的下拉框,直接填值外,还有一些高级方式进行赋值,为了灵活性,系统提供了一下几种高级方式:

一、流水线任务属性计算规则如下

  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"

results matching ""

    No results matching ""