groovy.lang.MissingMethodException: Нет сигнатуры метода: sh () не применяется для типов аргументов при тестировании команд CLI AWS в Groovy. - PullRequest
0 голосов
/ 06 июня 2018
$ groovy --version
Groovy Version: 2.4.15 JVM: 1.8.0_171 Vendor: Oracle Corporation OS: Mac OS X

Я хочу выполнить некоторые команды CLI AWS в Groovy, в конечном итоге в Jenkinsfile, чтобы, конечно, запускать в Jenkins.

Но для создания прототипа я хочу закодировать его на своем Mac и выполнить какПростой Groovy сценарий.Итак, у меня есть, например.

#!/usr/bin/env groovy

def getEBSVolumes(awsRegion) {
  def regions
  if (awsRegion == "all") {
    regions = sh(returnStdout: true, script: """#!/usr/bin/env bash
                   aws ec2 describe-regions --output text|awk '{print \$3}'
                 """
                )
  }
  else {
    regions = awsRegion
  }
  echo "Regions: regions"
}

getEBSVolumes("all")

Когда я его выполняю, я получаю

$ ./x.groovy 
Caught: groovy.lang.MissingMethodException: No signature of method: x.sh() is applicable for argument types: (java.util.LinkedHashMap) values: [[returnStdout:true, script:#!/usr/bin/env bash
                   aws ec2 describe-regions --output text|awk '{print $3}'
                 ]]
Possible solutions: use([Ljava.lang.Object;), is(java.lang.Object), run(), run(), any(), each(groovy.lang.Closure)
groovy.lang.MissingMethodException: No signature of method: x.sh() is applicable for argument types: (java.util.LinkedHashMap) values: [[returnStdout:true, script:#!/usr/bin/env bash
                   aws ec2 describe-regions --output text|awk '{print $3}'
                 ]]
Possible solutions: use([Ljava.lang.Object;), is(java.lang.Object), run(), run(), any(), each(groovy.lang.Closure)
    at x.getEBSVolumes(x.groovy:9)
    at x$getEBSVolumes.callCurrent(Unknown Source)
    at x.run(x.groovy:20)

Может кто-нибудь объяснить, пожалуйста, загадочное сообщение об ошибке?Спасибо!

Обратите внимание, что код работает при выполнении в Jenkinsfile, поэтому я специально спросил о CLI Groovy.

Ответы [ 2 ]

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

Добавление к ответу @ Szymon-Stepniak - если у вас запущен экземпляр jenkins

  • Новый элемент
  • Тип: конвейер (может зависеть от Pipeline: Job /Конвейер: Groovy плагины)
  • настроить скрипт конвейера
0 голосов
/ 06 июня 2018

Вы не сможете запускать этот скрипт локально только с Groovy, потому что он не работает из-за отсутствия метода sh в вашем скрипте.Этот sh метод является шагом, предоставляемым библиотекой Jenkins Pipeline DSL - https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script

Я бы посоветовал вам запустить локальный Jenkins - самый простой способ сделать это - использовать существующий образ Docker.Я использую, например, следующий docker-compose.yml файл:

jenkins:
  image: jenkins:2.60.3-alpine
  container_name: jenkins
  ports:
    - 8080:8080
  volumes:
    - ./home:/var/jenkins_home

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

cd ~/workspace/jenkins

и я просто вызываю

docker-compose up -d

, который загружает Jenkins, к которым я могу получить доступ через http://localhost:8080 В этом локальном экземпляре я могу тестировать сценарии конвейера внутри Groovy Sandbox или путем настройки сценария конвейера.

Альтернатива: библиотека тестирования JenkinsPipelineUnit

Если вы хотите выполнить модульное тестирование сценариев конвейера, вы можете использовать библиотеку JenkinsPipelineUnit , которая позволяет проводить модульное тестирование потока конвейера.Однако в этом случае вам придется зарегистрировать свой собственный метод sh, потому что класс BasePipelineTest высмеивает его с помощью NOOP:

helper.registerAllowedMethod("sh", [Map.class], null)

Это означает, что каждое взаимодействие с шагом sh засчитывается, но ононе запускает сценарий, определенный с помощью свойства script: ''.

Я бы сказал, что создание собственной локальной изолированной программной среды Jenkins, в которой вы можете поиграться со сценариями Jenkinsfile, - самый простой способ начать работу.

...