Search code examples
jsonjenkinsjenkins-pipelinejenkins-groovypayload

Jenkins Pipeline Error while trying to send JSON Payload after post success


I'm trying to send a custom JSON payload from my pipeline on Jenkins after the last successful stage, like this:

  post {
        success {
            script {
                def payload = """
{
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": "SonarQube report from Jenkins Pipeline"
        },
        {
            "type": "TextBlock",
            "text": "Code was analyzed was successfully.",
            "wrap": true,
            "color": "Good",
            "weight": "Bolder"
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "version": "1.3"
}"""
                httpRequest httpMode: 'POST',
                        acceptType: 'APPLICATION_JSON',
                        contentType: 'APPLICATION_JSON',
                        url: "URL",
                        requestBody: payload
            }
        }
    }
}

But I get an error

Error when executing success post condition:
groovy.lang.MissingPropertyException: No such property: schema for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)

I'm using the HTTP Request plugin available for Jenkins and the format of the JSON payload is correct for MS Teams.


Solution

  • The issue is actually a groovy syntax error. You can easily check this in something like https://groovy-playground.appspot.com/ by adding your def payload = ... statement.

    There are multiple ways to get multiline strings in groovy:

    Apart from the single quoted string, they also have a secondary property which is interpolation

    Notice how in the initial JSON payload, there's a "$schema" key? Using triple double quoted strings makes groovy want to find a schema variable and use it's value to construct that payload variable.

    You have two separate solutions:

    1. Use triple single quoted string - just update """ to '''
    2. Escape the variable - just update "$schema" to "\$schema" (making $ a literal $ instead of it being used as an interpolation prefix)