Подтвердить что ты не робот

Как получить доступ к параметрам в параметризованной сборке?

Как вы получаете доступ к parameters, установленному в разделе "Эта сборка параметризируется" в задаче "Рабочий процесс" Дженкинса?

ИСПЫТАТЕЛЬНЫЙ СЛУЧАЙ

  • Создайте задание WORKFLOW.
  • Включить "Эта сборка параметризирована".
  • Добавьте ПАРАМЕТР STRING foo со значением по умолчанию bar text.
  • Добавьте код ниже Workflow Script:

    node()
    {
         print "DEBUG: parameter foo = ${env.foo}"
    }
    
  • Запустить задание.

РЕЗУЛЬТАТ

DEBUG: parameter foo = null

4b9b3361

Ответ 1

Я думаю, что переменная доступна напрямую, а не через env, при использовании плагина Workflow. Попробуйте:

node()
{
    print "DEBUG: parameter foo = ${foo}"
}

Ответ 2

Я попробовал несколько решений из этой темы. Казалось, что это работает, но мои ценности всегда были правдой, и я также столкнулся с проблемой: JENKINS-40235

Мне удалось использовать параметры в groovy jenkinsfile, используя следующий синтаксис: params.myVariable

Вот рабочий пример:

Решение

print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"

Более подробный (и рабочий) пример:

node() {
   // adds job parameters within jenkinsfile
   properties([
     parameters([
       booleanParam(
         defaultValue: false,
         description: 'isFoo should be false',
         name: 'isFoo'
       ),
       booleanParam(
         defaultValue: true,
         description: 'isBar should be true',
         name: 'isBar'
       ),
     ])
   ])

   // test the false value
   print 'DEBUG: parameter isFoo = ' + params.isFoo
   print "DEBUG: parameter isFoo = ${params.isFoo}"
   sh "echo sh isFoo is ${params.isFoo}"
   if (params.isFoo) { print "THIS SHOULD NOT DISPLAY" }

   // test the true value
   print 'DEBUG: parameter isBar = ' + params.isBar
   print "DEBUG: parameter isBar = ${params.isBar}"
   sh "echo sh isBar is ${params.isBar}"
   if (params.isBar) { print "this should display" }
}

Выход

[Pipeline] {
[Pipeline] properties
WARNING: The properties step will remove all JobPropertys currently configured in this job, either from the UI or from an earlier properties step.
This includes configuration for discarding old builds, parameters, concurrent builds and build triggers.
WARNING: Removing existing job property 'This project is parameterized'
WARNING: Removing existing job property 'Build triggers'
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] sh
[wegotrade-test-job] Running shell script
+ echo sh isFoo is false
sh isFoo is false
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] sh
[wegotrade-test-job] Running shell script
+ echo sh isBar is true
sh isBar is true
[Pipeline] echo
this should display
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Я отправил Pull Request, чтобы обновить вводящий в заблуждение руководство по конвейеру # build -параметры, которые гласят: "они доступны как переменные groovy с тем же именем".;)

Редактировать: Как сказал Джесси Глик: Примечания к выпуску подробнее...

Вы также должны обновить Плагин работы трубопровода до версии 2.7 или более поздней, чтобы параметры сборки определялись как переменные среды и, следовательно, были доступны, как если бы они были глобальными переменными groovy.

Ответ 3

Когда вы добавляете параметр сборки, foo, он преобразуется в нечто, что действует как "голая переменная", поэтому в script вы бы сделали:

node {
   echo foo
}

Если вы посмотрите на реализацию рабочего процесса script, вы увидите, что при выполнении script класс WorkflowScript динамически генерируется. Все утверждения в script выполняются в контексте этого класса. Все параметры сборки, переданные до этого script, преобразуются в свойства, доступные из этого класса.

Например, вы можете:

node {
    getProperty("foo")
}

Если вам интересно, вот рабочий процесс script Я написал, какие попытки распечатать параметры сборки, переменные среды и методы в классе WorkflowScript.

node {
   echo "I am a "+getClass().getName()

   echo "PARAMETERS"
   echo "=========="
   echo getBinding().getVariables().getClass().getName()
   def myvariables = getBinding().getVariables()
   for (v in myvariables) {
       echo "${v} " + myvariables.get(v)
   }
   echo STRING_PARAM1.getClass().getName()

   echo "METHODS"
   echo "======="
   def methods = getMetaClass().getMethods()

   for (method in methods) {
       echo method.getName()    
   } 

   echo "PROPERTIES"
   echo "=========="
   properties.each{ k, v -> 
       println "${k} ${v}" 
   }
   echo properties
   echo properties["class"].getName()

   echo "ENVIRONMENT VARIABLES"
   echo "======================"
   echo "env is " + env.getClass().getName()
   def envvars = env.getEnvironment()
   envvars.each{ k, v ->
        println "${k} ${v}"
   }
}

Вот еще один пример кода, который я пробовал, где я хотел проверить, чтобы увидеть если был установлен параметр сборки.

node {
   groovy.lang.Binding myBinding = getBinding()
   boolean mybool = myBinding.hasVariable("STRING_PARAM1")
   echo mybool.toString()
   if (mybool) {
       echo STRING_PARAM1
       echo getProperty("STRING_PARAM1")
   } else {
       echo "STRING_PARAM1 is not defined"
   }

   mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")
   if (mybool) {
       echo DID_NOT_DEFINE_THIS
       echo getProperty("DID_NOT_DEFINE_THIS")
   } else {
       echo "DID_NOT_DEFINE_THIS is not defined"
   }
}

Ответ 4

К параметрической переменной добавьте префикс "params." Например:

params.myParam

Не забывайте: если вы используете какой-либо метод myParam, возможно, вам следует одобрить его в "Script одобрении".

Ответ 5

Используйте двойные кавычки вместо одиночных кавычек

например. echo "$ foo" в отличие от echo '$ foo'

Если вы сконфигурировали конвейер для приема параметров с помощью параметра "Сборка с параметрами", эти параметры доступны как переменные Groovy с тем же именем. См. здесь.

Вы можете оставить точку с запятой (;), отбросить круглые скобки ((и)) и использовать одинарные кавычки (') вместо double ( ") , если вам не нужно выполнять замену переменных См. Здесь. Это привело меня в мою проблему, хотя я обнаружил, что для его работы требуется только double (").

Ответ 6

Обратите внимание, что путь доступа к параметрам сборки внутри сценариев конвейера (плагин конвейера) изменился. Этот подход: getBinding().hasVariable("MY_PARAM") Больше не работает. Попробуйте это вместо этого: def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false

Ответ 7

Надеемся, что для вас работает следующий фрагмент кода:

def item = hudson.model.Hudson.instance.getItem('MyJob')

def value = item.lastBuild.getEnvironment(null).get('foo')

Ответ 8

Следующий фрагмент дает вам доступ ко всем параметрам Job

    def myparams = currentBuild.rawBuild.getAction(ParametersAction)
    for( p in myparams ) {
        pMap[p.name.toString()] = p.value.toString()
    }

Ответ 9

По Учебник по плагину трубопровода:

Если вы сконфигурировали конвейер для приема параметров при его создании - Build with Parameters - они доступны как переменные Groovy с тем же именем.

Поэтому попробуйте напрямую обращаться к переменной, например:

node()
{
     print "DEBUG: parameter foo = " + foo
     print "DEBUG: parameter bar = ${bar}"
}