I am using a declarative pipeline in a Jenkinsfile but I would like to derive some variables from a parameter.
For example given:

```
parameters {
   choice(name: 'Platform',choices: ['Debian9', 'CentOS7'], description: 'Target OS platform', )
}

```

I would like to add a block like:

```
script {
  switch(param.Platform) {
     case "Centos7":
         def DockerFile = 'src/main/docker/Jenkins-Centos.Dockerfile'
         def PackageType = 'RPM'
         def PackageSuffix = '.rpm'
         break
     case "Debian9":
     default:
         def DockerFile = 'src/main/docker/Jenkins-Debian.Dockerfile'
         def PackageType = 'DEB'
         def PackageSuffix = '.deb'
         break
  }
}

```

Such that I can use variables elsewhere in the pipeline. For example:

```
agent { 
   dockerfile {
       filename "$DockerFile"
   }
}

```

etc..

but script is illegal in the parameter, environment & agent sections.
It can only be used in steps.

I need to use the parameter in the agent block and I want to avoid repeating myself where the variables are used in different steps.

Is there a sane way to achieve this? My preferences in order are:

* a declarative pipeline
* a scripted pipeline (less good)
* via a plugin to the Jenkins UI (least good)

A shared library might be appropriate here regardless of whether it is actually shared.

The intention is to support a multi-configuration project by creating a parameterised build and invoking it for different parameter sets with a red/blue status light for each configuration.
It could be that I have assumed an 'old fashioned' design. In which case an acceptable answer would explain the modern best practice for creating a multi-configuration multi-branch pipeline. Something like: <https://support.cloudbees.com/hc/en-us/articles/115000088431-Create-a-Matrix-like-flow-with-Pipeline> or [Jenkins Pipeline Multiconfiguration Project](https://stackoverflow.com/questions/46601999/jenkins-pipeline-multiconfiguration-project)

See also [Multiconfiguration / matrix build pipeline in Jenkins](https://stackoverflow.com/q/56046541/1569204) for less specific discussion of best practices.