gpt4 book ai didi

jenkins - println 在 "call"的 "vars/foo.groovy"方法中有效,但不在类中的方法中

转载 作者:行者123 更新时间:2023-12-04 05:11:46 26 4
gpt4 key购买 nike

我正在迭代构建 Jenkins 管道共享库,所以我的 Jenkinsfile 更简洁一些。

我正在使用以下页面作为指导:https://jenkins.io/doc/book/pipeline/shared-libraries/ .

我首先在单个文件中定义了几个方法,例如“vars/methodName.groovy ”,在代码中使用“call() ”方法。这工作正常,我特别注意到在 Jenkins 控制台输出中可以看到这些方法中的“println”调用。

然后我决定要在方法调用之间保存一些状态,所以我在“vars ”中添加了一个名为“uslutils.groovy ”的新文件,它以这样的开头(减去一些必需的导入):

class uslutils implements Serializable {

我定义了一些“ with<property>”方法来设置一个属性并返回它。

然后我在“ public String toString() ”中写了一个“ uslutils ”方法,看起来像这样:
public String toString() {
println "Inside uslutils.toString()."
return "[currentBuild[${currentBuild}] mechIdCredentials[${mechIdCredentials}] " +
"baseStashURL[${baseStashURL}] jobName[${jobName}] codeBranch[${codeBranch}] " +
"buildURL[${buildURL}] pullRequestURL[${pullRequestURL}] qBotUserID[${qBotUserID}] " +
"qBotPassword[${qBotPassword}]]"
}

然后,在我的 Jenkinsfile 中,在设置了 uslutils 属性后,我添加了如下一行:
println "uslutils[${uslutils}]"

然后,我运行我的工作,发生的奇怪事情是我没有看到“uslutils”行,或者 Inside uslutils.toString() .线。但是,我确实修改了迄今为止添加到“uslutils”的一个函数方法(除了“with”方法),它返回一个字符串值,我只是向该值添加了一个“x”。我的 Jenkinsfile 正在打印结果,它确实显示了额外的“x”。

请注意,这里没有发生错误,只是似乎省略了 println共享库类中的输出,甚至更奇怪的是,省略了 println 的输出调用隐式调用 uslutils.toString() 的 Jenkinsfile方法。请注意 println来电原 call()在控制台输出中看到了方法。

有什么想法可能会在这里发生吗?

更新 :

我现在在我的 Jenkinsfile 中有以下几行(以及其他):
println "uslutils.qBotPassword[${uslutils.qBotPassword}]"
println "uslutils[${uslutils}]"
println "uslutils.toString()[${uslutils.toString()}]"

再说一遍,这里是“uslutils.toString()”方法:
public String toString() {
println "Inside uslutils.toString()."
return "[currentBuild[${currentBuild}] mechIdCredentials[${mechIdCredentials}] " +
"baseStashURL[${baseStashURL}] jobName[${jobName}] codeBranch[${codeBranch}] " +
"codeURL[${codeURL}] buildURL[${buildURL}] pullRequestURL[${pullRequestURL}] qBotUserID[${qBotUserID}] " +
"qBotPassword[${qBotPassword}]]"
}

以下是构建的相应输出行:
[Pipeline] echo
uslutils.qBotPassword[...]
[Pipeline] echo
uslutils.toString()[[currentBuild[org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper@41fb2c94] mechIdCredentials[121447d5-0fe4-470d-b785-6ce88225ef01] baseStashURL[https://...] jobName[unified-service-layer-build-pipeline] codeBranch[master] codeURL[ssh://git@...] buildURL[http://...] pullRequestURL[] qBotUserID[...] qBotPassword[...]]

如您所见,该行试图 print "uslutils[${uslutils}]"被简单地忽略了。试图到 print "uslutils.toString()[${uslutils.toString()}]" 的线路确实渲染了,但还要注意 Inside uslutils.toString() .没有渲染。

我仍在寻找对这种行为的解释,但也许这更简洁地总结了它。

最佳答案

我做了一些挖掘,发现了这个问题,https://issues.jenkins-ci.org/browse/JENKINS-41953 , 基本上在正常的管道脚本中 println别名为 echo步。但是当你在类里面时,例如在管道 CPS 之外,则 echo 步骤不可用且 println被忽略(因为,据我所知,没有可用的记录器)。

您可以做的是使用变量将脚本环境传播到您的类方法中并调用 echo通过变量( found solution in this thread )。像这样:

class A {
Script script;
public void a() {
script.echo("Hello")
}
}
def a = new A(script:this)
echo "Calling A.a()"
a.a()

输出:
Started by user jon
[Pipeline] echo
Calling A.a()
[Pipeline] echo
Hello
[Pipeline] End of Pipeline
Finished: SUCCESS

这就是我们想要的。为了比较,这里没有传播:
class A {
public void a() {
println "Hello"
}
}
def a = new A()
echo "Calling A.a()"
a.a()

给出:
Started by user jon
[Pipeline] echo
Calling A.a()
[Pipeline] End of Pipeline
Finished: SUCCESS

关于jenkins - println 在 "call"的 "vars/foo.groovy"方法中有效,但不在类中的方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42149652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com