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

Call Groovy method inside Jenkinsfile's environment block

我有一个 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 "
      }
    }

    ...
}

我的问题是我无法在 environment 块内调用 randomUser。我每次都需要将 CREATOR 变量作为随机字符串。我更愿意将 CREATOR 作为全局环境变量,因为它将在许多 stage 中使用。

有没有办法实现(或解决方法)?

您可以通过删除环境块并在管道块

之前定义全局变量CREATOR来实现此目的
def CREATOR

pipeline {
    agent any

    stages {
        stage('Initialize the variables') {
            steps{
                script{
                    CREATOR = randomUser()
                }
            }
        }

        ...

鉴于您的具体用例,最好使用 CREATOR 变量作为参数而不是环境变量,并将其 defaultValue 分配为 return你的 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 "
  }
}

通过这种方式,您可以为 CREATOR 正确分配有用的 defaultValue,但可以在必要时按管道覆盖它。