【问题标题】:Variables defined in groovy script always resolve to nullgroovy 脚本中定义的变量总是解析为 null
【发布时间】:2014-03-13 14:34:20
【问题描述】:

我正在尝试在我们的一项工作中使用系统 groovy 脚本作为构建步骤来操作一些变量:

//Current Thread run
def thr = Thread.currentThread()  
def current_build = thr?.executable

//Get upstream job
def parent_build = current_build.getCause(hudson.model.Cause.UpstreamCause).getUpstreamRun()

//Upstream job build vars
def parentMap = parent_build.getBuildVariables()

println "ParentbuildMap.get(OSType) = " + parentMap.get("OSType")
println "ParentbuildMap.get(DBType) = " + parentMap.get("DBType")

//TODO insert SQL script here to populate OS_MACHINE and DB_MACHINE
def OS_MACHINE = parentMap.get("OSType") + ": ##Machine_Name##"
def DB_MACHINE = parentMap.get("DBType") + ": **Machine_Name**"

现在,当我尝试这样打印它们时,它会很好地打印值:

println "OS_MACHINE = " + OS_MACHINE
println "DB_MACHINE = " + DB_MACHINE

但是当我尝试以下操作时,它只会打印 null:

println build.buildVariableResolver.resolve(OS_MACHINE)

即使我尝试这样做,它也会打印 null:

def thr = Thread.currentThread()  
def current_build = thr?.executable

def buildMap = build.getBuildVariables()

println "buildMap.get(OS_MACHINE) = " + buildMap.get("OS_MACHINE")
println "buildMap.get(DB_MACHINE) = " + buildMap.get("DB_MACHINE")

当我尝试这个时:

def params = [
  new StringParameterValue('JOB_OS_MACHINE', OS_MACHINE),
  new StringParameterValue('JOB_DB_MACHINE', DB_MACHINE),
  ]

build.addAction(new ParametersAction(params))

println "buildMap.get(JOB_OS_MACHINE) = " + buildMap.get("JOB_OS_MACHINE")
println "buildMap.get(JOB_DB_MACHINE) = " + buildMap.get("JOB_DB_MACHINE")

在这种情况下,如果我将 OS_MACHINE 和 DB_MACHINE 替换为纯字符串,它甚至都不起作用

我现在恢复为在新作业上运行一个非常简单的脚本,该脚本来自: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+System+Groovy+script

import hudson.model.*

// get current thread / Executor
def thr = Thread.currentThread()
// get current build
def build = thr?.executable


// ... or 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}"

这也打印 null。

对于我的一生,我无法理解这里出了什么问题......谁能帮助我吗?

【问题讨论】:

  • 您可以尝试不使用def 关键字,以便变量进入绑定吗?
  • 它在 groovy.lang.Binding.setVariable 处抛出一个 NPE
  • 我对 Groovy 了解不多,但有可能这些是环境变量而不是构建变量,因此“buildVariableResolver”无法访问?我使用def relnum= manager.build.getEnvVars()["RELNUM"]println "${relnum}"
  • 我的问题特别是这个块不起作用:def params = [ new StringParameterValue('JOB_OS_MACHINE', OS_MACHINE), new StringParameterValue('JOB_DB_MACHINE', DB_MACHINE), ] build.addAction(new ParametersAction (参数))

标签: groovy jenkins


【解决方案1】:

可以在 Jenkins 用户列表存档中找到 solution。您在创建新的 StringParameterValue 对象并将它们添加到构建 ParametersAction 方面处于正确的轨道上。

上面链接的解决方案与为我编写的完全不一样(可能是因为我使用的是旧版本的 Jenkins 1.466.2)。 createUpdated 方法未被识别,因此我在我的代码中复制了它,我将在下面发布。

// sets build parameters based on the given map
// only supports StringParameterValue
def setBuildParameters(parmMap) {
  def npl = new ArrayList<StringParameterValue>()
  for (k in parmMap.keySet()) {
     npl.add(new StringParameterValue(k, parmMap.get(k)))
  }
  def newPa = null
  def oldPa = build.getAction(ParametersAction.class)

  if (oldPa != null) {
    for (oldp in oldPa) {
      if (! parmMap.containsKey(oldp.name)) {  //oldp was not overridden by the new list
        npl.add(oldp)
      }
    }
    build.actions.remove(oldPa)
  }
  newPa = new ParametersAction(npl)
  build.actions.add(newPa)
}

【讨论】:

  • 感谢您的回答,但我不明白这与我正在做的事情有何不同 - 为了将新参数附加到构建参数中,我必须做一个包含您所建议的两者的全新列表?
  • 原来我的问题的答案是肯定的:你必须用一个新的ParameterAction替换旧的(可以包含旧的+你想插入的任何新参数)脚本@EricP建议为我工作。
【解决方案2】:

很抱歉现在才添加答案,但我遇到了同样的问题,阅读这篇文章给了我一个解决方案:

  • 只需在 jenkins 作业中添加一个与您的变量同名的字符串参数。

因此,解析器会在 env 参数中找到值,作为 jenkins 构建变量。

这样做可以解决我的问题。

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 2017-10-03
    • 2021-12-31
    • 2015-06-21
    • 1970-01-01
    • 2019-05-30
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多