Nano Hash - криптовалюты, майнинг, программирование

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: подпись метода отсутствует: применим java.util.LinkedHashMap.call ()

Я получаю сообщение об ошибке "Нет подписи" при вызове метода body () в моем Groovy-скрипте конвейера.

Я использовал общую библиотеку Jenkins для проекта конвейера. Я настроил общую библиотеку в моем локальном Jenkins. Когда я пытался использовать свою общую библиотеку, она вызывается правильно, но я не могу разрешить значения параметров, которые поступают в метод call() моей общей библиотеки.

Код My Share Library (myDeliveryPipeline.groovy)

def call(body) {
    println(body)

// evaluate the body block, and collect configuration into the object
    def pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()

    println (pipelineParams.BRANCH)
    println 'Map'
    println body
    println 'pipelineParams'
    println pipelineParams

    println 'Start pipeline steps'
   // our complete declarative pipeline can go in here

    pipeline {
        agent any

        // Stage checkout git
        stages {
            stage('checkout git') {
                steps{
                    git branch: 'master', url:'MY_GIT_HUB_URL'
                }
            }
        //checkout git ends

        // stage build
        stage('build') {
            steps{
                script{
                    if(isUnix()){
                            sh 'mvn clean package -Dmaven.test.skip=true'
                        }
                        else{
                            bat('mvn clean install -Dmaven.test.skip=true')
                        }
                    }
                }
            }
        // stage build ends

         // stage Test
         stage ('test') {
            steps{
                script{
                    if('yes' == 'yes'){
                        if(isUnix()){
                            parallel (
                                "unit tests": { sh 'mvn test' },
                                "integration tests": { sh 'mvn integration-test' }
                                )
                            }
                        else{
                            parallel (
                                "unit tests": { bat('mvn test')},
                                "integration tests": { bat('mvn integration-test')}
                                )
                            }
                        }
                    }
                }
            }
             // stage Test Ends
        }
        post {
            failure {
                mail to: '[email protected]', subject: 'Pipeline failed', body: "${env.BUILD_URL}"
            }
            success{
                println "SUCCESS"
            }
        }
    }
}

Мой файл Дженкинса

properties ([
        parameters([
            string(name: 'BRANCH', defaultValue: 'master', description: 'Branch to build'),
            choice(name: 'RUN_TEST', choices: ['yes', 'no'], description: 'Run test while build'),
            booleanParam(name: 'MAIL_TRIGGER', defaultValue: true, description: 'mail to be triggred'),
            string(name: 'EMAIL', defaultValue: '[email protected]', description: 'Mail to be notified')
        ])
   ])

@Library('my-pipeline-library') _

myDeliveryPipeline(BRANCH:params.BRANCH, RUN_TEST:params.RUN_TEST, MAIL_TRIGGER:params.MAIL_TRIGGER, EMAIL:params.EMAIL)

Журналы с моей работы

     > C:\Program Files\Git\bin\git.exe rev-list --no-walk 2fdeb821e0ecec40e53b2e0bdd6608840914422b # timeout=10
    [Pipeline] properties

    [Pipeline] echo

    {BRANCH=master, RUN_TEST=yes, MAIL_TRIGGER=true, [email protected]}


    [Pipeline] End of Pipeline
    hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: java.util.LinkedHashMap.call() is applicable for argument types: () values: []
    Possible solutions: wait(), any(), wait(long), any(groovy.lang.Closure), take(int), any(groovy.lang.Closure)
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
        at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:49)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
        at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
        at myDeliveryPipeline.call(C:\Program Files (x86)\Jenkins\jobs\TestJenkinsFile\builds\43\libs\my-pipeline-library\vars\myDeliveryPipeline.groovy:10)
        at WorkflowScript.run(WorkflowScript:14)
        at ___cps.transform___(Native Method)
        at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
        at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
        at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixName(FunctionCallBlock.java:77)
        at sun.reflect.GeneratedMethodAccessor255.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

Ответы:


1

В файле общей библиотеки vars/myDeliveryPipeline.groovy подпись call - call(<Closure>).

Однако я вижу, что вы называете это так, как оно есть call(<Map>).

Таким образом, назовите это:

myDeliveryPipeline {
  BRANCH=params.BRANCH
  RUN_TEST=params.RUN_TEST
  MAIL_TRIGGER=params.MAIL_TRIGGER
  EMAIL=params.EMAIL
}

Вместо: myDeliveryPipeline(BRANCH:params.BRANCH, RUN_TEST:params.RUN_TEST, MAIL_TRIGGER:params.MAIL_TRIGGER, EMAIL:params.EMAIL).

К настоящему времени подпись исправлена, но я вижу, что вы переопределяете ДЕЛЕГАЦИЮ закрытия (тела) от Jenkins до Map. Как следствие, params не определено.

Таким образом, предлагаю перегрузить call(<Closure>) call(<Map>, <Closure>).

def call(body) {
  call([:], body)
}

def call(pipelineParams, body) {
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()
    //...
}

К настоящему моменту звонок может быть:

myDeliveryPipeline(
 BRANCH:params.BRANCH,
 RUN_TEST:params.RUN_TEST,
 MAIL_TRIGGER:params.MAIL_TRIGGER,
 EMAIL:params.EMAIL
) {}

Не забывайте последний {}.

Вкратце:

  • Если вы хотите ввести переменные конвейера (например, params, ...), введите их в Map, используя сигнатуру myDeliveryPipeline(Map,Closure), даже если закрытие пусто.

  • Если вы не зависите от переменных конвейера, вы можете использовать Closure с помощью подписи myDeliveryPipeline(Closure)

21.04.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..