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

Создание переменной среды 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]]

Я делаю это правильно, могу ли я создать новую переменную среды, и есть ли лучшее решение для этого.

4b9b3361

Ответ 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 скрипте и получить измененное значение в пакетном скрипте после того, как продолжить работу.