Конструктор не вызывается в общих библиотеках Jenkins - PullRequest
3 голосов
/ 01 июля 2019

Я пытаюсь разработать общие библиотеки и имеет следующую структуру каталогов

  • src / com / mycomapny
    • MyTest.groovy
  • vars
    • test.groovy
  • Jenkinsfile

my Jenkinsfile вызывает только метод, доступный в test.groovy с обязательным вводом.который импортирует MyTest и создает объект и вызывает конструктор, а затем фактический метод, который выполняет функциональные возможности, доступные в MyTest.groovy файле

Здесь класс конструктора никогда не вызывался из глобальных переменных / тестов.groovy

Я пытался вызывать класс и метод из groovy, он работает нормально, но когда я вызываю его из jenkinsfile, он не работает.Я не знаю, почему я не могу вызвать конструктор и чего мне не хватает.

Я поместил @ NonCPS в вышеупомянутый метод test.groovy, но все равно он не работает.

//MyTest.groovy
package com.mycompany

class MyTest implements Serializable {
    public _notification

    MyTest(Closure content) {
        notification = [:]
        content.resolveStrategy = Closure.DELEGATE_FIRST
        content.delegate = notification
        content()
        println("Entered Constructor")
        this._notification = notification
    }

}

//test.groovy
import com.mycopany.MyTest
def notify(Closure content) {
    println("This is line i am getting in the output but nothing after that")
    MyTest tester = new MyTest(content)
    println(tester._notification.colorcode)
} 

//Jenkinsfile
@library("MysharedLibrary@master") _
pipeline{
    stages {
         stage {
             steps {
                 test.notify {
                      buildno = 12
                      jobname = "Mytest"
                      colorcode = "Blue"
                 }
             }
         }
    }
}

здесь я просто хочу вызвать конструктор из файла jenkins и напечатать значение входного значения в моем файле vars / test.groovy.

EDIT1: когда я использую @NonCPS выше метода"def nofity" моя сборка проходит успешно, но я не получаю ничего, кроме оператора print в первой строке метода notify.

Если я не использую @NonCPS, я получаю следующее исключение

Error when executing always post condition:
com.cloudbees.groovy.cps.impl.CpsCallableInvocation

hudson.remoting.ProxyException:com.cloudbees.groovy.cps.impl.CpsCallableInvocation
Finished: FAILURE

1 Ответ

2 голосов
/ 01 июля 2019

Вы видите эту ошибку, потому что вы вызываете closure внутри конструктора. Вместо этого вы должны извлечь его в отдельный метод. Конструктор должен использоваться для инициализации объекта значениями, переданными во время инициализации. Например, обычной практикой является передача ссылки на объект WorkflowScript, чтобы вы могли использовать шаги конвейера, например echo.

Рассмотрим следующие изменения в коде вашей общей библиотеки:

SRC / COM / MyCompany / MyTest.groovy

package com.mycompany

class MyTest {
  final Map notification = [:]
  final Script script

  MyTest(Script script) {
    this.script = script
  }

  def notify(Closure content) {
    processContent(content)
    script.echo "Notification processed = ${notification}"
  }

  def processContent(Closure content) {
    content.resolveStrategy = Closure.DELEGATE_FIRST
    content.delegate = notification
    content()
  }
}

вары / test.groovy

import com.mycompany.MyTest
import groovy.transform.Field

@Field
final MyTest tester = new MyTest(this)

def notify(Closure content) {
    println("This is line i am getting in the output but nothing after that")
    tester.notify(content)
    println(tester.notification.colorcode)
}

Jenkinsfile

pipeline {
    agent any

    stages {
         stage("Test") {
             steps {
                 script {
                     test.notify {
                          buildno = 12
                          jobname = "Mytest"
                          colorcode = "Blue"
                     }
                 }
             }
         }
    }
}

Выход:

[Pipeline] Start of Pipeline
[Pipeline] node
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] script
[Pipeline] {
[Pipeline] echo
This is line i am getting in the output but nothing after that
[Pipeline] echo
Notification processed = [buildno:12, jobname:Mytest, colorcode:Blue]
[Pipeline] echo
Blue
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

Имейте в виду, что это всего лишь один из способов того, как вы можете реорганизовать код вашей разделяемой конвейерной библиотеки. Ваша главная цель должна состоять в том, чтобы переместить вызов замыкания из конструктора класса. Тебе решать, где его поставить, чтобы он работал лучше для тебя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...