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.

Reply via email to