在Jenkins构建步骤中从groovy脚本访问构建环境变量(Windows)

Ada*_*ari 47 windows groovy environment-variables jenkins

我正在使用Scriptler插件,所以我可以运行一个groovy脚本作为构建步骤.我的Jenkins奴隶在服务模式下运行在Windows上.使用scriptler,我不需要使用Windows批处理脚本.

但我很难在构建步骤中获取环境变量...这是有效的:

System.getenv("BASE")
Run Code Online (Sandbox Code Playgroud)

哪里BASE是詹金斯启动将env-瓦尔的一部分.但是,我想得到

%JOB_NAME%
Run Code Online (Sandbox Code Playgroud)

如果我正在添加"执行Windows批处理命令"构建步骤:

echo %JOB_NAME%
Run Code Online (Sandbox Code Playgroud)

有用.如果我使用相同的设置添加脚本编写器脚本作为构建步骤:

println "JOB_NAME: " + System.getenv("JOB_NAME")
Run Code Online (Sandbox Code Playgroud)

我越来越:

JOB_NAME: null
Run Code Online (Sandbox Code Playgroud)

那么如何从groovy脚本中获取注入的环境变量作为构建步骤?

小智 52

build在系统常规执行期间存在对象.你可以这样做:

def myVar = build.getBuildVariables().get('myVar')
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,什么是"听众"? (6认同)
  • 在函数内尝试此操作时,我得到 `groovy.lang.MissingPropertyException: No such property: build for class: WorkflowScript` 。 (4认同)
  • 谢谢!这似乎是在"执行系统Groovy脚本"构建步骤中访问env变量的唯一方法. (2认同)

Alf*_*Alf 17

你或许可以这样得到它们:

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

  • 在共享库中使用 jenkins v2.190.2 进行测试:`groovy.lang.MissingPropertyException:没有这样的属性:类的可执行文件:java.lang.Thread` (2认同)

mac*_*3zr 9

Scriptler Groovy脚本似乎没有获得构建的所有环境变量.但是你可以做的是强制它们作为脚本的参数:

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

  2. 为要传入的每个环境变量添加一个参数.例如"Name:JOB_NAME","Value:$ JOB_NAME".该值将使用'$ envName'类型变量从Jenkins构建环境扩展,作业配置设置中的大多数字段支持我的经验中的这种扩展.

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

    println"JOB_NAME = $ JOB_NAME"

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


Aug*_*tto 8

在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
Run Code Online (Sandbox Code Playgroud)

如果你从文件中使用goovy,简单System.getenv('MY_VARIABLE')就足够了

  • 我发现这也适用于Jenkins 2.89:`def env = binding.build.environment; println env.FOO` (3认同)

Mar*_*les 6

Jenkins 2.x 具有全局变量。env是任何脚本中的其中之一......

println env.JOB_NAME
Run Code Online (Sandbox Code Playgroud)

更多信息请访问https://build.intuit.com/services-config/pipeline-syntax/globals#env

  • 这是管道用的吧?问题是关于 Scriptler 插件。 (3认同)

day*_*r4b 5

我能够使用它(在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}"
Run Code Online (Sandbox Code Playgroud)

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