【发布时间】:2017-02-10 00:46:53
【问题描述】:
我正在迭代构建一个 Jenkins 管道共享库,所以我的 Jenkinsfile 更干净一些。
我正在使用以下页面作为指导:https://jenkins.io/doc/book/pipeline/shared-libraries/。
我首先在单个文件中定义了几个方法,例如“vars/methodName.groovy”,在代码中使用了“call()”方法。这可以正常工作,我特别注意到这些方法中的“println”调用可以在 Jenkins 控制台输出中看到。
然后我决定我想在方法调用之间保存一些状态,所以我在“vars”中添加了一个名为“uslutils.groovy”的新文件,它以这样的开头(减去一些必需的导入):
class uslutils implements Serializable {
我定义了一些“with<property>”方法来设置一个属性并返回这个。
然后我在“uslutils”中编写了一个“public String toString()”方法,看起来像这样:
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 输出,甚至更奇怪的是,省略了 Jenkinsfile 中隐式调用 @987654336 的 println 调用的输出@ 方法。请注意,在控制台输出中可以看到原始 call() 方法中的 println 调用。
你有什么想法吗?
更新:
我的 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()。没有渲染。
我仍在寻找这种行为的解释,但也许这可以更简洁地总结它。
【问题讨论】:
标签: jenkins groovy jenkins-pipeline