Jenkins方法无法获取变量(groovy.lang.MissingPropertyException:无此属性:类变量:groovy.语言绑定)

ffscu2ro  于 2022-11-01  发布在  Jenkins
关注(0)|答案(2)|浏览(698)

目前,我正在尝试制作这个(简化的)Jenkins管道脚本。请帮助我找到如何正确传递字符串VAR 1。我尝试使用裸露的VAR 1、{var 1}、“{VAR 1}"或类似下面的(我知道有些看起来很愚蠢,但我有点绝望),但没有任何效果。

def VAR1 = 'build architectures'
def BuildANew(variables)
{
   echo "Build declaration"
   build job: 'LocalJenkins', parameters:[
        extendedChoice(name: 'VAR1', value: ${VAR1}),
        param(name:'Variables', value:variables)
    ]
}

pipeline{
   ...
   stages{
      stage("Build"){
         parallel{
            stage("Build1"){
               agent{
                  label 'label'
               }
               steps{
                  BuildANew(parameters)
               }
            }
         }
      }
   }
}

它返回了以下错误:

groovy.lang.MissingPropertyException: No such property: VAR1 for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:271)
    at org.kohsuke.groovy.sandbox.impl.Checker$7.call(Checker.java:353)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:357)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29)
    at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
    at WorkflowScript.BuildANew(WorkflowScript:39)
    at WorkflowScript.run(WorkflowScript:155)
  • 谢谢-谢谢
fv2wmkja

fv2wmkja1#

在Groovy脚本中,作用域可以不同于一个典型的类本身。因此,如果你从其他函数访问全局变量,你需要显式地改变它们的scope。为了改变变量的作用域,你可以使用@Field注解,将变量的作用域从局部变量改为Script class变量。
你有两个选择。

使用@Field注解更改变量的作用域

import groovy.transform.Field

@Field def VAR1 = 'build architectures'

def BuildANew(variables)
{
   echo "Build declaration"
   build job: 'LocalJenkins', parameters:[
        extendedChoice(name: 'VAR1', value: ${VAR1}),
        param(name:'Variables', value:variables)
    ]
}

pipeline{
   ...
   stages{
      stage("Build"){
         parallel{
            stage("Build1"){
               agent{
                  label 'label'
               }
               steps{
                  BuildANew(parameters)
               }
            }
         }
      }
   }
}

将变量从管道传递给函数

def VAR1 = 'build architectures'
def BuildANew(variables, VAR1)
{
   echo "Build declaration"
   build job: 'LocalJenkins', parameters:[
        extendedChoice(name: 'VAR1', value: ${VAR1}),
        param(name:'Variables', value:variables)
    ]
}

pipeline{
   ...
   stages{
      stage("Build"){
         parallel{
            stage("Build1"){
               agent{
                  label 'label'
               }
               steps{
                  BuildANew(parameters, VAR1)
               }
            }
         }
      }
   }
}

如果你想读更多。有一个很好的解释here

ippsafx7

ippsafx72#

我找到了解决办法,可能不完美,但它的工作,目前。

VAR1 = 'build architectures'
def BuildANew(variables)
{
   echo "Build declaration"
   build job: 'LocalJenkins', parameters:[
        extendedChoice(name: 'VAR1', value: ${VAR1}),
        param(name:'Variables', value:variables)
    ]
}

相关问题