gpt4 book ai didi

groovy.lang.MissingMethodException : No signature of method: sh() is applicable for argument types while testing AWS CLI commands in Groovy

转载 作者:行者123 更新时间:2023-12-04 17:30:32 26 4
gpt4 key购买 nike

$ groovy --version
Groovy Version: 2.4.15 JVM: 1.8.0_171 Vendor: Oracle Corporation OS: Mac OS X

我想在 Groovy 中执行一些 AWS CLI 命令,当然最终在 Jenkinsfile 中运行在 Jenkins 中。

但对于原型(prototype)设计,我想在我的 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。

最佳答案

您将无法仅使用 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

我可以通过 http://localhost:8080 访问哪个引导 Jenkins在这个本地实例中,我能够在 Groovy Sandbox 中或通过设置脚本化管道来测试管道脚本。

替代方案:JenkinsPipelineUnit 测试库

如果你想对你的流水线脚本进行单元测试,你可以使用 JenkinsPipelineUnit库,它允许您对管道的流程进行单元测试。但是在这种情况下,您必须自己注册 sh方法,因为 BasePipelineTest类用 NOOP 模拟它:
helper.registerAllowedMethod("sh", [Map.class], null)

这意味着与 sh 的每次交互步骤被计算,但它不会触发 script: '' 定义的脚本属性(property)。

我想说的是设置你自己的本地 Jenkins 沙箱,你可以在其中使用 Jenkinsfile 脚本是最简单的开始方式。

关于groovy.lang.MissingMethodException : No signature of method: sh() is applicable for argument types while testing AWS CLI commands in Groovy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50721991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com