Передать значение переменной этапа в теле сообщения jenkins

Я пытаюсь передать значение переменной из одного этапа в тело почты Дженкинса. Но значение переменной не отражает.

Код работает, если я создаю еще один этап и вызываю переменную. Но не в notifyStatusChangeViaEmail блок метода

Ниже приведен пример кода.

def variable
pipeline {
agent { label 'master' }
options {
   timestamps()
   timeout(time: 1, unit: 'HOURS' )
}
  stages{
      stage('Variable'){
  steps {
    script{
  variable = "Hi, Build is successful"
      }
   }
  }
 }
}

def notifyStatusChangeViaEmail(prevBuild) {
def subject
def body

if (currentBuild.previousBuild != null) {
    switch (prevBuild.result) {
        case 'FAILURE':
            emailext attachLog: true, body: "${variable}", recipientProviders: [[$class: 'CulpritsRecipientProvider']], subject: 'Build Status : Build is back to Normal', to: 'sumith.waghmare@gmail.com';
            break

        case 'UNSTABLE':
            emailext attachLog: true, body: "${variable}", recipientProviders: [[$class: 'CulpritsRecipientProvider']], subject: 'Build Status : Build is back to Normal', to: 'sumith.waghmare@gmail.com';
            break

        case 'SUCCESS':
            emailext attachLog: true, body: "${variable}", recipientProviders: [[$class: 'CulpritsRecipientProvider']], subject: 'Build Status', to: 'sumith.waghmare@gmail.com';
            break
    }
}
}
0
0
1 194
1

Ответы 1

Проблема в том, что переменная не определена в области видимости функции (а эта почта объясняет, как объем функций работает в Groovy).

Чтобы решить проблему, которую вы видите, я бы либо сделал variable параметром notifyStatusChangeViaEmail, либо удалил оператор def variable, потому что это сделало бы variable глобальной переменной, и функция могла бы получить к ней доступ.

Примеры:

Делаем переменную параметром notifyStatusChangeViaEmail:

pipeline {
agent { label 'master' }
options {
   timestamps()
   timeout(time: 1, unit: 'HOURS' )
}
  stages {
    stage('Send Email') {
      steps {
        script {
          def emailBody = "Hi, Build is successful"

          // I assume that prevBuild is defined somewhere already

          notifyStatusChangeViaEmail(prevBuild, emailBody)
        }
      }
    }
  }
}

def notifyStatusChangeViaEmail(prevBuild, emailBody) {
  if (currentBuild.previousBuild != null) {
    switch (prevBuild.result) {
        case 'FAILURE':
            emailext attachLog: true, 
                     body: emailBody, 
                     recipientProviders: [[$class: 'CulpritsRecipientProvider']], 
                     subject: 'Build Status : Build is back to Normal', 
                     to: 'sumith.waghmare@gmail.com';
            break

      //...
    }
  }
}

Использование variable в качестве глобального:

// --> I deleted the "def variable" line <--


pipeline {
agent { label 'master' }
options {
   timestamps()
   timeout(time: 1, unit: 'HOURS' )
}
  stages {
    stage('Variable') {
      steps {
        script {
          // There is no "def" when you first assign a value to
          // `variable`, so it will become a global variable, 
          // which is a variable you can use anywhere in your file
          variable = "Hi, Build is successful"
        }
      }
    }
  }
}
def notifyStatusChangeViaEmail(prevBuild) {
if (currentBuild.previousBuild != null) {
    switch (prevBuild.result) {
        case 'FAILURE':
            emailext attachLog: true, body: variable, recipientProviders: [[$class: 'CulpritsRecipientProvider']], subject: 'Build Status : Build is back to Normal', to: 'sumith.waghmare@gmail.com';
            break

     //...
    }
  }
}

Использование переменной в качестве параметра:

Я не понял того, что ты сказал. Не могли бы вы прислать пример, относящийся к моей проблеме?

Sumith08 13.09.2018 22:39

Я добавил несколько примеров, надеюсь, они вам помогут!

Vasiliki Siakka 13.09.2018 22:53

Другие вопросы по теме