【问题标题】:Setting environment variable in Jenkins pipeline stage from build parameter从构建参数在 Jenkins 管道阶段设置环境变量
【发布时间】:2020-05-29 13:14:01
【问题描述】:

我想为我的 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 插件,但无法使其适用于管道,并且在文档方面遇到了困难。

【问题讨论】:

  • 您是否尝试过将environment 块设置为全局范围,并通过将参数映射中的值与environment { KUBECONFIG = "~/kubeconf/${params.CLUSTER_NAME}" } 进行插值来设置值?
  • 是的,它给出了语法错误。它不喜欢环境块中的 ${params.CLUSTER_NAME}。
  • 好的,env 映射在parameters 块中可用,但params 映射在environment 块中不可用。这对于声明式 DSL 加载是有意义的,但值得一试。 env.KUBECONFIG = "~/kubeconf/${params.CLUSTER_NAME}" 在全局范围内,或者至少在允许全局可访问性的范围内怎么样?

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


【解决方案1】:

我猜你使用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}"
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2017-08-09
    • 2021-05-27
    • 2019-06-10
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多