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/5c5dab3d-a5b1-4c79-ab9e-e8daaf59678an%40googlegroups.com.
