How to print an instance of some class in jenkins shared library without explicitly calling toString() method
I have jenkins shared library. It has some CustomClass.groovy with overridden toString() method:
package com.jenkins
class CustomClass {
CustomClass(){
}
@Override
String toString() {
return "custom_class"
}
}
And I have the Jenkinsfile:
@Library("sharedlib@to-string")
import com.jenkins.CustomClass
println("1")
println(new CustomClass())
println("2")
println("prefix: " + new CustomClass())
println("3")
println("prefix: " + new CustomClass().toString())
It produces following output:
[Pipeline] echo
1
[Pipeline] echo
2
[Pipeline] echo
custom_class
[Pipeline] echo
3
[Pipeline] echo
prefix: custom_class
[Pipeline] End of Pipeline
Finished: SUCCESS
I have some confusion about that output:
- Why didn't the first example print anything?
- Why didn't the first example print prefix? Why only instance?
- Why are second and third examples different? Why here I see prefix, but don't see it in the second example. Why the first example it printed nothing, but third is okay as expected. After all, println() method uses toString() in second example implicitly.
jenkins jenkins-pipeline
add a comment |
I have jenkins shared library. It has some CustomClass.groovy with overridden toString() method:
package com.jenkins
class CustomClass {
CustomClass(){
}
@Override
String toString() {
return "custom_class"
}
}
And I have the Jenkinsfile:
@Library("sharedlib@to-string")
import com.jenkins.CustomClass
println("1")
println(new CustomClass())
println("2")
println("prefix: " + new CustomClass())
println("3")
println("prefix: " + new CustomClass().toString())
It produces following output:
[Pipeline] echo
1
[Pipeline] echo
2
[Pipeline] echo
custom_class
[Pipeline] echo
3
[Pipeline] echo
prefix: custom_class
[Pipeline] End of Pipeline
Finished: SUCCESS
I have some confusion about that output:
- Why didn't the first example print anything?
- Why didn't the first example print prefix? Why only instance?
- Why are second and third examples different? Why here I see prefix, but don't see it in the second example. Why the first example it printed nothing, but third is okay as expected. After all, println() method uses toString() in second example implicitly.
jenkins jenkins-pipeline
in plain groovy all works as you expect. question to jenkins pipeline...
– daggett
Dec 29 '18 at 8:54
Yes. In plain groovy everything is ok. But running in jenkins environment shows strange results.
– grolegor
Dec 29 '18 at 10:46
what aboutecho "${new CustomClass()}"
– daggett
Dec 29 '18 at 11:12
same result - nothing.
– grolegor
Dec 29 '18 at 11:29
add a comment |
I have jenkins shared library. It has some CustomClass.groovy with overridden toString() method:
package com.jenkins
class CustomClass {
CustomClass(){
}
@Override
String toString() {
return "custom_class"
}
}
And I have the Jenkinsfile:
@Library("sharedlib@to-string")
import com.jenkins.CustomClass
println("1")
println(new CustomClass())
println("2")
println("prefix: " + new CustomClass())
println("3")
println("prefix: " + new CustomClass().toString())
It produces following output:
[Pipeline] echo
1
[Pipeline] echo
2
[Pipeline] echo
custom_class
[Pipeline] echo
3
[Pipeline] echo
prefix: custom_class
[Pipeline] End of Pipeline
Finished: SUCCESS
I have some confusion about that output:
- Why didn't the first example print anything?
- Why didn't the first example print prefix? Why only instance?
- Why are second and third examples different? Why here I see prefix, but don't see it in the second example. Why the first example it printed nothing, but third is okay as expected. After all, println() method uses toString() in second example implicitly.
jenkins jenkins-pipeline
I have jenkins shared library. It has some CustomClass.groovy with overridden toString() method:
package com.jenkins
class CustomClass {
CustomClass(){
}
@Override
String toString() {
return "custom_class"
}
}
And I have the Jenkinsfile:
@Library("sharedlib@to-string")
import com.jenkins.CustomClass
println("1")
println(new CustomClass())
println("2")
println("prefix: " + new CustomClass())
println("3")
println("prefix: " + new CustomClass().toString())
It produces following output:
[Pipeline] echo
1
[Pipeline] echo
2
[Pipeline] echo
custom_class
[Pipeline] echo
3
[Pipeline] echo
prefix: custom_class
[Pipeline] End of Pipeline
Finished: SUCCESS
I have some confusion about that output:
- Why didn't the first example print anything?
- Why didn't the first example print prefix? Why only instance?
- Why are second and third examples different? Why here I see prefix, but don't see it in the second example. Why the first example it printed nothing, but third is okay as expected. After all, println() method uses toString() in second example implicitly.
jenkins jenkins-pipeline
jenkins jenkins-pipeline
edited Jan 1 at 4:47


Jayan
13.1k1065124
13.1k1065124
asked Dec 28 '18 at 22:41


grolegorgrolegor
1265
1265
in plain groovy all works as you expect. question to jenkins pipeline...
– daggett
Dec 29 '18 at 8:54
Yes. In plain groovy everything is ok. But running in jenkins environment shows strange results.
– grolegor
Dec 29 '18 at 10:46
what aboutecho "${new CustomClass()}"
– daggett
Dec 29 '18 at 11:12
same result - nothing.
– grolegor
Dec 29 '18 at 11:29
add a comment |
in plain groovy all works as you expect. question to jenkins pipeline...
– daggett
Dec 29 '18 at 8:54
Yes. In plain groovy everything is ok. But running in jenkins environment shows strange results.
– grolegor
Dec 29 '18 at 10:46
what aboutecho "${new CustomClass()}"
– daggett
Dec 29 '18 at 11:12
same result - nothing.
– grolegor
Dec 29 '18 at 11:29
in plain groovy all works as you expect. question to jenkins pipeline...
– daggett
Dec 29 '18 at 8:54
in plain groovy all works as you expect. question to jenkins pipeline...
– daggett
Dec 29 '18 at 8:54
Yes. In plain groovy everything is ok. But running in jenkins environment shows strange results.
– grolegor
Dec 29 '18 at 10:46
Yes. In plain groovy everything is ok. But running in jenkins environment shows strange results.
– grolegor
Dec 29 '18 at 10:46
what about
echo "${new CustomClass()}"
– daggett
Dec 29 '18 at 11:12
what about
echo "${new CustomClass()}"
– daggett
Dec 29 '18 at 11:12
same result - nothing.
– grolegor
Dec 29 '18 at 11:29
same result - nothing.
– grolegor
Dec 29 '18 at 11:29
add a comment |
1 Answer
1
active
oldest
votes
according to the Pipeline Readme :-)
Note in particular that
@Override
s of methods defined in binary classes, such asObject.toString()
, should in general be marked@NonCPS
since it will commonly be binary code calling them.
the following will work correctly:
class A{
@NonCPS
@Override
public String toString(){
return "A[123]"
}
}
node {
def a = new A()
echo('1 >>>')
echo(message: "Hello ${a}")
echo('2 >>>')
echo(message: "Hello " + a)
echo('3 >>>')
echo(message: "Hello " + a.toString())
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53965081%2fhow-to-print-an-instance-of-some-class-in-jenkins-shared-library-without-explici%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
according to the Pipeline Readme :-)
Note in particular that
@Override
s of methods defined in binary classes, such asObject.toString()
, should in general be marked@NonCPS
since it will commonly be binary code calling them.
the following will work correctly:
class A{
@NonCPS
@Override
public String toString(){
return "A[123]"
}
}
node {
def a = new A()
echo('1 >>>')
echo(message: "Hello ${a}")
echo('2 >>>')
echo(message: "Hello " + a)
echo('3 >>>')
echo(message: "Hello " + a.toString())
}
add a comment |
according to the Pipeline Readme :-)
Note in particular that
@Override
s of methods defined in binary classes, such asObject.toString()
, should in general be marked@NonCPS
since it will commonly be binary code calling them.
the following will work correctly:
class A{
@NonCPS
@Override
public String toString(){
return "A[123]"
}
}
node {
def a = new A()
echo('1 >>>')
echo(message: "Hello ${a}")
echo('2 >>>')
echo(message: "Hello " + a)
echo('3 >>>')
echo(message: "Hello " + a.toString())
}
add a comment |
according to the Pipeline Readme :-)
Note in particular that
@Override
s of methods defined in binary classes, such asObject.toString()
, should in general be marked@NonCPS
since it will commonly be binary code calling them.
the following will work correctly:
class A{
@NonCPS
@Override
public String toString(){
return "A[123]"
}
}
node {
def a = new A()
echo('1 >>>')
echo(message: "Hello ${a}")
echo('2 >>>')
echo(message: "Hello " + a)
echo('3 >>>')
echo(message: "Hello " + a.toString())
}
according to the Pipeline Readme :-)
Note in particular that
@Override
s of methods defined in binary classes, such asObject.toString()
, should in general be marked@NonCPS
since it will commonly be binary code calling them.
the following will work correctly:
class A{
@NonCPS
@Override
public String toString(){
return "A[123]"
}
}
node {
def a = new A()
echo('1 >>>')
echo(message: "Hello ${a}")
echo('2 >>>')
echo(message: "Hello " + a)
echo('3 >>>')
echo(message: "Hello " + a.toString())
}
answered Dec 30 '18 at 19:14
daggettdaggett
8,75521530
8,75521530
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53965081%2fhow-to-print-an-instance-of-some-class-in-jenkins-shared-library-without-explici%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
in plain groovy all works as you expect. question to jenkins pipeline...
– daggett
Dec 29 '18 at 8:54
Yes. In plain groovy everything is ok. But running in jenkins environment shows strange results.
– grolegor
Dec 29 '18 at 10:46
what about
echo "${new CustomClass()}"
– daggett
Dec 29 '18 at 11:12
same result - nothing.
– grolegor
Dec 29 '18 at 11:29