简体   繁体   中英

Groovy LinkedHashMap returned from a Jenkins shared library is converted to String

I have a function in a Jenkins shared library which builds and returns a map object ( class java.util.LinkedHashMap ):

#!/usr/bin/env groovy
def call(Map config) {
    script {
        echo "Building nested map"

        def MAP_VAR = [:]

        MAP_VAR.put("one", [:])
        MAP_VAR.put("two", [:])

        MAP_VAR.get("one").put("a", "b")
        MAP_VAR.get("two").put("c", "d")

        echo "Returning: ${MAP_VAR}"
        echo "Type: ${MAP_VAR.getClass()}"

        return MAP_VAR
    }
}

When this function runs the log output shows:

Returning: [one:[a:b], two:[c:d]]
Type: class java.util.LinkedHashMap

But when I call the function and assign the return value to a variable, it ends up being a string ( class java.lang.String ):

#!/usr/bin/env groovy

library identifier: 'library@main',
        changelog: false,
        retriever: modernSCM([ $class: 'GitSCMSource',
                               remote: 'git@github.com:org/repo.git',
                               credentialsId: 'credentials' ])

pipeline {
    agent none
    stages {
        stage('Get map') {
            agent any
            steps {
                script {
                    env.MAP_VAR = getMapVar()
                }
            }
        }
        stage('Check map') {
            agent any
            steps {
                script {
                    echo "Value: ${env.MAP_VAR}"
                    echo "Type: ${env.MAP_VAR.getClass()}"
                }
            }
        }
    }
}

The output shows:

Value: {one={a=b}, two={c=d}}
Type: class java.lang.String

Ultimately I'm trying to access the map's properties in multiple stages within the Jenkinsfile. If I try this:

echo "Value: ${env.MAP_VAR['one']}"

I get:

groovy.lang.MissingPropertyException: No such property: one for class: java.lang.String

I've tried:

def env.MAP_VAR = getMapVar()

But that results in:

WorkflowScript: 59: unexpected token: def @ line 59, column 21.
                       def env.MAP_VAR = getMapVar()
                       ^

I've also tried:

def Map env.MAP_VAR = getMapVar()

But that results in:

WorkflowScript: 60: unexpected token: Map @ line 60, column 25.
                       def Map env.MAP_VAR = getMapVar()
                           ^

How can I get the Map/LinkedHashMap from the function as a Map/LinkedHashMap (which would allow me to access the properties/values of the map contents) and assign it to a global variable which can be used in all stages?

def env.MAP_VAR = getMapVar()

This will not work as you are trying to define a key MAP_VAR in env map.

def Map env.MAP_VAR = getMapVar()

This also will not work as you are trying to define MAP_VAR key in env map as def and also MAP . This is similar to doing something like String Integer my_var_name = something()

env.MAP_VAR = getMapVar()

You are storing the return value as a string in env environment variable map. Jenkins output is accurate given the code.

To achieve what you are trying to do, you can store it as a variable and it will work fine. In the following example, the variable goes into Groovy's script binding and will be available in the next stage. You can also define def MAP_VAR outside the pipeline block to get the same result.

#!/usr/bin/env groovy

library identifier: 'library@main',
        changelog: false,
        retriever: modernSCM([ $class: 'GitSCMSource',
                               remote: 'git@github.com:org/repo.git',
                               credentialsId: 'credentials' ])

pipeline {
    agent none
    stages {
        stage('Get map') {
            agent any
            steps {
                script {
                    MAP_VAR = getMapVar()
                }
            }
        }
        stage('Check map') {
            agent any
            steps {
                script {
                    echo "Value: ${MAP_VAR}"
                    echo "Type: ${MAP_VAR.getClass()}"
                }
            }
        }
    }
}

This will print

Value: [one:[a:b], two:[c:d]]
Type: class java.util.LinkedHashMap

In stage two,

echo "${MAP_VAR['one']}"

will output

[a:b]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM