def myText = '''
properties:
  - param: booleanParam
    args:
      name: ENABLE_AAT
      defaultValue: true
      description: "Should we run AATs"
  - param: stringParam
    args:
      name: NEXT_BUILD
      defaultValue: '${env.BUILD_NUMBER.toInteger() + 1}'
      description: 'Choose the next build number'      
'''

node('master') {
    stage('yaml') {
        def myYaml = readYaml text: myText
        def myProps = readMyProps myYaml.properties
        
        properties([
            parameters(myProps)
        ])
    }
}

@NonCPS
def readMyProps(properties) {
    
    properties.collect { parameter ->
      this.invokeMethod parameter.param, parameter.args.collectEntries { name, value ->
        [
          name, 
          value instanceof String ? interp(value) : value
        ]
      }
    }
}

@NonCPS
def interp(value) {
  new groovy.text.GStringTemplateEngine()
    .createTemplate(value)
    .make([env:env])
    .toString()
}