我有一个Jenkinsfile
,看起来像这样:
static def randomUser() {
final def POOL = ["a".."z"].flatten()
final Random rand = new Random(System.currentTimeMillis())
return (0..5).collect { POOL[rand.nextInt(POOL.size())] }.join("")
}
pipeline {
agent any
environment {
//CREATOR = sh(script: "randomUser()", returnStdout: true)
CREATOR = "fixed-for-now"
...
}
stages {
...
stage("Terraform Plan") {
when { not { branch "master" } }
steps {
sh "terraform plan -out=plan.out -var creator=${CREATOR} -var-file=env.tfvars "
}
}
...
stage("Terraform Destroy") {
when { not { branch "master" } }
steps {
sh "terraform destroy -auto-approve -var creator=${CREATOR} -var-file=env.tfvars "
}
}
...
}
我的问题是,我不在randomUser
块内时无法调用environment
。我每次都需要将CREATOR
变量作为随机字符串。我希望将CREATOR
作为全局环境变量,因为它将在许多stage
中使用。
有没有办法实现(或解决)这个问题?
答案 0 :(得分:1)
您可以通过删除环境块并在管道块之前定义全局变量CREATOR
来实现此目的
def CREATOR
pipeline {
agent any
stages {
stage('Initialize the variables') {
steps{
script{
CREATOR = randomUser()
}
}
}
...
答案 1 :(得分:1)
鉴于您的特定用例,最好将CREATOR
变量用作参数而不是环境变量,并为其分配defaultValue
作为randomUser
的返回值方法。
pipeline {
agent any
parameters {
string(name: 'CREATOR', defaultValue: sh(script: "randomUser()", returnStdout: true))
}
...
}
然后您可以像这样在管道中使用它:
stage("Terraform Plan") {
when { not { branch "master" } }
steps {
sh "terraform plan -out=plan.out -var creator=${params.CREATOR} -var-file=env.tfvars "
}
}
通过这种方式,您为defaultValue
分配了正确且有用的CREATOR
,但是可以在必要时按管道覆盖它。