+-
在Jenkins流水线阶段通过构建参数设置环境变量。

我想为我的Jenkins流水线配置一个环境变量,但是是基于动态的输入参数来构建的。我试图配置我的流水线,将KUBECONFIG环境变量设置为 kubectl 命令。

我的流水线如下(略有改动)。

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 插件提到的,但无法让它为管道工作,并且在文档中苦苦挣扎。

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}"
            }
        }
    }
}