Доступ к созданию переменных среды из скрипта 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, похоже, не получает все переменные среды сборки. Но то, что вы можете сделать, это ввести их в сценарий как параметры:

  1. Когда вы добавляете шаг сборки Scriptler в свою работу, выберите опцию "Определить параметры скрипта"

  2. Добавьте параметр для каждой переменной среды, которую вы хотите передать. Например, "Имя: JOB_NAME", "Значение: $JOB_NAME". Значение будет расширено из среды сборки Jenkins с использованием переменных типа '$envName', большинство полей в настройках конфигурации работы поддерживают такое расширение по моему опыту.

  3. В вашем скрипте у вас должна быть переменная с тем же именем, что и у параметра, чтобы вы могли получить доступ к параметрам с помощью чего-то вроде:

    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, ваш комментарий был полезен.

Другие вопросы по тегам