我正在迭代构建一个Jenkins管道共享库,所以我的Jenkins文件更清晰。
我使用以下页面获取指导:https://jenkins.io/doc/book/pipeline/shared-libraries/。
我首先在单个文件中定义了几种方法,例如" vars/methodName.groovy
",使用" call()
"代码中的方法。这项工作正常,我特别注意到" println
"在Jenkins控制台输出中可以看到这些方法中的调用。
然后我决定在方法调用之间保存一些状态,所以我在" vars
"中添加了一个新文件。命名为" uslutils.groovy
"这样开始(减去一些必需的进口):
class uslutils implements Serializable {
我定义了一些&#34; with<property>
&#34;设置属性并返回此属性的方法。
public String toString()
&#34;方法&#34; uslutils
&#34;看起来像这样:
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}]"
然后,我完成了我的工作,发生的奇怪事情是我没有看到&#34; uslutils&#34;行,或Inside uslutils.toString()
。线。但是,我确实修改了迄今为止我添加的一种功能方法&#34; uslutils&#34; (除了&#34; with&#34;方法),它返回一个字符串值,我刚刚添加了一个&#34; x&#34;价值。我的Jenkinsfile正在打印结果,它确实显示了额外的&#34; x&#34;。
请注意,此处没有发生错误,它似乎忽略了共享库类中的println
输出,甚至更奇怪,省略了Jenkins文件中println
调用的输出调用uslutils.toString()
方法。请注意,在控制台输出中看到原始println
方法中的call()
次调用。
任何想法可能会发生在这里?
更新:
我现在在Jenkinsfile中有以下几行(等等):
println "uslutils.qBotPassword[${uslutils.qBotPassword}]"
println "uslutils[${uslutils}]"
println "uslutils.toString()[${uslutils.toString()}]"
重复一遍,这是&#34; uslutils.toString()&#34;方法:
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()
。没有呈现。
我仍然在寻找这种行为的解释,但也许这可以更简洁地总结一下。
答案 0 :(得分:16)
我做了一些挖掘并发现了这个问题,https://issues.jenkins-ci.org/browse/JENKINS-41953,基本上在正常的管道脚本中println
别名为echo
步。但是当你在课堂上时,例如在管道CPS之外,回声步骤不可用,println
被忽略(因为据我所知,没有可用的记录器)。
您可以做的是使用变量将脚本环境传播到类方法中,并通过变量(found solution in this thread)调用echo
。像这样:
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