2017-10-15 271 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