Jenkins pipeline:java.lang.NoSuchMethodError:在groovy中执行shell脚本时,没有这样的DSL方法

Jenkins pipeline:java.lang.NoSuchMethodError:在groovy中执行shell脚本时,没有这样的DSL方法,shell,jenkins,groovy,jenkins-pipeline,Shell,Jenkins,Groovy,Jenkins Pipeline,作为groovy的新手,我尝试在groovy内部的Jenkins中执行shell脚本作为构建管道的一部分,如下所示: stage('AMI ID EXTRACTION') { sh 'AMI_ID=$(grep artifact_id /opt/repository/jenkins/workspace/crspng-CCPDev-ccp-ft-AMI/manifest.json | awk -F "\"" '{print $4}'| awk -F ":" '{print $2}'

作为groovy的新手,我尝试在groovy内部的Jenkins中执行shell脚本作为构建管道的一部分,如下所示:

stage('AMI ID EXTRACTION') {
        sh 'AMI_ID=$(grep artifact_id /opt/repository/jenkins/workspace/crspng-CCPDev-ccp-ft-AMI/manifest.json | awk -F "\"" '{print $4}'| awk -F ":" '{print $2}')'
        echo $AMI_ID
      }

stage ('ft-ami-extraction')
{
      build job: 'crspng-CCPDev-ami-extraction'
}
但最终得到的异常如下所示:

java.lang.NoSuchMethodError:没有这样的DSL方法'AMI_ID=$(grep 人工制品 /opt/repository/jenkins/workspace/crspng-CCPDev-ccp-ft-AMI/manifest.json |awk-F““”


即使在internet上尝试了许多解决方案,groovy中的shell脚本仍然是一个难题。语法有问题吗?

是的,语法不好。我看到的问题主要与您引用shell命令有关。这是无效的:

sh 'AMI_ID=$(grep artifact_id /opt/repository/jenkins/workspace/crspng-CCPDev-ccp-ft-AMI/manifest.json | awk -F "\"" '{print $4}'| awk -F ":" '{print $2}')'
您正在打破
{print$4}
的单引号字符串,这可能被解释为groovy闭包

我不确定我是否理解它为什么会给出错误,但我认为如果您可以通过三重单引用shell命令最容易地解决它:

sh '''AMI_ID=$(grep artifact_id /opt/repository/jenkins/workspace/crspng-CCPDev-ccp-ft-AMI/manifest.json | awk -F "\"" '{print $4}'| awk -F ":" '{print $2}')'''

不过,我也不确定下一个echo行是否会工作。首先,AMD\u ID在运行
echo
的地方不存在。它只存在于shell中。另外,$AMD\u ID也不作为有效的groovy变量存在。我不完全确定您试图对该echo语句执行什么操作,但如果它实际运行,则不是g我正在做你希望它做的事情。

echo本来是要打印AMI\u ID的,我已经更新了questionshell脚本,现在正在运行,但是得到了
语法错误:未终止的引号字符串
,可能有什么错?可能是因为:awk-F“\”应该只有一个"在\.之后,我仍然不认为
echo$AMI\u ID
会做你想做的事。$AMD\u ID没有在groovy中声明。它只是在shell中。我已经声明了groovy变量,并且能够获得AMI\u ID,谢谢你的帮助。对于那些遇到类似引用问题的人,可能会有所帮助。你可能需要添加\escape co在您的行中引用所有引号。考虑将整个管道命令放入shell脚本并从管道中运行它。