首页 > 解决方案 > Jenkinsfile groovy,设置仅评估一次的全局变量,并从第一个 var 创建另一个变量

问题描述

我有这个代码:

#!groovy
pipeline {
    agent any
    environment {
      def SUPER_VAR = sh(returnStdout: true, script: """openssl rand -base64 12""").trim()
      SUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
      SUPER_DUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
    }
    stages {
        stage("initialise") {
            steps {
              script {
                    sh "echo SUPER_VAR \${SUB_VAR}"
                    sh "echo SUPER_VALUE \${SUPER_VALUE}"
                    sh "echo SUPER_DUPER_VALUE \${SUPER_DUPER_VALUE}"
                    sh "env"
              }
            }
        }
    }
}

我想要的输出是,每次我调用/创建一个新变量时,值都是相同的:

[Pipeline] { (initialise)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ echo SUPER_VAR
SUPER_VAR
[Pipeline] sh
+ echo SUPER_VALUE FSDYe8VNL3VTvASj
SUPER_VALUE FSDYe8VNL3VTvASj
[Pipeline] sh
+ echo SUPER_DUPER_VALUE FSDYe8VNL3VTvASj
SUPER_DUPER_VALUE FSDYe8VNL3VTvASj
[Pipeline] sh

詹金斯发生的事情是这样的:

[Pipeline] { (initialise)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ echo SUPER_VAR
SUPER_VAR
[Pipeline] sh
+ echo SUPER_VALUE FSDYe8VNL3VTvASj
SUPER_VALUE FSDYe8VNL3VTvASj
[Pipeline] sh
+ echo SUPER_DUPER_VALUE NSmVwW9xz6IPG5AO
SUPER_DUPER_VALUE NSmVwW9xz6IPG5AO
[Pipeline] sh

每次我创建一个var基于SUPER_VAR它的脚本似乎再次运行,我得到不同的输出。

如何将脚本的输出注册到全局变量中,以便以后可以用于全局创建新变量?

标签: bashjenkinsgroovyjenkins-pipeline

解决方案


这就是我使用的解决方案,我必须在每个阶段定义变量,它看起来很脏,但它有效。

这样,初始值SUPER_VAR只会被评估一次,随后我们可以使用这些 var 的子元素。

我的用例,我不想使用更多的 jenkins 插件来获取 aws sts 假设。 SUPER_VAR调用 sts 假设并返回凭据,我针对它运行 jq,并获取一个在SUPER_VAR.

在每个阶段,我都运行 jq 来提取 aws 的凭据,以便 sts 假设工作。

#!groovy
pipeline {
    agent any
    environment {
      def SUPER_VAR = sh(returnStdout: true, script: """openssl rand -base64 12""").trim()

    }
    stages {
        stage("initialise") {
            environment {
                SUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
                SUPER_DUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
            }
            steps {
              script {
                    sh "echo SUPER_VAR \${SUB_VAR}"
                    sh "echo SUPER_VALUE \${SUPER_VALUE}"
                    sh "echo SUPER_DUPER_VALUE \${SUPER_DUPER_VALUE}"
                    sh "env"
              }
            }
        }
        stage("go again") {
            environment {
                SUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
                SUPER_DUPER_VALUE = sh(returnStdout: true, script: """echo ${SUPER_VAR}""").trim()
            }
            steps {
              script {
                    sh "echo SUPER_VAR \${SUB_VAR}"
                    sh "echo SUPER_VALUE \${SUPER_VALUE}"
                    sh "echo SUPER_DUPER_VALUE \${SUPER_DUPER_VALUE}"
                    sh "env"
              }
            }
        }
    }
}

推荐阅读