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.