println in" call"方法" vars / foo.groovy"有效但不在课程

时间:2017-02-10 00:46:53

标签: jenkins groovy jenkins-pipeline

我正在迭代构建一个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;设置属性并返回此属性的方法。

然后我写了一个&#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()。没有呈现。

我仍然在寻找这种行为的解释,但也许这可以更简洁地总结一下。

1 个答案:

答案 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