t.me/atinfo_chat Telegram группа по автоматизации тестирования

Jenkins - ошибка при настройке отправки результатов на почту

Теги: #<Tag:0x00007f748ce03f78> #<Tag:0x00007f748ce03e60> #<Tag:0x00007f748ce03d70> #<Tag:0x00007f748ce03ca8> #<Tag:0x00007f748ce03b68> #<Tag:0x00007f748ce03a78>

Всем привет! Написал небольшой скрипт сборки проекта на pipeline groovy

node{
    
    def TESTING = true
    STATUS = "Успешно"
    
    /*if(!TESTING){
        STATUS = "Провал"
    }
    
    emailext attachmentsPattern: 'Test_Case.docx', body: "Тестирование IT-Phone ${BUILD_NUMBER} - Статус: ${STATUS} \n Отчёт: ${PROJECT_URL}${BUILD_NUMBER}/allure", subject: 'Тестирование IT-Phone ${BUILD_NUMBER}', to: 'bezpalko'*/
    
    stage("Актуализация тестов"){
        git credentialsId: 'c3f24cba-7b10-4199-a7a6-88bc830ee60e', url: 'sysadm@10.10.199.45:/home/sysadm/ITPhoneTesting.git'
    }
    try{
        stage("Тестирование"){
            sh '/var/jenkins_home/apache-maven-3.6.3/bin/mvn clean test'
        }
    }catch(e){
        TESTING=false
    }
    stage("Формирование отчёта"){
        allure includeProperties: false, jdk: '', results: [[path: 'target/allure-results']]
    }
    stage("Рассылка"){
        if(!TESTING){
            STATUS = "Провал"
        }
        echo "${STATUS}"
        emailext attachmentsPattern: 'Test_Case.docx', body: "Тестирование IT-Phone ${BUILD_NUMBER} - Статус: ${STATUS} \n Отчёт: ${PROJECT_URL}${BUILD_NUMBER}/allure", subject: 'Тестирование IT-Phone ${BUILD_NUMBER}', to: 'bezpalko' //Здесь у меня выдаёт ошибку
    }
    
    if(TESTING) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}

Проблема в следующем. Если в теле письма ставлю двойные кавычки

body: "Тестирование IT-Phone ${BUILD_NUMBER} - Статус: ${STATUS} \n Отчёт: ${PROJECT_URL}${BUILD_NUMBER}/allure"

, то jenkins выдает ошибку

groovy.lang.MissingPropertyException: No such property: PROJECT_URL for class: groovy.lang.Binding
	at groovy.lang.Binding.getVariable(Binding.java:63)
	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:270)
	at org.kohsuke.groovy.sandbox.impl.Checker$6.call(Checker.java:291)
	at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:295)
	at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:271)
	at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:271)
	at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29)
	at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
	at WorkflowScript.run(WorkflowScript:24)
	at ___cps.transform___(Native Method)
	at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74)
	at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
	at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
	at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
	at com.cloudbees.groovy.cps.Next.step(Next.java:83)
	at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
	at com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
	at org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
	at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
	at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:51)
	at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:185)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:370)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:93)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:282)
	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:270)
	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:67)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
	at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

Если ставлю одинарные кавычки, тогда переменная ${STATUS} не выводится, как надо. Как победить данную ошибку?

погуглите экранирование кавычек

Победить просто - указать правильную переменную.
Ваш же ошибка явно говорит о том, что указанной переменной нет.

Переменную я правильно указал, другой вопрос, почему в двойных кавычках ругается на эту переменную, а в одинарных нет

Где же вы её правильно указали? Вам там черным по белому написано, что такой переменной нет.

В двойных кавычках ругается, потому что в двойных кавычках переменная заменяется её значением.
А в одинарных не заменяется.

Попробуйте вместо PROJECT_URL использовать BUILD_URL

Что-то вроде этого: Отчёт: ${BUILD_URL}allure

Вообще, все полезные переменные для пайплайна можно найти по ссылке (укажите адрес своего дженкинса):
http://jenkins_server_address/pipeline-syntax/globals#env

Спасибо большое, помогло)