Как отправить значение referencedParameters в конвейере Дженкинса для CascadeChoiceParameter в ScriptlerScript - PullRequest
1 голос
/ 21 мая 2019

Я объявляю 2 параметра в секции properties конвейера Jenkins:

  • центр обработки данных (может иметь несколько типов среды)
  • тип окружения

Центр обработки данных имеет тип ChoiceParameter ;список извлекается из базы данных;при изменении центра обработки данных в раскрывающемся списке типы среды должны заполняться соответствующим образом, в том числе из базы данных, через ScriptlerScript .Проблема заключается в том, что при изменении выбора в центре обработки данных ничего не происходит для списка типов среды, который представляет собой CascadeChoiceParameter с referencedParameters: 'DataCenter' .Как связать указанный параметр со сценарием скриптлета, который я использую - что мне нужно отправить?

Проблема с [name: 'DataCenter', значение: '$ DataCenter'] для второго параметра - значение не отправляется в ScriptletScript при изменении первого раскрывающегося значения.Если я определяю 2 параметра из интерфейса Jenkins - а не через конвейер DSL - в разделе Configure , все работает как положено.Я не могу использовать что-то кроме раздела properties - я пытался использовать activeChoiceParameter внутри pipe section, но я получаю ошибку 'Определения параметров сборки не могут иметь блоки @ line (...) ', что является известной проблемой (см. Ссылку на первый пример ниже).Примеры, которые я использовал: Параметр активного выбора Jenkinsfile Активный выбор Реактивный эталонный параметр в конвейере jenkins

properties([
  parameters([
    [
      $class: 'ChoiceParameter', 
      choiceType: 'PT_SINGLE_SELECT', 
      name: 'DataCenter', 
      script: [
        $class: 'ScriptlerScript', 
        scriptlerScriptId:'getdatacenters.groovy',
        parameters: [
          [name:'StatusId', value:'']
        ]
      ]
    ],
    [
      $class: 'CascadeChoiceParameter',
      choiceType: 'PT_SINGLE_SELECT',
      name: 'EnvironmentType', 
      script: [
        $class: 'ScriptlerScript',
        scriptlerScriptId:'getenvtypesbydatacenter.groovy',
        referencedParameters: 'DataCenter',
        parameters: [
          [name:'DataCenter', value: '$DataCenter']
        ]
      ]
    ]
  ])
])

pipeline {
...

Ожидаемый результат: Второй раскрывающийся список заполняется при изменении центра обработки данных Фактический результат: Ничего не происходит при изменении центра обработки данных

Конвейер с параметрами, настроенными в пользовательском интерфейсе - ведет себя нормально (загрузка типов среды при изменении центра обработки данных):

screenshot

1 Ответ

0 голосов
/ 06 июня 2019

Следует помнить одну вещь: Скриптлеры не защищены, их не следует использовать: https://wiki.jenkins.io/display/JENKINS/Scriptler+Plugin! .

При этом, если вы все еще хотите пойти и использовать плагин Scriptler и CascadeChoiceParameter , код может выглядеть следующим образом:

properties([
    parameters([
        [
            $class: 'ChoiceParameter', 
            choiceType: 'PT_SINGLE_SELECT', 
            name: 'DataCenter', 
            randomName: 'datacenter-choice-parameter-102102304304506506', 
            script: [
                $class: 'ScriptlerScript', 
                scriptlerScriptId:'getdatacenters.groovy',
                fallbackScript: [ classpath: [], script: 'return ["N/A"]']
            ]
        ],
        [
            $class: 'CascadeChoiceParameter',
            choiceType: 'PT_SINGLE_SELECT',
            name: 'EnvironmentType', 
            randomName: 'envtype-choice-parameter-101012020230303404', 
            referencedParameters: 'DataCenter',
            script: [
                $class: 'ScriptlerScript',
                scriptlerScriptId:'getenvtypesbydatacenter.groovy',
                fallbackScript: [ classpath: [], script: 'return ["N/A"]'],
            ]
        ]
    ])
])

Groovy-код для getdatacenters.groovy для демонстрационных целей (но может быть получен из БД в качестве альтернативы):

return["Dev","Prod"]

Groovy-код для getenvtypesbydatacenter.groovy может выглядеть следующим образом:

import groovy.sql.Sql
import jenkins.model.*

nodes = Jenkins.instance.globalNodeProperties
nodes.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
sql = Sql.newInstance("jdbc:sqlserver://SQLServerHere;connectionDataHere", "com.microsoft.sqlserver.jdbc.SQLServerDriver")

envTypes = sql.rows("exec [DbHere].[schema].[GetEnvTypes] @DataCenter = $DataCenter").collect({ query -> query.EnvTypeName})
envTypes.add(0,'')
return envTypes

Здесь важно отметить, что referencedParameters: 'DataCenter' находился не внутри блока скрипта, а на «корневом» уровне. Если вам нужно больше параметров, вы можете разделить их запятой.

Поскольку DataCenter является ссылочным параметром и автоматически передается в скриптлер, переменная $ DataCenter изнутри SQL-запроса будет сопоставлена ​​с его значением. Как примечание, DataCenter должен быть добавлен как параметр сценария в разделе UI Parameters .

Кредиты за решение отправляются в CloudBees.

...