2017-10-15 433 views
0

如何从一个阶段中读取YAML文件中的数据并在另一个阶段或阶段之外使用它?Jenkins管道从yaml读取

pipeline { 
    agent any 
    environment { 
    MY_ENV_VAR1 = 'VALUE1' 
    } 
    parameters { 
    string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: 'Environment to deploy on') 
    booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: 'Debug the build') 
    } 
    stages { 
    stage('Stage1') { 
     steps { 
     script { 
      def datas = readYaml file: 'release.yml' 
      echo "Got version as ${datas.version} " 
     } 
     echo "Deploying to ${params.DEPLOY_ENV} with debug=${params.DEBUG_BUILD}" 
     } 
    } 
    stage('Stage 2') { 
     steps { 
     sh 'run.sh datas.version' 
     } 
    } 
    } 
} 

我想访问$ {} datas.version里面的Stage 2步骤,在Stage 1是牵强。

我想保持我的管道定义尽可能的声明。 如果我正确阅读docs,只能在舞台中添加脚本部分。我在全球管道级尝试了这一点,但得到了错误Undefined section "script" at line 10

我说只是datas = readYaml file: 'release.yml'在管道的水平,但得到一个错误说Not a valid section definition: "datas = readYaml file: 'release.yml'". Some extra configuration is required line 10, column 3.

什么是正确的方法来一次读取该文件,然后使用在任何阶段中读取数据的?

回答

1

看来我需要一个围绕readYaml代码的node部分。然后我可以在所有阶段访问${datas.version}

node { 
    datas = readYaml file: 'release.yml' 
} 
pipeline { 

... 
} 

这是被跟踪JENKINS-40167

1

这只是一个范围问题。如果您在脚本块中声明变量(datas),则它只存在于该块的范围内。

有两种方法可以解决这个问题。通过在管道之外声明变量,你可以明确地声明变量“全局”(并非真正的全局,Groovy术语,据我了解)。或者用管道,如果你没有在脚本中声明一个变量,但只是使用它,它会被创建为一个“全局”变量。

+0

我更新了我的发现在管段定义'readYaml'一部分,但它似乎是一个插件不喜欢的问题。 – Neo

+0

不喜欢什么?我给的语法与插件无关。这是基本的常规变量范围。 –

+0

Groovy代码可能很好,但问题是管道无效。 – Neo