I wondered about that also, but I commented it out and still got the error. Then I moved the defs outside the withCredentials block and now I get a similar but different error. It appears to be erroring at the withCredentials line. I haven't even tried calling these defs yet but am getting the error when going into withCredentials:
*14:34:20* in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals *14:34:20* in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@307ca576 *14:34:20* in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture *14:34:20* in object com.cloudbees.groovy.cps.impl.CpsClosureDef@1b7eff10 *14:34:20* in field com.cloudbees.groovy.cps.impl.CpsClosure.def *14:34:20* in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@2932682d *14:34:20* in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures *14:34:20* in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@43cd433c *14:34:20* in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@43cd433c *14:34:20* Caused: java.io.NotSerializableException: groovy.text.SimpleTemplateEngine$SimpleTemplate On Monday, October 26, 2020 at 1:51:28 PM UTC-4 [email protected] wrote: > I think it is failing on this line: > echo("MAL is ${MAL}") > > > > On Monday, October 26, 2020 at 11:51:19 AM UTC-4 cw wrote: > >> Also I'm confused why I'm getting a NotSerializableException related to >> SimpleTemplateEngine$SimpleTemplate when I'm in a try/except block which is >> running an sshCommand which is not trying to call the SimpleTemplateEngine. >> >> On Monday, October 26, 2020 at 10:04:59 AM UTC-4 cw wrote: >> >>> The code block I pasted is exactly the pipeline steps I am running so I >>> don't think I'm running it in a function? >>> >>> On Monday, October 26, 2020 at 9:41:08 AM UTC-4 [email protected] >>> wrote: >>> >>>> Are you running this in the main thread of the enkinsFile itself or in >>>> a function? I suspect that you are in a function and you may need to use >>>> the @NONCPS decorator >>>> >>>> On Friday, October 23, 2020 at 4:31:55 PM UTC-4 cw wrote: >>>> >>>>> That's great, thank you very much. I was able to take your code, >>>>> substitute MAL for HOST, for instance, and test it in a groovy web >>>>> console, >>>>> and it returned the correct value and interpolated the variable even >>>>> though >>>>> the variable wasn't defined until after the pathname was defined with the >>>>> variable in it. Exactly what I was looking for. However... >>>>> >>>>> I took the same code and pasted it into my test jenkins pipeline and >>>>> now I'm getting an error on a subsequent command which I looked up, but I >>>>> think it may be over my head... Note that I'm getting the correct result >>>>> with my substituted variable, but I'm just printing to the console and >>>>> I'm >>>>> not using it yet in the sshcommand, and yet sshcommand appears to be >>>>> failing where before it wasn't. >>>>> >>>>> *6:24:05* Executing command on care SOC[xx.xx.xx.xx]: ls -ltr >>>>> /srv/jboss/server/ sudo: false >>>>> *16:24:05* [Pipeline] echo >>>>> <https://abaapvsc01amcba.tdbfg.com:9443/job/CraigTest/job/variable%20inside%20variable/28/console#> >>>>> >>>>> *16:24:05* something failed >>>>> *16:24:05* [Pipeline] echo >>>>> <https://abaapvsc01amcba.tdbfg.com:9443/job/CraigTest/job/variable%20inside%20variable/28/console#> >>>>> >>>>> *16:24:05* java.io.NotSerializableException: >>>>> groovy.text.SimpleTemplateEngine$SimpleTemplate >>>>> >>>>> code block: >>>>> >>>>> import java.text.SimpleDateFormat >>>>> import groovy.text.SimpleTemplateEngine >>>>> >>>>> node { >>>>> def dateFormat = new SimpleDateFormat("yyyyMMddHHmm") >>>>> >>>>> MALarray = params.multi.split(',') >>>>> >>>>> MALarray.each { MAL -> >>>>> >>>>> >>>>> if (MAL in ['care', 'conn'] ) { >>>>> echo 'care or conn' >>>>> servers = ['xx.xx.xx.xx'] >>>>> } >>>>> def soc_remote = [:] >>>>> soc_remote.name = "${MAL} SOC" >>>>> soc_remote.allowAnyHosts = true >>>>> >>>>> withCredentials([usernamePassword(credentialsId: 'Credentials', >>>>> usernameVariable: 'USER_ID', passwordVariable: 'USER_PASSWORD')]) { >>>>> soc_remote.user = USER_ID >>>>> soc_remote.password = USER_PASSWORD >>>>> def templateMessage = new >>>>> SimpleTemplateEngine().createTemplate(filepath) >>>>> def result = { mal -> templateMessage.make(mal: mal)} >>>>> >>>>> println(result(MAL)) // this is working correctly >>>>> >>>>> servers.each { server -> >>>>> soc_remote.host = server >>>>> try { >>>>> echo("MAL is ${MAL}") >>>>> sshCommand remote: soc_remote, command: "ls -ltr >>>>> /srv/jboss/server/" >>>>> } catch (err) { >>>>> echo "something failed" >>>>> echo "${err}" // this is where I'm >>>>> getting the error on the sshcommand >>>>> } >>>>> } >>>>> } >>>>> } >>>>> } >>>>> >>>>> On Friday, October 23, 2020 at 3:14:08 PM UTC-4 [email protected] >>>>> wrote: >>>>> >>>>>> I stumbled on >>>>>> https://stackoverflow.com/questions/55423036/groovy-string-interpolation-when-string-is-defined-before-the-interpolated-varia >>>>>> >>>>>> and I found this snippet worked just fine after I approved the >>>>>> signature in jenkins >>>>>> >>>>>> import groovy.text.SimpleTemplateEngine >>>>>> >>>>>> node("docker") { >>>>>> stage("eval") { >>>>>> def pathname = "/srv/\${host}/foo/bar" >>>>>> >>>>>> def templateMessage = new >>>>>> SimpleTemplateEngine().createTemplate(pathname) >>>>>> >>>>>> def result = { host -> templateMessage.make(host: host)} >>>>>> def HOST = "myhost" >>>>>> >>>>>> println(result(HOST)) >>>>>> } >>>>>> } >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Friday, October 23, 2020 at 2:28:57 PM UTC-4 cw wrote: >>>>>> >>>>>>> Thank you, it seems that you're right, it's not completing the >>>>>>> expansion, but in the research I did, I wasn't able to make anything >>>>>>> else >>>>>>> work (one suggestion had to do with double quotes instead of single >>>>>>> quotes, >>>>>>> but wasn't able to get that to work either). I don't know if it's >>>>>>> related >>>>>>> to it being a parameter that was specified at build this is not >>>>>>> allowing it >>>>>>> to expand? >>>>>>> >>>>>>> I looked at the link you sent but didn't really understand "using a >>>>>>> closure" as the answer states. I tried to imitate it using this code >>>>>>> below >>>>>>> but it still didn't expand: >>>>>>> >>>>>>> def fp = { filepath -> "${filepath}" } >>>>>>> println fp(filepath) >>>>>>> >>>>>>> On Friday, October 23, 2020 at 12:13:07 PM UTC-4 >>>>>>> [email protected] wrote: >>>>>>> >>>>>>>> I think you need to do an "eval" or the equivalent to filepath in >>>>>>>> order to expand the inner variable. I believe the ssh command is >>>>>>>> executing >>>>>>>> "ls /srv/jboss/server/${MAL}/log/" but MAL on the far end is empty. So >>>>>>>> you >>>>>>>> need to complete the expansion before calling ssh. >>>>>>>> >>>>>>>> This might get you on the right track -- >>>>>>>> https://stackoverflow.com/questions/28997518/groovy-string-interpolation-with-value-only-known-at-runtime >>>>>>>> >>>>>>>> On Thursday, October 22, 2020 at 12:14:06 PM UTC-4 cw wrote: >>>>>>>> >>>>>>>>> I'm trying to set up a string parameter which will reference a >>>>>>>>> variable which will be created within the pipeline. For instance, >>>>>>>>> when >>>>>>>>> building a parameterized build, the user enters a file path in this >>>>>>>>> format: /srv/jboss/server/${MAL}/log/ >>>>>>>>> >>>>>>>>> Where MAL is assigned via the pipeline and then I try to ls -ltr >>>>>>>>> the fully qualified path after MAL has been expanded. However I'm >>>>>>>>> not >>>>>>>>> getting it to expand; wondering what I'm doing wrong. >>>>>>>>> >>>>>>>>> node { >>>>>>>>> MALarray = params.multi.split(',') >>>>>>>>> >>>>>>>>> MALarray.each { MAL -> >>>>>>>>> >>>>>>>>> if (MAL in ['care''] ) { >>>>>>>>> servers = ['xx.xx.xx.xx','xx.xx.xx.xx'] >>>>>>>>> } >>>>>>>>> >>>>>>>>> def soc_remote = [:] >>>>>>>>> soc_remote.name = "${MAL} SOC" >>>>>>>>> soc_remote.allowAnyHosts = true >>>>>>>>> >>>>>>>>> withCredentials([usernamePassword(credentialsId: 'Credentials', >>>>>>>>> usernameVariable: 'USER_ID', passwordVariable: 'USER_PASSWORD')]) { >>>>>>>>> soc_remote.user = USER_ID >>>>>>>>> soc_remote.password = USER_PASSWORD >>>>>>>>> servers.each { server -> >>>>>>>>> soc_remote.host = server >>>>>>>>> stage("Run script on ${server}") { >>>>>>>>> try { >>>>>>>>> echo("MAL is ${MAL}") >>>>>>>>> sshCommand remote: soc_remote, command: "ls -ltr ${filepath}" >>>>>>>>> } catch (err) { >>>>>>>>> echo "something failed" >>>>>>>>> echo "${err}" >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> } >>>>>>>>> >>>>>>>>> Console output: >>>>>>>>> *11:59:34* MAL is care >>>>>>>>> *11:59:34* [Pipeline] sshCommand >>>>>>>>> <https://abaapvsc01amcba.tdbfg.com:9443/job/CraigTest/job/variable%20inside%20variable/2/console#> >>>>>>>>> >>>>>>>>> *11:59:34* Executing command on care SOC[xx.xx.xx.xx]: ls -ltr >>>>>>>>> /srv/jboss/server/${MAL}/log/ sudo: false >>>>>>>>> *11:59:35* ls: cannot access /srv/jboss/server//log/: No such >>>>>>>>> file or directory >>>>>>>>> *11:59:35* Failed command care SOC#1002 with status 2: ls -ltr >>>>>>>>> /srv/jboss/server/${MAL}/log/ >>>>>>>>> >>>>>>>>> -- 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/d8044f5d-ed9c-4697-a35c-31d8c62f15ecn%40googlegroups.com.
