Kahsuke, The fast turnaround on the fix is much appreciated.
Jesse, Thanks for pursuing this even further. I sat this aside to work on
some other aspects of the project and oddly enough, just before checking
back in on this thread this evening, I ran smack into the method not
available problem on another piece of code where again I was trying to call
node() in this case from within a formally declared class. Which leads me
to a follow-on problem:
First let me say that I am a long time coder but very new to groovy
(learning it just to be able to use this workflow stuff) so I completely
get why I can't call these methods from within a class now that I see the
error. But I have a few questions that may be more properly groovy
questions but I am a little unclear where groovy leaves of and workflow
picks up here so I hope you will humor me.
I presume that when using scripts as classes, each class is basically a
singleton with a lifespan equalling that of the execution of the workflow,
with the caveat that all classes get serialized by Jenkins-workflow's
state-saving mechanism that allows for resuming inflight workflows as well
as allows for the state to be created/managed on the master node yet
replicated to slave nodes for execution. I am curious if there is any
documentation around the implications and limitation that this need to be
serializable places on classes. For example, in my most recent effort,
realizing that the node() method was not available, I tried to pass "this"
into the class in order to try calling _this.node(). That got me a
serialization error right quick, which makes perfect sense. What else might
one do that would cause a class/script to not be serializable?
Which gets me back to my current dilemma. Again this may be more of a
groovy question but at present, I am again trying to use a formally
declared class within a script so that I can subclass it and override
certain methods as per the Template design pattern.
My original code looked like this:
*file Job.groovy:*
public start(nodeType, stashProject, stashRepo) {
node(nodeType) {
checkout changelog: true, poll: true, scm: [
$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: 'c39766d4-52c3-42ed-a1f0-fdfd3491a545',
url: "ssh://git@stash:7999/${stashProject}/${stashRepo}.git"
]]
]
load './build.groovy'
}
But now I am trying to do this:
class Job {
def _nodeType, _stashProject, _stashRepo
public Job(nodeType, stashProject, stashRepo){
_nodeType = nodeType
_stashProject = stashProject
_stashRepo = stashRepo
}
public start() {
node(_nodeType) {
beforeCheckout()
checkout changelog: true, poll: true, scm: [
$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: 'c39766d4-52c3-42ed-a1f0-fdfd3491a545',
url:
"ssh://git@stash:7999/${_stashProject}/${_stashRepo}.git"
]]
]
afterCheckout()
load './build.groovy'
afterRun()
}
}
def beforeCheckout(){
//Virtual method
}
def afterCheckout(){
//Virtual method
}
def afterRun(){
//Virtual method
}
}
The immediate impetus for this, is the need to conditionally do some
customization of the .kitchen.yml file in the afterCheckout() method of my
subclass depending on what nodeType it is running on (vagrant vs docker).
Perhaps I am trying to do things too much in my traditional OO GOF design
patterns way of thinking about polymorphism. So if there is a better
approach to trying to solve this sort of problem in the context of Jenkins
workflow and groovy, I am open too it.
Bottom line though, my requirement is to create some standardized
workflows, of which this Job.groovy and Cookbook.groovy are very simple
examples, which are extensible but only at specific points.
I hope that makes sense. Any advice even if only to point me to some
examples or docs to read would be greatly appreciated.
--Regards,
Ken
On Wednesday, December 17, 2014 8:10:38 AM UTC-5, Jesse Glick wrote:
>
> With that change I get an error
>
> > No signature of method: chef.Cookbook.sh() is applicable for argument
> types…
>
> meaning that the DSL methods are not accessible from your class. That is
> because when you define a standalone class, it has no access to the main
> ‘groovy.lang.Script’, on which DSL methods (and some miscellaneous stuff
> like ‘env’) are defined.
>
> If I delete the ‘class Cookbook {}’ wrapper then it works fine—once I wrap
> the ‘sh’ sequence of both functions in ‘node {}’.
>
> Basically, you did not need to rewrite the class structure to add the
> ‘_validated’ variable.
>
--
You received this message because you are subscribed to the Google Groups
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jenkinsci-users/863c5a1d-8d48-461e-8f66-6c52cac63d09%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.