Job DSL: как добавить блок конфигурации к ранее сгенерированному XML, если таких узлов несколько?

Я использую плагин Active Choices для динамического создания значений параметров. К сожалению, задание 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.

Кто-нибудь может намекнуть? Что я делаю неправильно?


person eerriicc    schedule 27.04.2020    source источник


Ответы (1)


Хорошо, мне удалось получить доступ к требуемому узлу, даже если он кажется не очень элегантным:

    ...
    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') {
person eerriicc    schedule 29.04.2020