使用Groovy创build一个Jenkins环境variables

我认为这是另一个简单的问题,但我不能得到任何Web解决scheme的工作。 我的项目需要一个版本号。 每个数字可以用“。”分隔。 或“_”。 我想要一个只显示前两个数字的variables。

我试着编写一个创buildJenkins环境variables的groovy脚本。
我想采取前两个数字,而不是整个string。

//Get the version parameter def env = System.getenv() def version = env['currentversion'] def m = version =~/\d{1,2}/ env = ['miniVersion':m[0].m[1]] 

我是否正确地做这件事,我甚至可以创build一个新的环境variables,是否有更好的解决scheme。

jenkins1.x

下面的groovy片段应该通过版本(如你已经提供),并将其作为“miniVersion”存储在作业的variables中。

 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) 

该variables将可以从其他构build步骤访问。 例如

 echo miniVersion=%miniVersion% 

输出:

 miniVersion=12.34 

我相信你需要使用“System Groovy Script”(仅在主节点上)而不是“Groovy Plugin” – https://wiki.jenkins-ci.org/display/JENKINS/Groovy+plugin# Groovyplugin-GroovyScriptvsSystemGroovyScript

jenkins2.x

我相信之前的( Jenkins 1.x )行为因为安全build议而停止工作…

解决scheme(从安全咨询转述)

可以通过将系统属性hudson.model.ParametersAction.keepUndefinedParameters设置为true来恢复以前的行为。 这可能是非常不安全的 ,只能作为短期的解决方法。

 java -Dhudson.model.ParametersAction.keepUndefinedParameters=true -jar jenkins.war 

要允许特定的已知安全参数名称传递到构build,请将系统属性hudson.model.ParametersAction.safeParameters设置为以逗号分隔的安全参数名称列表。

例如

 java -Dhudson.model.ParametersAction.safeParameters=miniVersion,FOO,BAR -jar jenkins.war 

你也可以在你的Groovy系统脚本中定义一个没有EnvInject插件的variables:

 import hudson.model.* def build = Thread.currentThread().executable def pa = new ParametersAction([ new StringParameterValue("FOO", "BAR") ]) build.addAction(pa) 

那么你可以在下一个构build步骤中访问这个variables(例如)是一个windows批处理命令:

 @echo off Setlocal EnableDelayedExpansion echo FOO=!FOO! 

这个回声将显示“FOO = BAR”。

问候

Jenkins EnvInject插件可能会帮助你。 它允许将环境variables注入到构build环境中。

我知道它有一定的脚本function,所以它可以做到你想要的。 我只用它来设置简单的属性(例如“LOG_PATH = $ {WORKSPACE} \ logs”)。

正如其他答案状态设置新的ParametersAction是注入一个或多个环境variables的方式, 但是当一个作业已经参数化添加新的行动将不会生效。 相反,您会看到指向相同参数集的构build参数的两个链接,您要添加的参数将为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) 

在search了一下后,我认为最好的解决scheme是使用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脚本中使用这个类(使用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(",")); 

然后,您可以从您的构build中的任何其他位置访问projectBranchDependenciesvariables,在我的情况下,从ANT脚本访问。

注意:我从一篇博客文章中借用/修改了这个实现的部分思想,但在本文发布的时候,我无法find原始源代码,以便给予应有的信任。

刚刚有同样的问题。 希望根据一些常规脚本的结果dynamic触发参数化的下游作业。

不幸的是,我们的Jenkins不能运行System Groovy脚本。 所以我不得不做一个小的解决方法:

  1. 运行groovy脚本,该脚本创build一个属性文件,在其中指定要设置的环境variables

     def props = new File("properties.text") if (props.text == 'foo=bar') { props.text = 'foo=baz' } else { props.text = 'foo=bar' } 
  2. 使用env注入插件注入写入该脚本的variables

     Inject environment variable Property file path: properties.text 

之后,我可以使用variables'foo'作为参数化触发器插件的参数。 某种解决方法。 但作品!

我的环境是先前的工具,如jenkins,并与batch file(我知道,我是老)运行。 所以这些batch file(及其子batch file)正在使用环境variables。 这是我注入环境variables的一个groovy脚本。 使用的名称和参数是虚拟的。

 // 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,你可能会做不同的事情,并以另一种方式共享variables,或传递参数,但这可能会得心应手。