Доступ к созданию переменных среды из скрипта Groovy на этапе сборки Jenkins (Windows)
Я использую плагин Scriptler, поэтому я могу запустить Groovy скрипт в качестве шага сборки. Мои подчиненные Jenkins работают на окнах в сервисном режиме. С скриптлером мне не нужно использовать пакетные скрипты Windows.
Но у меня проблемы с получением переменных среды на этапе сборки... Это работает:
System.getenv("BASE")
куда BASE
является частью env-vars при запуске jenkins. Тем не менее, я хотел бы получить
%JOB_NAME%
Если я добавляю шаг сборки "Выполнить пакетную команду Windows":
echo %JOB_NAME%
Оно работает. Если я добавляю скрипт-скрипт в качестве шага сборки с теми же настройками:
println "JOB_NAME: " + System.getenv("JOB_NAME")
Я собираюсь:
JOB_NAME: null
Итак, как я могу получить внедренные переменные среды из Groovy сценария в качестве шага сборки?
9 ответов
Скриптовый скрипт Groovy, похоже, не получает все переменные среды сборки. Но то, что вы можете сделать, это ввести их в сценарий как параметры:
Когда вы добавляете шаг сборки Scriptler в свою работу, выберите опцию "Определить параметры скрипта"
Добавьте параметр для каждой переменной среды, которую вы хотите передать. Например, "Имя: JOB_NAME", "Значение: $JOB_NAME". Значение будет расширено из среды сборки Jenkins с использованием переменных типа '$envName', большинство полей в настройках конфигурации работы поддерживают такое расширение по моему опыту.
В вашем скрипте у вас должна быть переменная с тем же именем, что и у параметра, чтобы вы могли получить доступ к параметрам с помощью чего-то вроде:
println "JOB_NAME = $ JOB_NAME"
Я не использовал Sciptler самостоятельно, кроме экспериментов, но ваш вопрос поставил интересную проблему. Надеюсь, это поможет!
Слушатель и сборка объектов присутствуют во время исполнения системы. Вы можете сделать это:
def myVar = build.getEnvironment(listener).get('myVar')
Вы можете получить их так:
def thr = Thread.currentThread()
def build = thr?.executable
def envVarsMap = build.parent.builds[0].properties.get("envVars")
На jenkins 2.x, с плагином groovy 2.0, работающим с SystemGroovyScript, мне удалось получить переменные для сборки, как показано ниже:
def build = this.getProperty('binding').getVariable('build')
def listener = this.getProperty('binding').getVariable('listener')
def env = build.getEnvironment(listener)
println env.MY_VARIABLE
Если вы используете goovy из файла, просто System.getenv('MY_VARIABLE')
достаточно
Единственный способ заставить это работать (в Linux) - следовать этому совету:
https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+System+Groovy+script
import hudson.model.*
// get current thread / Executor and current build
def thr = Thread.currentThread()
def build = thr?.executable
// if you want the parameter by name ...
def hardcoded_param = "FOOBAR"
def resolver = build.buildVariableResolver
def hardcoded_param_value = resolver.resolve(hardcoded_param)
println "param ${hardcoded_param} value : ${hardcoded_param_value}"
Это на Jenkins 1.624, работающем на CentOS 6.7
Jenkins 2.x имеет глобальные переменные. env
это один из них из любого сценария...
println env.JOB_NAME
Больше на https://build.intuit.com/services-config/pipeline-syntax/globals
Стоит отметить, что если вы используете вольную работу, вы не сможете получить доступ к параметрам сборки или среде JVM Jenkins, ЕСЛИ ВЫ не используете шаги сборки System Groovy Script. Я часами гуглял и исследовал, прежде чем собрать достаточно подсказок, чтобы понять это.
Что в конечном итоге сработало для меня: как получить переменную среды в консоли сценариев Jenkins Groovy?
import jenkins.model.Jenkins
def envVars = Jenkins.instance.getGlobalNodeProperties()[0].getEnvVars()
println envVars['myVar']
В System Groovy Script (Jenkins 2.89) я смог использовать переменную окружения, чтобы отключить другое задание Jenkins.
import jenkins.*
import jenkins.model.*
def env = binding.build.environment
Jenkins.instance.getItemByFullName(env.job_name).setDisabled(false)
Я также добавил условный шаг, чтобы включить или отключить другое задание Jenkins.
Спасибо @Allan Lewis, ваш комментарий был полезен.