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.

Reply via email to