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

时间:2017-10-27 03:20:37

标签: 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}')'
        echo $AMI_ID
      }

stage ('ft-ami-extraction')
{
      build job: 'crspng-CCPDev-ami-extraction'
}

但最终得到如下的异常:

  

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

即使在互联网上尝试了很多解决方案之后也没有运气,groovy中的shell脚本就是挑战。语法有什么问题吗?

1 个答案:

答案 0 :(得分:2)

是的,语法很糟糕。主要是我看到的问题与你引用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_ID并不存在。它只存在于shell中。此外,$ AMD_ID不作为有效的groovy变量存在。我不完全确定你试图用这个echo语句做什么,但是如果它真的运行了,它就不会按照你的预期去做。