当前位置: 首页 > 知识库问答 >
问题:

groovy脚本中定义的变量始终解析为null

鲜于谦
2023-03-14

我正在尝试使用系统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)

即使我尝试这个,它也会打印空值:

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/ParameterizedSystem Groovy脚本

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。

对我来说,我无法理解这里出了什么问题...有人能帮我吗?

共有2个答案

童琪
2023-03-14

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

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

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

这样做解决了我的问题。

伍心水
2023-03-14

可以在Jenkins用户列表存档中找到解决方案。您正在正确地创建新的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)
}
 类似资料:
  • 问题内容: 我想将“ $ WORSKPACE”变量用于jenkins脚本调用的常规文件。但是在SO上找到的所有解决方案都失败了: 我得到的消息:脚本不允许使用groovy.lang.GroovyObject方法setProperty java.lang.String java.lang.Object(JenkinsHelper.name)。管理员可以决定是批准还是拒绝此签名。 对设置为允许Jenk

  • 拉斯宾(杰西)-root@RaspberryPi-腻子 在我输入的终端中 现在我得到了一个包含此代码的脚本 有一个cronjob每小时启动一次这个脚本 苏。一定有什么地方出错了。因为他将变量$finalanswer解读为nothing。 这意味着在此脚本之外定义的变量将不起作用? 我该如何解决这个问题?

  • 我必须从我的 Groovy 脚本访问一个环境变量。我没有使用詹金斯。如何获取变量?

  • 问题内容: 我刚开始学习groovy,我想将svnSourcePath和svnDestPath传递给svn copy命令中的shell脚本。但是网址未呈现。 输出量 问题答案: 在变量周围添加了单引号和加operator(’+ variable +’)。现在正在工作

  • 我正在使用gradle和bash脚本在docker图像中构建几个android应用程序。该脚本由运行docker映像的jenkins触发。在bash脚本中,我收集有关构建成功的信息。我想将该信息传递给jenkinsfile的groovy脚本。我试图在docker容器中创建一个txt文件,但jenkinsfile中的groovy脚本找不到该文件。这是我的jenkinsfile的groovy脚本: 在

  • 我可以将类实例声明为全局实例,如下所示: 但是如果管道调用“vars”目录中定义为groovy脚本的函数,不再可见 我也尝试使用@Field,但它并没有改变什么。请注意,所有管道都是在共享库中定义的(jenkinsfile项目只调用此共享库中的一个函数)。 在本例中,如何从/vars中的groovy脚本访问gitUtils? 我知道我们可以将该实例作为/vars中声明的函数的参数传递,但使用实用类