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 jeremy....@riftio.com 
> 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 jeremy....@riftio.com 
>>> 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 jeremy....@riftio.com 
>>>>> 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 jenkinsci-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/a3aa9c89-fca3-4cc7-9b32-9b1b3060f74dn%40googlegroups.com.

Reply via email to