Jenkins管道条件环境变量

6

我在声明性流水线的environmental指令部分有一组静态环境变量。这些值可用于流水线中的每个阶段。 我希望这些值根据任意条件更改。 有没有办法做到这一点?

pipeline {
   agent any
   environment {
     if ${params.condition} {
     var1 = '123'
     var2 = abc
    } else {
     var1 = '456'
     var2 = def
     }
   }
   stages {
     stage('One') {
      steps {
        script {
        ...
        echo env.var1
        echo env.var2            
        ...
     }
    }
   }
  }
  stag('Two'){
   steps {
        script {
        ...
        echo env.var1
        echo env.var2
        ...
     }
   }
 }
4个回答

10

我在寻找相关信息时发现了一个好的答案,它来自于另外一个问题页面

基本上就是使用三元条件运算符

pipeline {
    agent any
    environment {
        var1 = "${params.condition == true ? "123" : "456"}"
        var2 = "${params.condition == true ? abc : def}"
    }
}

注意:请记住,在您编写问题的方式(我回答的方式)中,数字是字符串,字母是变量。


8

我建议您创建一个名为“环境”(Environment)的阶段,并根据您想要的条件声明变量,例如下面的示例:

pipeline {
   agent any
   environment {
     // Declare variables which will remain same throughout the build
   }
   stages {
     stage('Environment') {
                agent  { node { label 'master' } }
                steps {
                    script {
                       //Write condition for the variables which need to change
                       if ${params.condition} {
                                 env.var1 = '123'
                                 env.var2 = abc
                                } else {
                                 env.var1 = '456'
                                 env.var2 = def
                                 }
                        sh "printenv"
                    }
                }
            }
         stage('One') {
          steps {
            script {
            ...
            echo env.var1
            echo env.var2            
            ...
         }
        }
       }
      stage('Two'){
       steps {
            script {
            ...
            echo env.var1
            echo env.var2
            ...
         }
       }
    }
    }
}

没错,你实际上可以在一个阶段内设置环境变量,这些变量将在其他阶段中可用。谢谢。 - SSF
你能给这个问题点个赞吗?虽然有其他类似的问题,但是没有一个得到正确的答案。 - SSF
1
是的,这些变量将对所有阶段都可用。 - user_9090
当在共享库中使用时,我会得到一个异常:vars/basePipeline.groovy: 42: 期望'(', 找到'$' @ line 42, column 28. if ${env.ENABLE_CONSOLE} { - schwart

1

使用地图,您可以获得更高级别的灵活性:

stage("set_env_vars") {
    steps {
        script {
            def MY_MAP1 = [A: "123", B: "456", C: "789"]
            def MY_MAP2 = [A: "abc", B: "def", C: "ghi"]

            env.var1 = MY_MAP1."${env.switching_var}"
            env.var2 = MY_MAP2."${env.switching_var}"

       }
    }
}

这样做可以提供更多选择。

1
假设我们希望在下游作业从上游作业调用时使用可选参数,并在下游作业自身调用时使用默认参数。但出于某些原因,我们不希望在下游作业中带有默认值的“holder”参数。这可以通过Groovy函数来实现:
上游Jenkinsfile - 参数CREDENTIALS_ID被传递到下游
pipeline {
    stage {
        steps {
            build job: "my_downsteam_job_name",
            parameters [string(name: 'CREDENTIALS_ID', value: 'other_credentials_id')]
        }
    }
}
下游Jenkinsfile - 如果未从上游传递CREDENTIALS_ID参数,则函数返回默认值
def getCredentialsId() {
    if(params.CREDENTIALS_ID) {
        return params.CREDENTIALS_ID;
    } else {
        return "default_credentials_id";
    }
}
pipeline {
    environment{
        TEST_PASSWORD = credentials("${getCredentialsId()}")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接