【问题标题】:How to retrieve Jenkins build parameters using the Groovy API?如何使用 Groovy API 检索 Jenkins 构建参数?
【发布时间】:2022-02-07 17:45:18
【问题描述】:

我有一个使用 Perforce 插件的参数化作业,并且想要检索构建参数/属性以及由 Perforce 插件设置的 p4.change 属性。

如何使用 Jenkins Groovy API 检索这些属性?

【问题讨论】:

    标签: groovy jenkins


    【解决方案1】:

    更新:Jenkins 2.x 解决方案:

    使用 Jenkins 2 管道 dsl,您可以使用基于 params (Map) 内置的简单语法直接访问任何参数:

    echo " FOOBAR value: ${params.'FOOBAR'}"

    根据参数类型本身,返回值将是字符串或布尔值。脚本或声明性语法的语法相同。更多信息请访问:https://jenkins.io/doc/book/pipeline/jenkinsfile/#handling-parameters

    如果您的参数名称本身在变量中:

    def paramName = "FOOBAR"
    def paramValue = params.get(paramName) // or: params."${paramName}"
    echo """ FOOBAR value: ${paramValue}"
    

    Jenkins 1.x 的原始答案:

    对于 Jenkins 1.x,语法基于 build.buildVariableResolver 内置函数:

    // ... or if you want the parameter by name ...
    def hardcoded_param = "FOOBAR"
    def resolver = build.buildVariableResolver
    def hardcoded_param_value = resolver.resolve(hardcoded_param)
    

    请注意官方 Jenkins Wiki 页面也详细介绍了这一点,尤其是如何迭代构建参数: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+System+Groovy+script

    重点部分转载如下:

    // get parameters
    def parameters = build?.actions.find{ it instanceof ParametersAction }?.parameters
    parameters.each {
       println "parameter ${it.name}:"
       println it.dump()
    }
    

    【讨论】:

    • 这是失败的“groovy.lang.MissingPropertyException:没有这样的属性:为类构建:WorkflowScript”有什么想法吗?使用 groovy 管道运行参数化 jenkins 作业时,很可能无法访问构建参数。
    • 这个(旧)答案适用于 Jenkins 1.x 服务,而您可能已经通过 Jenkinsfile 在 Jenkins 2.x 环境中尝试过它?
    • 我正在尝试在一个 groovy 管道中访问。但我找到了解决方案(感谢您回答中的线索)。有一个“params”全局,我用来检索构建参数映射。
    • 能否详细说明。我有点卡在这里。“groovy.lang.MissingPropertyException:没有这样的属性:为类构建:WorkflowScript”
    • 再一次,我很确定这只适用于带有参数化 Groovy 脚本插件的旧 Jenkins 1.x,但不适用于 Jenkins 2.x。对于后者,您可以将整个脚本替换为:def value = params.'FOOBAR'。它本质上是由管道 groovy 语法直接支持的。
    【解决方案2】:

    对于解析单个参数(我猜是最常用的),这是我发现的最简单的:

    build.buildVariableResolver.resolve("myparameter")

    在您的 Groovy System 脚本构建步骤中。

    【讨论】:

    • 这导致groovy.lang.MissingPropertyException: No such property: build for class: Script1
    • @dokaspar 因为这适用于 groovy 脚本插件
    • 如果你的 groovy 是一个类,你是怎么做到的?
    【解决方案3】:

    关于参数:

    See this answer first。要获取项目的所有构建列表(根据该答案获得):

    project.builds
    

    当您找到您的特定构建时,您需要使用build.getActions(hudson.model.ParametersAction) 获取所有ParametersAction 类型的操作。然后查询返回的对象以获取您的特定参数。

    关于 p4.change:我怀疑它也被存储为一个动作。在 Jenkins Groovy 控制台中,获取包含 p4.change 的构建的所有操作并检查它们 - 它会让您了解在代码中寻找什么。

    【讨论】:

      【解决方案4】:

      我刚刚完成了这项工作,特别是,使用 Groovy Postbuild 插件,您可以执行以下操作:

      def paramText
      def actionList = manager.build.getActions(hudson.model.ParametersAction)
      if (actionList.size() != 0)
      {
        def pA = actionList.get(0)
        paramText = pA.createVariableResolver(manager.build).resolve("MY_PARAM_NAME")
      }
      

      【讨论】:

        【解决方案5】:

        如果无法对参数名称进行硬编码,我发现这是访问参数的最简单和最好的方法:

        def myParam = env.getProperty(dynamicParamName)
        

        如果参数名称已知并且可以硬编码,则以下 3 行是等效的:

        def myParam = env.getProperty("myParamName")
        def myParam = env.myParamName
        def myParam = myParamName
        

        【讨论】:

        • 我正在寻找一个动态参数,env.getProperty 工作。谢谢。
        【解决方案6】:

        要从 GroovyScript(使用 Pipeline)从当前构建中获取参数化构建参数,您需要做的就是: 假设您有一个名为 VARNAME 的变量。

        def myVariable = env.VARNAME

        【讨论】:

          【解决方案7】:

          获取所有参数:

          System.getenv().each{
            println it
          }
          

          或更复杂:

          def myvariables = getBinding().getVariables()
          for (v in myvariables) {
             echo "${v} " + myvariables.get(v)
          }
          

          您需要为两者禁用“使用 Groovy Sandbox”。

          【讨论】:

          • 后一个对我不起作用,我得到一个空数组
          • 你知道我怎么设置它吗?我可以写一个新问题让你回答
          【解决方案8】:

          如果您尝试将所有参数传递给 Jenkins 作业,您可以使用 groovy 管道中的全局变量 params 来获取它。

          http://jenkins_host:8080/pipeline-syntax/globals

          参数

          使用类似下面的东西。

          def dumpParameter()
          {
            params.each {
              println it.key + " = " + it.value
            }
          }
          

          【讨论】:

            【解决方案9】:

            感谢patrice-n!此代码用于获取排队和正在运行的作业及其参数:

            import hudson.model.Job
            import hudson.model.ParametersAction
            import hudson.model.Queue
            import jenkins.model.Jenkins
            
            println("================================================")
            for (Job job : Jenkins.instanceOrNull.getAllItems(Job.class)) {
                if (job.isInQueue()) {
                    println("------------------------------------------------")
                    println("InQueue " + job.name)
            
                    Queue.Item queue = job.getQueueItem()
                    if (queue != null) {
                        println(queue.params)
                    }
                }
                if (job.isBuilding()) {
                    println("------------------------------------------------")
                    println("Building " + job.name)
            
                    def build = job.getBuilds().getLastBuild()
                    def parameters = build?.getAllActions().find{ it instanceof ParametersAction }?.parameters
                    parameters.each {
                        def dump = it.dump()
                        println "parameter ${it.name}: ${dump}"
                    }
                }
            }
            println("================================================")
            

            【讨论】:

              【解决方案10】:

              以下可用于检索环境参数:

              println System.getenv("MY_PARAM") 
              

              【讨论】:

              • IIRC,Groovy 脚本在主服务器上运行,而不是在从服务器上运行。不过,自从我提出最初的问题以来,情况可能已经发生了变化。
              【解决方案11】:

              以下 sn-p 为我在参数化项目中获取参数值工作:
              String myParameter = this.getProperty('binding').getVariable('MY_PARAMETER')

              目标是根据所选项目参数动态锁定资源。

              在“[✓] 此构建需要可锁定的资源”中,我有以下“[✓] Groovy 表达式”:

              if (resourceName == 'resource_lock_name') {
                  Binding binding = this.getProperty('binding')
                  String profile = binding.getVariable('BUILD_PROFILE')
              
                  return profile == '-Poradb' // acquire lock if "oradb" profile is selected
              }
              
              return false
              

              在“[✓] 这个项目是参数化的”部分中,我有一个名为“选择参数”的例如BUILD_PROFILE 选择示例如下:

              -Poradb
              -Ph2db
              -DskipTests -T4
              

              只有在带参数构建项目时选择了“-Poradb”,才会获取“resource_lock_name”上的锁

              [-] 应取消选中使用 Groovy Sandbox 以使此语法正常工作

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-12-19
                • 2015-03-25
                • 2013-09-30
                • 1970-01-01
                • 1970-01-01
                • 2012-01-19
                • 1970-01-01
                相关资源
                最近更新 更多