从构建参数在Jenkins管道阶段设置环境变量

时间:2020-05-29 13:14:01

标签: jenkins jenkins-pipeline jenkins-declarative-pipeline

我想为我的Jenkins管道配置一个环境变量,但要根据构建的输入参数动态地进行配置。我正在尝试配置管道以为 kubectl 命令设置KUBECONFIG环境变量。

我的管道如下(略有变化):

pipeline {

    parameters {
        choice(name: 'CLUSTER_NAME', choices: 'cluster1/cluster2')
    }

    stages {
        // Parallel stages since only one environment variable should be set, based on input
        stage ('Set environment variable') {
            parallel {
                stage ('Set cluster1') {
                    when {
                        expression {
                            params.CLUSTER_NAME == "cluster1"
                        }
                    }
                    environment {
                        KUBECONFIG = "~/kubeconf/cluster1.conf"
                    }
                    steps {
                        echo "Using KUBECONFIG: ${env.KUBECONFIG}"
                    }
                }

                stage ('Set cluster2') {
                    when {
                        expression {
                            params.CLUSTER_NAME == "cluster2"
                        }
                    }
                    environment {
                        KUBECONFIG = "~/kubeconf/cluster2.conf"
                    }
                    steps {
                        echo "Using KUBECONFIG: ${env.KUBECONFIG}"
                    }
                }
            }
        }

        stage ('Test env') {
            steps {
                sh "cat ${env.KUBECONFIG}"
            }
        }
    }
}

但是,虽然我设置环境变量的阶段可以打印它,但是一旦我移到另一个阶段,我只会得到null。

是否存在一些在阶段之间共享环境变量的方法?由于我想使用默认的KUBECONFIG命令(而不在我的 kubectl 命令中指定文件/上下文),因此找到一种动态设置env变量的方法会容易得多。

我看过提到的EnvInject插件,但是无法使其在管道中正常工作,并且在文档中苦苦挣扎。

1 个答案:

答案 0 :(得分:0)

我猜想,在environment{}中,您仅在运行阶段设置了环境变量-它不会影响管道本身的环境。如下设置环境变量以影响主上下文。为我工作。

pipeline {

    agent any

    parameters {
        choice(name: 'CLUSTER_NAME', choices: 'cluster1\ncluster2')
    }

    stages {
        // Parallel stages since only one environment variable should be set, based on input
        stage ('Set environment variable') {
            parallel {
                stage ('Set cluster1') {
                    when {
                        expression {
                            params.CLUSTER_NAME == "cluster1"
                        }
                    }
                    steps {
                        script{
                            env.KUBECONFIG = "~/kubeconf/cluster1.conf"
                            echo "Using KUBECONFIG: ${env.KUBECONFIG}"    
                        }
                    }
                }

                stage ('Set cluster2') {
                    when {
                        expression {
                            params.CLUSTER_NAME == "cluster2"
                        }
                    }
                    steps {
                        script{
                            env.KUBECONFIG = "~/kubeconf/cluster2.conf"
                            echo "Using KUBECONFIG: ${env.KUBECONFIG}"
                        }
                    }
                }
            }
        }
        stage ('Test env') {
            steps {
                sh "cat ${env.KUBECONFIG}"
            }
        }
    }
}