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/749b7074-d58d-4fe3-8c0f-0fd4325cf332n%40googlegroups.com.
