Создание переменной среды Jenkins с помощью Groovy
Я думаю, что это еще один простой вопрос, но я не мог заставить работать какие-либо веб-решения. Мой проект принимает номер версии. Каждое число может быть разделено символом '.' или '_'. Я хочу переменную, которая отображает только первые два числа.
Я попробовал написать groovy script, который создает переменную окружения Jenkins.
Я хочу взять первые две цифры вместо всей строки.
//Get the version parameter
def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
env = ['miniVersion':m[0].m[1]]
Я делаю это правильно, могу ли я создать новую переменную среды, и есть ли лучшее решение для этого.
Ответы
Ответ 1
Дженкинс 1.x
Следующий groovy фрагмент должен передать версию (как вы уже поставили) и сохранить ее в переменных задания как "miniVersion".
import hudson.model.*
def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
def minVerVal = m[0]+"."+m[1]
def pa = new ParametersAction([
new StringParameterValue("miniVersion", minVerVal)
])
// add variable to current job
Thread.currentThread().executable.addAction(pa)
Затем переменная будет доступна из других шагов сборки. например.
echo miniVersion=%miniVersion%
Выходы:
miniVersion=12.34
Я считаю, что вам нужно будет использовать "System groovy Script" (только на Master node), в отличие от "Groovy Plugin" - https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin#Groovyplugin-GroovyScriptvsSystemGroovyScript
Дженкинс 2.x
Я считаю, что предыдущее поведение (Jenkins 1.x) перестало работать из-за этой рекомендации по безопасности...
Решение (перефразировано из Рекомендации по безопасности)
Возможно восстановить предыдущее поведение, установив системное свойство hudson.model.ParametersAction.keepUndefinedParameters
на true
. Это потенциально очень опасно и предназначено только для краткосрочного обхода.
java -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war
Чтобы разрешить передавать определенные известные имена параметров в сборку, установите системное свойство hudson.model.ParametersAction.safeParameters
в список безопасных имен параметров, разделенных запятыми.
например.
java -Dhudson.model.ParametersAction.safeParameters=miniVersion,FOO,BAR -jar jenkins.war
Ответ 2
Вы также можете определить переменную без EnvInject Plugin в вашей Groovy System Script:
import hudson.model.*
def build = Thread.currentThread().executable
def pa = new ParametersAction([
new StringParameterValue("FOO", "BAR")
])
build.addAction(pa)
Затем вы можете получить доступ к этой переменной на следующем этапе сборки, который (например) представляет собой командную команду Windows:
@echo off
Setlocal EnableDelayedExpansion
echo FOO=!FOO!
Это эхо показывает вам "FOO = BAR".
Привет
Ответ 3
Jenkins EnvInject Plugin может вам помочь. Он позволяет вводить переменные среды в среду сборки.
Я знаю, что у него есть возможность делать скрипты, поэтому он может делать то, что вы хотите. Я использовал его только для установки простых свойств (например, "LOG_PATH = ${WORKSPACE}\logs" ).
Ответ 4
В качестве других ответов state setting new ParametersAction
- это способ ввода одной или нескольких переменных среды, но когда задание уже параметризовано, добавление нового действия не вступит в силу. Вместо этого вы увидите две ссылки на параметры сборки, указывающие на один и тот же набор параметров, и тот, который вы хотите добавить, будет null
.
Вот фрагмент, обновляющий список параметров в обоих случаях (параметризованное и непараметрированное задание):
import hudson.model.*
def build = Thread.currentThread().executable
def env = System.getenv()
def version = env['currentversion']
def m = version =~/\d{1,2}/
def minVerVal = m[0]+"."+m[1]
def newParams = null
def pl = new ArrayList<StringParameterValue>()
pl.add(new StringParameterValue('miniVersion', miniVerVal))
def oldParams = build.getAction(ParametersAction.class)
if(oldParams != null) {
newParams = oldParams.createUpdated(pl)
build.actions.remove(oldParams)
} else {
newParams = new ParametersAction(pl)
}
build.addAction(newParams)
Ответ 5
Для меня следующее работало в Jenkins 2 (2.73.3)
замещать
def pa = new ParametersAction([new StringParameterValue("FOO", foo)])
build.addAction(pa)
с
def pa = new ParametersAction([new StringParameterValue("FOO", foo)], ["FOO"])
build.addAction(pa)
У ParametersAction, похоже, есть второй конструктор, который позволяет передавать "AdditionalSafeParameters" https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/ParametersAction.java
Ответ 6
После поиска немного, лучшее решение, на мой взгляд, использует hudson.model.EnvironmentContributingAction.
import hudson.model.EnvironmentContributingAction
import hudson.model.AbstractBuild
import hudson.EnvVars
class BuildVariableInjector {
def build
def out
def BuildVariableInjector(build, out) {
this.build = build
this.out = out
}
def addBuildEnvironmentVariable(key, value) {
def action = new VariableInjectionAction(key, value)
build.addAction(action)
//Must call this for action to be added
build.getEnvironment()
}
class VariableInjectionAction implements EnvironmentContributingAction {
private String key
private String value
public VariableInjectionAction(String key, String value) {
this.key = key
this.value = value
}
public void buildEnvVars(AbstractBuild build, EnvVars envVars) {
if (envVars != null && key != null && value != null) {
envVars.put(key, value);
}
}
public String getDisplayName() {
return "VariableInjectionAction";
}
public String getIconFileName() {
return null;
}
public String getUrlName() {
return null;
}
}
}
Я использую этот класс в системе groovy script (используя плагин groovy) в задании.
import hudson.model.*
import java.io.File;
import jenkins.model.Jenkins;
def jenkinsRootDir = build.getEnvVars()["JENKINS_HOME"];
def parent = getClass().getClassLoader()
def loader = new GroovyClassLoader(parent)
def buildVariableInjector = loader.parseClass(new File(jenkinsRootDir + "/userContent/GroovyScripts/BuildVariableInjector.groovy")).newInstance(build, getBinding().out)
def projectBranchDependencies = []
//Some logic to set projectBranchDependencies variable
buildVariableInjector.addBuildEnvironmentVariable("projectBranchDependencies", projectBranchDependencies.join(","));
Затем вы можете получить доступ к переменной projectBranchDependencies в любой другой точке вашей сборки, в моем случае, из ANT script.
Примечание. Я заимствовал/модифицировал идеи для частей этой реализации из сообщения в блоге, но во время этой публикации я не смог найти исходный источник, чтобы отдать должное.
Ответ 7
Просто такая же проблема. Требуется динамически запускать параметризованные нисходящие задания на основе результатов некоторых сценариев groovy.
К сожалению, на наших Jenkins невозможно запустить скрипты System groovy. Поэтому мне пришлось сделать небольшое обходное решение:
-
Запустите groovy script, который создает файл свойств, в котором задана заданная переменная среды
def props = new File("properties.text")
if (props.text == 'foo=bar') {
props.text = 'foo=baz'
} else {
props.text = 'foo=bar'
}
-
Используйте плагин env для впрыскивания переменной, записанной в этот script
Inject environment variable
Property file path: properties.text
После этого я смог использовать переменную 'foo' в качестве параметра для параметризованного триггерного плагина. Какой-то обходной путь. Но работает!
Ответ 8
Моя среда была предыдущей оснасткой, такой как Дженкинс, и работала с пакетными файлами (я знаю, я стар). Таким образом, эти пакетные файлы (и их вспомогательные файлы) используют переменные среды. Это был мой кусок groovy script, который вводит переменные среды. Используемые имена и параметры являются фиктивными.
// The process/batch which uses environment variables
def buildLabel = "SomeVersionNr"
def script = "startBuild.bat"
def processBuilder = new ProcessBuilder(script, buildLabel)
//Inject our environment variables
Map<String, String> env = processBuilder.environment()
env.put("ProjectRoot", "someLocation")
env.put("SomeVar", "Some")
Process p = processBuilder.start()
p.waitFor()
Конечно, если вы установите Jenkins с нуля, вы, вероятно, сделаете это по-другому и поделитесь переменными по-другому или передадите параметры, но это может пригодиться.
Ответ 9
Я застрял. Поэтому я должен написать отличный сценарий, чтобы установить переменную окружения для EDAConnect для программного обеспечения восприятия... Кажется, я не могу заставить все вышеперечисленное работать правильно.
У кого-нибудь есть опыт или подсказки о следующем?
9073039 [ModalContext] ERROR com.perception.scripting.engines.BSFEngine - Exception :
java.security.PrivilegedActionException: org.apache.bsf.BSFException: исключение из Groovy: org.codehaus.groovy.control.MultipleCompilationErrorsException: запуск не выполнен, сценарий: 174: невозможно разрешить класс ParametersAction @строка 174, столбец 10.Script: 175:: невозможно разрешить класс StringParameterValue @строка 175, столбец 1.Script: 176: невозможно разрешить класс StringParameterValue @строка 176, столбец 1. 3 ошибки
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.bsf.BSFManager.exec(BSFManager.java:491)
at com.perception.scripting.engines.BSFEngine.execute(BSFEngine.java:89)
at com.perception.scripting.engines.BSFEngine.execute(BSFEngine.java:233)
at com.perception.scripting.core.ScriptingWorker.runEventScript(ScriptingWorker.java:114)
at com.perception.scripting.core.ScriptingWorker.fireEvent(ScriptingWorker.java:350)
at com.perception.scripting.core.ScriptingWorker.fireEvent(ScriptingWorker.java:309)
at com.perception.edac.data.model.scripting.ScriptingController.fireEvent(ScriptingController.java:199)
at com.perception.edaconnect.modules.ds.DSController.fireLoadDesignStructureEvent(DSController.java:614)
at com.perception.edaconnect.modules.wizards.checkin.CheckinMainPage$11$1.run(CheckinMainPage.java:415)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Вызвано: org.apache.bsf.BSFException: исключение из Groovy: org.codehaus.groovy.control.MultipleCompilationErrorsException: сбой запуска, сценарий: 174: не удается разрешить класс ParametersAction @строка 174, столбец 10.Script: 175: невозможно разрешить класс StringParameterValue @строка 175, столбец 1.Script: 176: невозможно разрешить класс StringParameterValue @строка 176, столбец 1. 3 ошибки
at org.codehaus.groovy.bsf.GroovyEngine.exec(GroovyEngine.java:110)
at org.apache.bsf.BSFManager$6.run(BSFManager.java:493)
... 11 more
9073040 [ModalContext] ОШИБКА com.perception.scripting.core.ScriptingWorker - Сбой выполнения скрипта com.perception.scripting.core.ScriptingException: org.apache.bsf.BSFException: исключение из Groovy: org.codehaus.groovy.control.ation.EmpleCr. запуск не выполнен, сценарий: 174: не удается разрешить класс ParametersAction @строка 174, столбец 10.Script: 175: не удается разрешить класс StringParameterValue @строка 175, столбец 1.Script: 176: не удается разрешить класс StringParameterValue @строка 176, столбец 1 3 ошибки
at com.perception.scripting.engines.BSFEngine.execute(BSFEngine.java:94)
at com.perception.scripting.engines.BSFEngine.execute(BSFEngine.java:233)
at com.perception.scripting.core.ScriptingWorker.runEventScript(ScriptingWorker.java:114)
at com.perception.scripting.core.ScriptingWorker.fireEvent(ScriptingWorker.java:350)
at com.perception.scripting.core.ScriptingWorker.fireEvent(ScriptingWorker.java:309)
at com.perception.edac.data.model.scripting.ScriptingController.fireEvent(ScriptingController.java:199)
at com.perception.edaconnect.modules.ds.DSController.fireLoadDesignStructureEvent(DSController.java:614)
at com.perception.edaconnect.modules.wizards.checkin.CheckinMainPage$11$1.run(CheckinMainPage.java:415)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:121)
Вызвано: org.apache.bsf.BSFException: исключение из Groovy: org.codehaus.groovy.control.MultipleCompilationErrorsException: сбой запуска, сценарий: 174: не удается разрешить класс ParametersAction @строка 174, столбец 10.Script: 175: невозможно разрешить класс StringParameterValue @строка 175, столбец 1.Script: 176: невозможно разрешить класс StringParameterValue @строка 176, столбец 1. 3 ошибки
at org.codehaus.groovy.bsf.GroovyEngine.exec(GroovyEngine.java:110)
at org.apache.bsf.BSFManager$6.run(BSFManager.java:493)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.bsf.BSFManager.exec(BSFManager.java:491)
at com.perception.scripting.engines.BSFEngine.execute(BSFEngine.java:89)
... 8 more
Ответ 10
С моей стороны это работало только путем замены существующего параметра.
def artifactNameParam = new StringParameterValue('CopyProjectArtifactName', 'bla bla bla')
build.replaceAction(new ParametersAction(artifactNameParam))
Кроме того, этот скрипт должен быть запущен с системой Groovy.
Заводной должен быть установлен вручную на этой системе и бин дир Groovy должен быть добавлен в путь. Дополнительно в папку lib мне пришлось добавить jenkins-core.jar.
Тогда можно было изменить параметр в groovy скрипте и получить измененное значение в пакетном скрипте после того, как продолжить работу.