- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 Jenkins 创建一个共享库。
我尝试创建一个脚本来通过 Teams 发送通知,这是代码:
def call(String buildStatus = null, String webook) {
def status
def color
switch(buildStatus) {
case { null || "SUCCESS" }:
status = "Success"
color = "Green"
break
case "FAILED":
status = "Failed"
color = "Red"
break
default:
status = null
color = null
}
println(status + " " + color)
}
问题是,如果我尝试在我的管道中运行它,我会得到这个异常:
Error when executing always post condition:
CpsCallableInvocation{methodName=call, call=com.cloudbees.groovy.cps.impl.CpsClosureDef@1ba818f1, receiver=org.jenkinsci.plugins.workflow.cps.CpsClosure2@22438c5c, arguments=[SUCCESS]}
这是我正在测试的管道:
pipeline{
agent{
label 'linux'
}
stages{
stage('Build') {
steps{
...snip...
}
}
}
post {
always {
notifyTeams(currentBuild.result, "XXXXX")
}
}
}
我做错了什么?谢谢!
最佳答案
问题是由switch 语句中使用的闭包引起的。 Jenkins 将每个闭包转换为 CPS 转换的闭包,这与常规的 Groovy 闭包不同。在多个用例中,使用 CPS 转换的闭包会导致意外错误。我想这个用例还没有记录,最接近你的是 using closure inside the GString
one .
有两种方法可以解决。首先,您可以用常规值替换 switch 语句中的闭包,例如:
def call(String buildStatus = null, String webook) {
def status
def color
switch(buildStatus) {
case null:
status = "Success"
color = "Green"
break
case "SUCCESS":
status = "Success"
color = "Green"
break
case "FAILED":
status = "Failed"
color = "Red"
break
default:
status = null
color = null
}
println(status + " " + color)
}
或者,如果你想在 switch 语句中使用闭包,你需要将 switch
block 提取到一个单独的方法中,用 @NonCPS
注释。这是 groovy-cps
不转换此方法内的代码的说明。 (您可以使用 @NonCPS
注释 call
方法,但是,如果您打算在其中使用流水线步骤,它将无法工作。流水线步骤必须在cps 模式。)
def call(String buildStatus = null, String webook) {
def (status, color) = switchBuildStatusAndColor(buildStatus)
println(status + " " + color)
}
@NonCPS
private static switchBuildStatusAndColor(String buildStatus) {
switch (buildStatus) {
case { null || "SUCCESS" }:
return ["Success", "Green"]
case "FAILED":
return ["Failed", "Red"]
}
return [null, null]
}
关于Jenkins 共享库,CpsCallableInvocation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62210311/
我正在尝试为 Jenkins 创建一个共享库。 我尝试创建一个脚本来通过 Teams 发送通知,这是代码: def call(String buildStatus = null, String web
我通过 Jenkins 管道(共享库)运行此代码。 enum Components { service('name_api') Components(String componentName)
我是一名优秀的程序员,十分优秀!