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/5695f1c5-649f-4b9b-9286-5c52671a629bn%40googlegroups.com.