Параметр активного выбора с декларативным конвейером Jenkins


Я пытаюсь использовать параметр активного выбора с декларативным скриптом Jenkins Pipeline.

Это мой простой сценарий:


environments = 'lab\nstage\npro'

properties([
    parameters([
        [$class: 'ChoiceParameter',
            choiceType: 'PT_SINGLE_SELECT',
            description: 'Select a choice',
            filterLength: 1,
            filterable: true,
            name: 'choice1',
            randomName: 'choice-parameter-7601235200970',
            script: [$class: 'GroovyScript',
                fallbackScript: [classpath: [], sandbox: false, script: 'return ["ERROR"]'],
                script: [classpath: [], sandbox: false, 
                    script: """
                        if params.ENVIRONMENT == 'lab'
                            return['aaa','bbb']
                        else
                            return ['ccc', 'ddd']
                    """
                ]]]
    ])
])

pipeline {
    agent any
    tools {
        maven 'Maven 3.6'
    }
    options {
        disableConcurrentBuilds()
        timestamps()
        timeout(time: 30, unit: 'MINUTES')
        ansiColor('xterm')
    }
    parameters {
        choice(name: 'ENVIRONMENT', choices: "${environments}")
    }
    stages {
        stage("Run Tests") {
            steps {
                sh "echo SUCCESS on ${params.ENVIRONMENT}"
            }
        }
    }
}

Но на самом деле второй параметр пуст

введите описание изображения здесь

Возможно ли совместное использование заданного сценария параметра активного выбора и декларативного параметра?

UPD Есть ли способ передать переменную списка в скрипт? Например

List<String> someList = ['ttt', 'yyyy']
...
script: [
    classpath: [], 
    sandbox: true, 
    script: """
        if (ENVIRONMENT == 'lab') { 
            return someList
        }
        else {
            return['ccc', 'ddd']
        }
    """.stripIndent()
]

person Marat Gareev    schedule 23.07.2020    source источник


Ответы (2)


Вам необходимо использовать Active Choices Reactive Parameter, который позволяет текущему параметру задания ссылаться на другое значение параметра задания.

environments = 'lab\nstage\npro'

properties([
    parameters([
        [$class: 'CascadeChoiceParameter', 
            choiceType: 'PT_SINGLE_SELECT',
            description: 'Select a choice',
            filterLength: 1,
            filterable: true,
            name: 'choice1',
            referencedParameters: 'ENVIRONMENT',
            script: [$class: 'GroovyScript',
                fallbackScript: [
                    classpath: [], 
                    sandbox: true, 
                    script: 'return ["ERROR"]'
                ],
                script: [
                    classpath: [], 
                    sandbox: true, 
                    script: """
                        if (ENVIRONMENT == 'lab') { 
                            return['aaa','bbb']
                        }
                        else {
                            return['ccc', 'ddd']
                        }
                    """.stripIndent()
                ]
            ]
        ]
    ])
])

pipeline {
    agent any

    options {
        disableConcurrentBuilds()
        timestamps()
        timeout(time: 30, unit: 'MINUTES')
        ansiColor('xterm')
    }
    parameters {
        choice(name: 'ENVIRONMENT', choices: "${environments}")
    }
    stages {
        stage("Run Tests") {
            steps {
                sh "echo SUCCESS on ${params.ENVIRONMENT}"
            }
        }
    }
}
person yong    schedule 23.07.2020
comment
Спасибо за ваш ответ. К сожалению, параметр choice1 все еще пуст. - person Marat Gareev; 24.07.2020
comment
Ваш исходный if/else блок имеет синтаксическую ошибку, пропущен () and {}, и лучше установить sandbox: true. Выше Jenkinsfile проверил и работал, как ожидалось, на моей местной работе Jenkins. - person yong; 24.07.2020
comment
Превосходно! Оно работает. Большое спасибо. Подскажите, пожалуйста (обновил пост и добавил еще вопрос)? - person Marat Gareev; 24.07.2020
comment
Связано с сообщением: https://stackoverflow.com/questions/63093323/pass-groovy-object-into-active-choice-parameter - person Marat Gareev; 26.07.2020
comment
У меня нет известной реализации класса hudson.model.ParameterDefinition называется CascadeChoiceParameter - person user1767316; 31.05.2021
comment
то как Марат Гареев если заменить CascadeChoiceParameter на ChoiceParameterDefinition - person user1767316; 31.05.2021
comment
ok Active Choices Reactive Parameter - это плагин, вероятно, он предоставляет этот класс - person user1767316; 31.05.2021

Начиная с Jenkins 2.249.2 без какого-либо плагина и с использованием декларативного конвейера, следующий шаблон предлагает пользователю динамическое раскрывающееся меню (чтобы он мог выбрать ветку):

(окружающий блок withCredentials является необязательным, требуется только в том случае, если ваш скрипт и конфигурация jenkins действительно используют учетные данные)

node {

withCredentials([[$class: 'UsernamePasswordMultiBinding',
              credentialsId: 'user-credential-in-gitlab',
              usernameVariable: 'GIT_USERNAME',
              passwordVariable: 'GITLAB_ACCESS_TOKEN']]) {
    BRANCH_NAMES = sh (script: 'git ls-remote -h https://${GIT_USERNAME}:${GITLAB_ACCESS_TOKEN}@dns.name/gitlab/PROJS/PROJ.git | sed \'s/\\(.*\\)\\/\\(.*\\)/\\2/\' ', returnStdout:true).trim()
}

} трубопровод {

agent any

parameters {
    choice(
        name: 'BranchName',
        choices: "${BRANCH_NAMES}",
        description: 'to refresh the list, go to configure, disable "this build has parameters", launch build (without parameters)to reload the list and stop it, then launch it again (with parameters)'
    )
}

stages {
    stage("Run Tests") {
        steps {
            sh "echo SUCCESS on ${BranchName}"
        }
    }
}

}

Недостатком является то, что нужно обновить конфигурацию jenkins и использовать пустой прогон для обновления списка с помощью скрипта ...

Решение (не от меня): это ограничение можно сделать менее раздражающим с помощью дополнительных параметров, используемых для специального обновления значений:

parameters {
        booleanParam(name: 'REFRESH_BRANCHES', defaultValue: false, description: 'refresh BRANCH_NAMES branch list and launch no step')
}

затем с этапом:

stage('a stage') {
   when {
      expression { 
         return ! params.REFRESH_BRANCHES.toBoolean()
      }
   }
   ...
}
person user1767316    schedule 31.05.2021