#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. Извините, тогда я не понимаю вашей проблемы 🙂