Дженкинс — Как получить параметры свойств / полей выбора, определенные в общей библиотеке

#jenkins #jenkins-pipeline

#дженкинс #дженкинс-конвейер

Вопрос:

Мы определили набор параметров выбора в нашей общей библиотеке Jenkins, и у меня есть задание, в котором я хочу иметь возможность создавать набор перестановок некоторых из них. например: в shared dynamic_params.groovy :

 def dev_team() {
    def teams = ['backend', 'frontend']
    return choice(name: 'team', description: 'Choose the name of the team', choices: teams)
}

def environment() {
    def environments = ['prod', 'qa', 'staging']
    return choice(name: 'environment', description: 'Choose an environment', choices: environments)
}
  

Затем все, что я хочу сделать, это в задании что-то вроде:

 def envTeams = [:]

for (env in dynamic_params.environment().choices) {
    for (team in dynamic_params.dev_team().choices) {
        envTeams[env] = team
    }
}
......
  

(примеры высмеяны)

Но я получаю org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: No such field found: field

Я даже еще не уверен, что я получаю, когда делаю это, dynamic_params.environment() потому что Дженкинс печатает @choice(name=environment,description=Choose an environment,choices=[prod, qa, staging]) (Означает ли это, что у меня есть класс?)

Спасибо

Комментарии:

1. Ваши методы возвращают choice . У этих методов нет членов, поэтому ваше пространство имен вызова должно быть простым dynamic_params.environment() . Это вернет объект выбора, и вы сможете проанализировать его оттуда.

Ответ №1:

По вашему выбору choice (простите за каламбур) Я понимаю, что вы хотите заполнить параметр задания, прежде чем представить его пользователю, например, на странице «Сборка с параметрами».

Это обычная ловушка: вы хотите запустить некоторый код для подготовки параметра, но для выполнения вашего кода Дженкинсу необходимо запустить ваш конвейер, что происходит после нажатия кнопки «Построить с параметрами».

У вас есть два варианта: либо использовать плагин ActiveChoice, либо запустить конвейер со сценарием перед вашим основным конвейером. В вашем случае это может выглядеть следующим образом:

 my_choice = ''

node('master') {
    stage('prepare choices') {
        println "before: my_choice is ${my_choice}"
        my_choice = get_choices() // def get_choices() { return ['prod', 'qa', 'staging'] }
        println "after: my_choice is ${my_choice}"
    }
}

pipeline {
    agent any

    parameters { choice(name: 'CHOICES', choices: my_choice, description: '') }

    // rest of pipeline
  

Комментарии:

1. Проблема не в этом. На самом деле проблема в том, что у меня нет get_choices() метода, и я не хочу его создавать. Я почти убежден, что этот класс (или структура или что-то еще), который является выбором, должен иметь его уже (т. Е. в моем примере: environment().get_choices() ??)

2. Извините, тогда я не понимаю вашей проблемы 🙂