Сценарий Jenkins с конвейером NoSuchMethodError: Такой метод DSL 'setLatestRevision' не найден среди шагов - PullRequest
0 голосов
/ 05 декабря 2018

Не могли бы вы помочь мне, где я ошибаюсь в этом коде?

Конвейерный скрипт ниже:

def executeShInEnvironment = { String shFunction, String parameters ->
    sh '. $SCRIPTS_DIR/build_functions.sh; ' + shFunction + " " + parameters
}

def setLatestRevision = { String parameters ->
    executeShInEnvironment('GET_LAST_REVISION', parameters)
}

def buildApp(svnRootUrl, propertiesDir, propertiesFileName) {
    def String fromRevisionPropertiesKey = "LAST_REVISION_FOR_02"
    def String toRevisionPropertiesKey = "CURRENT_SVN_REVISION"
    def String svnPath = svnRootUrl + "/svn_path"

    echo "Find latest SVN revision"
    withEnv(['SVN_URL=' + svnPath ]) {
        def shFunctionParameters = propertiesFileName + " " + toRevisionPropertiesKey
        setLatestRevision(shFunctionParameters)           
    }
}

def prepareRun(shellSvn, propertiesSvn) {
    stage 'Prepare run'
         .... do checkouts
}

node
{ 
    def workspace = pwd()
    def String shellSvn = "/shell"
    def String propertiesSvn = "/property_files"
    def String propertiesDir =  workspace + propertiesSvn
    def String scriptsDir = workspace + shellSvn
    def String svnRootUrl = "http://SVN_URL_goes_here"
    def String propertiesFileName = "main_delivery.properties"

    prepareRun(shellSvn, propertiesSvn)

    withCredentials(............... {
        withEnv(...........){
            buildApp(svnRootUrl, propertiesDir, propertiesFileName)
        }    
    }    
}

Почему скрипт говорит, что он не видит setLatestRevision метод?

java.lang.NoSuchMethodError: Не найден такой метод DSL 'setLatestRevision' среди шагов

Не работает определение метода

setLatestRevision = { String parameters ->

Метод работы

setLatestRevision(String parameters) {

Может кто-нибудь объяснить, почему так?

1 Ответ

0 голосов
/ 05 декабря 2018

В первом случае setLatestRevision - это переменная (замыкание):

setLatestRevision = { String parameters ->

Во втором случае это метод:

setLatestRevision(String parameters) {

Класс ScriptДокументация гласит (в последнем разделе 3.4 Переменные ), что:

, если переменная объявлена ​​как в первом примере [с определением типа], этолокальная переменная.Он будет объявлен в методе run, который сгенерирует компилятор, и не будет виден за пределами основного тела скрипта.В частности, такая переменная не будет видна в других методах скрипта

И еще: если переменная не объявлена, она переходит в привязку скрипта.Привязка видна из методов [...]

Поэтому удаление def из setLatestRevision исправляет ошибку:

def executeShInEnvironment = { String shFunction, String parameters ->
    sh '. $SCRIPTS_DIR/build_functions.sh; ' + shFunction + " " + parameters
}

setLatestRevision = { String parameters ->
    executeShInEnvironment('GET_LAST_REVISION', parameters)
}

def buildApp(svnRootUrl, propertiesDir, propertiesFileName) {
    def String fromRevisionPropertiesKey = "LAST_REVISION_FOR_02"
    def String toRevisionPropertiesKey = "CURRENT_SVN_REVISION"
    def String svnPath = svnRootUrl + "/svn_path"

    echo "Find latest SVN revision"
    withEnv(['SVN_URL=' + svnPath ]) {
        def shFunctionParameters = propertiesFileName + " " + toRevisionPropertiesKey
        setLatestRevision(shFunctionParameters)           
    }
}

def prepareRun(shellSvn, propertiesSvn) {
    stage 'Prepare run'
         .... do checkouts
}

node
{ 
    def workspace = pwd()
    def String shellSvn = "/shell"
    def String propertiesSvn = "/property_files"
    def String propertiesDir =  workspace + propertiesSvn
    def String scriptsDir = workspace + shellSvn
    def String svnRootUrl = "http://SVN_URL_goes_here"
    def String propertiesFileName = "main_delivery.properties"

    prepareRun(shellSvn, propertiesSvn)

    withCredentials(............... {
        withEnv(...........){
            buildApp(svnRootUrl, propertiesDir, propertiesFileName)
        }    
    }    
}
...