【发布时间】: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