在Jenkins构建步骤中,如何从Groovy脚本访问Windows环境变量?

59

我正在使用Scriptler插件,以便将Groovy脚本作为构建步骤运行。我的Jenkins从机在Windows服务模式下运行。使用Scriptler,我无需使用Windows批处理脚本。

但是我在构建步骤中遇到了获取环境变量的问题......以下内容有效:

System.getenv("BASE")

其中BASE是Jenkins启动时的环境变量之一。然而,我想要获取

%JOB_NAME%

如果我要添加一个“执行Windows批处理命令”的构建步骤:

echo %JOB_NAME%

它有效。 如果我使用相同的设置将Scriptler脚本作为构建步骤添加:

println "JOB_NAME: " + System.getenv("JOB_NAME")
我得到的是:
JOB_NAME: null

那么,我如何在 Groovy 脚本作为构建步骤时访问注入的环境变量?


请参阅https://stackoverflow.com/questions/40215394/how-to-get-environment-variable-in-jenkins-groovy-script-console。 - undefined
9个回答

63

buildlistener对象在系统Groovy执行期间被呈现。你可以这样做:

def myVar = build.getEnvironment(listener).get('myVar')

2
谢谢!这似乎是在“执行系统Groovy脚本”构建步骤中访问env变量的唯一方法。 - Torben Knerr
对我来说不起作用,出现“将环境变量注入为构建包装时出现问题:null”的错误。没有其他错误详细信息,如何调试这种情况? - Mando
1
该问题陈述为“我正在使用Scriptler插件...”,这需要系统Groovy执行,因此不能回答该问题。 - christutty
8
在这种情况下,“listener”是什么意思? - dokaspar
6
当我在函数内尝试这样做时,出现了groovy.lang.MissingPropertyException: No such property: build for class: WorkflowScript的错误。 - micseydel
显示剩余4条评论

20

你可以这样获取它们:

def thr = Thread.currentThread()
def build = thr?.executable
def envVarsMap = build.parent.builds[0].properties.get("envVars")

1
在Windows环境中,envVarsMap对于某些环境变量返回null?有任何想法为什么会这样? - jayant singh
2
在共享库中使用Jenkins v2.190.2进行测试: groovy.lang.MissingPropertyException: No such property: executable for class: java.lang.Thread - Lucas Cimon

17

在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

如果您正在从文件中使用Groovy,那么简单的System.getenv('MY_VARIABLE')就足够了。


5
我发现这个方法在Jenkins 2.89版本也适用: def env = binding.build.environment; println env.FOO - Allan Lewis
1
@AllanLewis 我遇到了 groovy.lang.MissingPropertyException: No such property: build for class: groovy.lang.Binding 的问题... 有什么建议吗? - Marcello DeSales
@MarcellodeSales 在什么上下文中? - Allan Lewis
@AllanLewis 关于全局共享库... 我只能像https://build.intuit.com/services-config/pipeline-syntax/globals#env中那样使用全局属性。请查看我的回答。 - Marcello DeSales
@MarcellodeSales 你说得对,我的解决方案在共享库中不起作用,只能在直接在构建上下文中执行的Groovy脚本中使用。我猜想你的库函数可以将构建作为参数传入。 - Allan Lewis
我发现JavaDoc很有帮助:https://javadoc.jenkins-ci.org/hudson/model/Build.html。 - jaco0646

11

Scriptler Groovy脚本似乎无法获取构建的所有环境变量。但是您可以将它们作为参数强制传递给脚本:

  1. 当您将Scriptler构建步骤添加到作业中时,请选择“定义脚本参数”选项

  2. 为您要传递的每个环境变量添加一个参数。例如,“名称:JOB_NAME”,“值:$JOB_NAME”。该值将使用'$envName'类型变量从Jenkins构建环境中扩展,我个人的经验表明大多数作业配置设置中的字段都支持此类扩展。

  3. 在脚本中,您应该有与参数相同名称的变量,因此您可以使用以下内容访问参数:

    println "JOB_NAME = $JOB_NAME"

除一些实验之外,我自己没有使用过Sciptler,但是您的问题提出了一个有趣的问题。我希望这能有所帮助!


这种方法的一个问题(假设变量设置为MYVAR)是,如果未提供值作为参数,Groovy将会“崩溃”。要查看传递了什么,请尝试以下操作:println“ - >提供了以下值:” this.binding.variables.each {k,v-> println“$k ='$v'”} - Steven the Easily Amused

6

3
这是针对流水线的,问题涉及Scriptler插件。 - Will Brode

6

在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}"

这是在运行CentOS 6.7的Jenkins 1.624上。


3

需要注意的一点是,如果您正在使用自由式作业,除非您使用系统Groovy脚本构建步骤,否则无法访问构建参数或Jenkins JVM环境。我在搜索和研究了几个小时之后才收集到足够的线索找到这个答案。


1
这在Linux中也适用。 - Cummings

0

System Groovy 脚本(Jenkins 2.89)中,我能够使用环境变量来禁用另一个 Jenkins 作业

import jenkins.*
import jenkins.model.*
def env = binding.build.environment
Jenkins.instance.getItemByFullName(env.job_name).setDisabled(false) 

我还添加了一个条件步骤,以便启用或禁用另一个Jenkins作业。

enter image description here

谢谢 @Allan Lewis,你的评论很有帮助。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接