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/a3aa9c89-fca3-4cc7-9b32-9b1b3060f74dn%40googlegroups.com.
