【问题标题】:Access to this blocks Jenkins Pipelines script访问此块 Jenkins Pipelines 脚本
【发布时间】:2016-07-07 13:19:38
【问题描述】:

我有以下测试 Groovy 脚本要添加为 varsworkflow-libs

#!/usr/bin/groovy

this.test = false

def setTest(boolean test) { this.test = test }

def getTest() { this.test }

def log(level, msg) {
    echo "[${level}] ${msg}"
}

def call(msg) {
    if (this.test) log('TEST', msg)
}

我把这个脚本放在workflow-libs/vars/test.groovy下。

当我执行以下管道时:

node {
  test 'foo'
}

该过程永远不会完成,但如果我删除 if (this.test) 则它会正常完成,尽管我得出的结论是访问 this 对象存在问题?

有人遇到过类似的行为吗?

Jenkins 是 1.651.3 时的最新版本。

【问题讨论】:

    标签: jenkins groovy jenkins-pipeline


    【解决方案1】:

    在 groovy 中 this.test 调用自动生成的或现有的 getter getTest() (doc)。您的脚本只是陷入了无限递归。

    Here 解释了如何直接访问 groovy 中的字段,尽管我不确定它是否可以在 Pipelines 中工作。

    或者,您可以只使用脚本范围的变量test 而不是this.test。或者将 this.test 重命名为与访问器方法名称不同的名称,例如 this._test

    【讨论】:

    • 谢谢@izzeki,你的提示最终让我挖掘了更多对象,发现实际参数位于 this.binding.variables 下,这是一个 Map 对象,如果我将发现作为答案有人感兴趣或可以提供更好的解决方案
    • 当然@tbo。您可能会发现知道 Binding 不可序列化但它具有 Map getVariables() 方法也很有用。
    【解决方案2】:

    最后我设法通过使用thisbinding 对象解决了这个问题,如下所示:

    def enableTest(enable = true) {
        // this goes to binding variables
        this.test = enable }
    

    使用变量集(如果已设置!)

    if (this.binding.variables['test'] && this.test) {
      // do something usefull
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 2021-03-16
      相关资源
      最近更新 更多