okay, take this with a grain of salt because this is purely a guess

The ssh call is trying to serialize all of the local variables, but it 
can't serialize the simpleTemplate. So move all the code that touches 
simpletemplate into a function that's wrapped with the @NONCPS decorator. 

something like  this (I am writing this off the top of my head ... no 
verification)

@NONCPS
def make_path(MAL) { 

        def pathname = "/srv/\${host}/foo/bar"
        def templateMessage = new 
SimpleTemplateEngine().createTemplate(pathname)
        def template = { host -> templateMessage.make(host: host)}
        def result = template(MAL)
       return result
}

   


On Monday, October 26, 2020 at 2:41:09 PM UTC-4 cw wrote:

> I wondered about that also, but I commented it out and still got the 
> error.  Then I moved the defs outside the withCredentials block and now I 
> get a similar but different error.  It appears to be erroring at the 
> withCredentials line.  I haven't even tried calling these defs yet but am 
> getting the error when going into withCredentials:
>
> *14:34:20* in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals 
> *14:34:20* in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@307ca576 
> *14:34:20* in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture 
> *14:34:20* in object com.cloudbees.groovy.cps.impl.CpsClosureDef@1b7eff10 
> *14:34:20* in field com.cloudbees.groovy.cps.impl.CpsClosure.def 
> *14:34:20* in object 
> org.jenkinsci.plugins.workflow.cps.CpsClosure2@2932682d 
> *14:34:20* in field 
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures 
> *14:34:20* in object 
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@43cd433c 
> *14:34:20* in object 
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@43cd433c 
> *14:34:20* Caused: java.io.NotSerializableException: 
> groovy.text.SimpleTemplateEngine$SimpleTemplate  
>
> On Monday, October 26, 2020 at 1:51:28 PM UTC-4 [email protected] 
> wrote:
>
>> I think it is failing on this line: 
>>     echo("MAL is ${MAL}")
>>
>>
>>
>> On Monday, October 26, 2020 at 11:51:19 AM UTC-4 cw wrote:
>>
>>> 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 [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/d9cf2582-b7ac-46a6-af89-e33564767588n%40googlegroups.com.

Reply via email to