Вызов метода Groovy внутри блока среды Jenkinsfile - PullRequest
0 голосов
/ 01 марта 2019

У меня есть 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 голосов
/ 01 марта 2019

Учитывая ваш конкретный вариант использования, может быть лучше использовать переменную 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, но с возможностью переопределить его-трубопровод при необходимости.

0 голосов
/ 01 марта 2019

Этого можно добиться, удалив блок среды и определив глобальную переменную CREATOR перед блоком конвейера

def CREATOR

pipeline {
    agent any

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

        ...
...