Задание DSL: как добавить блок конфигурации к ранее сгенерированному XML, если существует несколько таких узлов? - PullRequest
0 голосов
/ 27 апреля 2020

Я использую плагин Active Choices для динамического генерирования значений параметров. К сожалению, Job DSL не поддерживает настройку защищенного сценария . Вот почему я пытаюсь добавить это, используя блок configure Job DSL.

Я использую методы, которые получают контекст задания или контекст параметра или что-то еще. Но из я узнал еще один вопрос , что я не могу получить доступ к сгенерированному XML, используя configure в том же методе, поскольку XML еще не было сгенерировано. Я надеюсь, что понял это право - поэтому в моем случае я вызываю два метода. Первый создает базовую конфигурацию Active Choices, второй добавляет защищенный сценарий Groovy.

Обратите внимание, что я добавляю сценарий Groovy на лету, читая источник сценария Groovy (Branch в данном случае).

      factory.freeStyleJob(jobName) {
        ...
        parameters {
          activeChoiceFormattedHtmlParameter delegate, PARAMETER_BRANCH, BRANCH_PARAMETER_DESCRIPTION, PARAMETER_STAGE, PARAMETER_DATABASE
        }
        ...

        activeChoiceFormattedHtmlScript delegate, PARAMETER_BRANCH, Branch
      }

И мои методы:

    static void activeChoiceFormattedHtmlParameter(Object parameterContext, String parameterName, String parameterDescription, String... referencedParameters) {
      parameterContext.with {
        activeChoiceReactiveReferenceParam(parameterName) {
          description(parameterDescription)
          choiceType(CHOICE_TYPE_FORMATTED_HTML)
          referencedParameters.each { referencedParameter(it) }
        }
      }
    }

Это генерирует:

            <org.biouno.unochoice.DynamicReferenceParameter>
                <name>BRANCH</name>
                <description>...the description...</description>
                <randomName>choice-parameter-12102071997857508</randomName>
                <visibleItemCount>1</visibleItemCount>
                <referencedParameters>STAGE, DATABASE</referencedParameters>
                <choiceType>ET_FORMATTED_HTML</choiceType>
                <omitValueField>false</omitValueField>
                <parameters class="linked-hash-map"/>
            </org.biouno.unochoice.DynamicReferenceParameter>

Затем второй метод:

    static void activeChoiceFormattedHtmlScript(Object jobContext, String parameterName, Class scriptClass) {
      jobContext.with {
        configure { node ->
          def parameterNode = node / 'properties' / 'hudson.model.ParametersDefinitionProperty' / 'parameterDefinitions' / 'org.biouno.unochoice.DynamicReferenceParameter'
          parameterNode << 'script'('class':'org.biouno.unochoice.model.GroovyScript') {
            'secureScript' {
              'script'(ScriptReader.readScript(scriptClass))
              'sandbox'('false')
              'classpath' {
                'entry' {
                  'url'("file:${GROOVY_JAR}")
                }
              }
            }
            'secureFallbackScript' {
              'script'('')
              'sandbox'('false')
            }
          }
        }
      }
    }

Это добавляет скрипт:

            <org.biouno.unochoice.DynamicReferenceParameter>
                <name>BRANCH</name>
                <description>...the description...</description>
                <randomName>choice-parameter-12102071997857508</randomName>
                <visibleItemCount>1</visibleItemCount>
                <referencedParameters>STAGE, DATABASE</referencedParameters>
                <choiceType>ET_FORMATTED_HTML</choiceType>
                <omitValueField>false</omitValueField>
                <parameters class="linked-hash-map"/>
                <script class="org.biouno.unochoice.model.GroovyScript">
                    <secureScript>
                        <script>...the script...</script>
                        <sandbox>false</sandbox>
                        <classpath>
                            <entry>
                                <url>file:/path/to/my/groovy-library.jar</url>
                            </entry>
                        </classpath>
                    </secureScript>
                    <secureFallbackScript>
                        <script/>
                        <sandbox>false</sandbox>
                    </secureFallbackScript>
                </script>
            </org.biouno.unochoice.DynamicReferenceParameter>

А теперь для моей проблемы: Во втором методе configure выбирает первый org.biouno.unochoice.DynamicReferenceParameter. Но так как я хочу добавить больше параметров, мне нужно выбрать его по имени, а не только по первому найденному узлу. В противном случае я всегда перезаписываю сценарий первого параметра, а все остальные параметры не будут иметь сценария Groovy.

Я пытался получить доступ к ... / 'org.biouno.unochoice.DynamicReferenceParameter' / 'name' / parameterName, который работает, но, конечно, пишет в неправильном месте и разрушает <name> узел.

Я также пытался использовать ... / 'org.biouno.unochoice.DynamicReferenceParameter' / 'name' / parameterName, а затем parameterNode.parent, но, похоже, это возвращает null.

Может кто-нибудь дать подсказку? Что я делаю не так?

1 Ответ

0 голосов
/ 29 апреля 2020

ОК, мне удалось получить доступ к нужному узлу, даже если он выглядит не очень элегантно:

    ...
    jobContext.with {
      configure { node ->
        def parameterDefinitionsNode = node / 'properties' / 'hudson.model.ParametersDefinitionProperty' / 'parameterDefinitions'
        def parameters = parameterDefinitionsNode.children().findAll { it.name() == parameterClass }
        for (parameter in parameters) {
          def name = parameter.'name'
          if (name.text() == parameterName) {
            parameter << 'script'('class':'org.biouno.unochoice.model.GroovyScript') {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...