在Jenkinsfile的环境块内调用Groovy方法

时间:2019-02-28 23:12:51

标签: jenkins jenkins-pipeline jenkins-groovy

我有一个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中使用。

有没有办法实现(或解决)这个问题?

2 个答案:

答案 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,但是可以在必要时按管道覆盖它。