如何解决Jenkins管道中条件表达式中的预期字符串文字 解决方案
我正在使用?:
来确定Jenkins共享库groovy脚本的构建代理,如下所示:
def call(String type,Map map) {
if (type == "gradle") {
pipeline {
agent "${map.agent == null}" ? "any" : "${map.agent}"
}
}
}
但是它给了我以下错误:
org.jenkinsci.plugins.workflow.cps.CpsCompilationErrorsException: startup failed:
/Users/dabaidabai/.jenkins/jobs/soa-robot/builds/154/libs/pipeline-shared-library/vars/ci.groovy: 6: Expected string literal @ line 6,column 42.
agent "${map.agent == null}" ? "any" :
^
/Users/dabaidabai/.jenkins/jobs/soa-robot/builds/154/libs/pipeline-shared-library/vars/ci.groovy: 6: Only "agent none","agent any" or "agent {...}" are allowed. @ line 6,column 13.
agent "${map.agent == null}" ? "any" : "${map.agent}"
^
/Users/dabaidabai/.jenkins/jobs/soa-robot/builds/154/libs/pipeline-shared-library/vars/ci.groovy: 6: No agent type specified. Must be one of [any,docker,dockerfile,label,none] @ line 6,column 13.
agent "${map.agent == null}" ? "any" : "${map.agent}"
我在做什么错了?
解决方法
不要在任何地方使用字符串替换 :
agent(map.agent==null ? "any" : map.agent)
或者变得古怪:
agent(map.agent?:"any")
实际问题很可能是“三元运算符”与“ parens可能是可选的”规则作斗争。
,在执行管道代码之前运行的管道语法验证器抛出此错误。您看到此错误的原因如下:
Only "agent none","agent any" or "agent {...}" are allowed. @ line 6,column 13.
这是label
部分的约束。这意味着以下值是有效的:
-
agent any
-
agent none
-
agent "constant string value here"
-
agent { ... }
通过类似以下内容时:
-
agent "${map.agent ?: 'any'}
-
agent(map.agent ?: 'any')
您之所以得到Expected string literal
,是因为该位置不允许使用任何形式的表达式,包括任何形式的内插GStrings
。
解决方案
但是,有一种方法可以动态定义管道代理。您所需要做的就是使用label
设置为表达式或空字符串(an equivalent of agent any
in this case的闭包)。
pipeline {
agent {
label map.agent ?: ''
}
stages {
...
}
}
label
部分允许您使用任何表达式,因此map.agent
在这里是有效的构造。只需记住使用空字符串而不是"any"
-否则Jenkins将搜索标记为“ any”的节点。
在我看来agent
是一个带有字符串参数的方法,您的代码编写方式是模棱两可的。尝试用括号包围参数表达式:
agent(map.agent == null ? "any" : "${map.agent}")
我删除了map.agent == null
周围的引号,因为它们似乎无关紧要。
还可以使用常规的“ elvis运算符”(:?
)将其重写为:
agent(map.agent ?: "any")
从本质上讲,这意味着“如果有值,请使用map.agent,否则使用'any'”。在这种情况下,使用常规事实定义“如果它有一个值”,其中空字符串和null都表示“无值”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。