作为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脚本就是挑战。语法有什么问题吗?
答案 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语句做什么,但是如果它真的运行了,它就不会按照你的预期去做。