Jenkinsfile使用Map取值报错:NoSuchMethodError: 未找到DSL方法'$'
Jenkinsfile Map取值报错:NoSuchMethodError: No such DSL method '$' found among steps
问题场景
编写的Jenkinsfile脚本尝试从Map中读取配置值时触发报错,原脚本如下:
stage ('Set env') { steps { script { print "" + "---------------------------------------\n" + "GIT_AUTHOR : ${env.GIT_AUTHOR}\n" + "---------------------------------------" } } } stage ('Deploy to K8s') { steps { script { script { def currentUser = "${GIT_AUTHOR}" def user = ["${currentUser}" : "nameserverk8s-pit"] def userNamespace = "nameserverk8s-${user[${currentUser}]}" echo "${userNamespace}" } } } }
期望输出为nameserverk8s-pit,但实际报错:
NoSuchMethodError: No such DSL method '$' found among steps
错误原因
报错出现在user[${currentUser}]这一行:Groovy语法中,在Map的方括号索引里直接使用变量名即可,不需要额外用${}包裹。这里的${currentUser}被Jenkins误认为是一个DSL方法调用,从而触发"No such DSL method '$'"错误。
解决方案
方案1:已验证的可行代码
通过嵌套Map的方式规避了语法问题,代码如下:
def currentUser = "${GIT_AUTHOR}" def user = [users: [currentUser : 'nameserverk8s-pit']] def userNamespace = user['users'].currentUser echo "${userNamespace}"
方案2:更简洁的优化方案
直接修正原脚本中的语法错误,去掉Map索引里多余的${},同时简化变量定义:
def currentUser = env.GIT_AUTHOR // 无需用字符串包裹,直接引用环境变量 def user = [(currentUser): "nameserverk8s-pit"] // Groovy中动态key需要用()包裹 def userNamespace = "nameserverk8s-${user[currentUser]}" echo "${userNamespace}"
或者进一步简化为一行:
def currentUser = env.GIT_AUTHOR echo "nameserverk8s-${[(currentUser): "nameserverk8s-pit"][currentUser]}"
内容的提问来源于stack exchange,提问作者Slashlinux
相关产品推荐
相关产品推荐

