为什么Groovy的power assert在Jenkins作业中不起作用

f0brbegy  于 6个月前  发布在  Jenkins
关注(0)|答案(3)|浏览(51)

PowerAssert在/脚本中工作,但在Jenkinsfile驱动的作业中不工作。为什么?有办法让它工作吗?
在Jenkinsfile作业中:

assert 1 == 2

at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:404)
... wall of stack trace

字符串
In /script窗口

Assertion failed: 

assert 1 == 2
         |
         false


在这个简单的例子中,很容易弄清楚发生了什么。在实践中,“==”的一个或两个操作数将是一个变量。在/script版本中,它将显示值(参见上面的链接)。在Jenkinsfile控制台日志中,您只会得到assert语句,没有提示。
在@daggett问题之后添加:

node ()
  {
  stage('assert')
    {
    try 
      {
      two = 2
      assert 1==two 
      }
    catch(Throwable t)
      {
      println t
      error "assert failed"
      }
    }
  }


产出:

Assertion failed: 

assert 1==two

nukf8bse

nukf8bse1#

据我所知,这是不可能的。Jenkins管道groovy DSL在解释groovy时使用自定义CPS解释器。这意味着它绕过/覆盖了groovy的许多标准实现,因此也是assert实现。Jenkins管道CPS的assert实现可以在这里找到,而真实的groovy实现在assert求值期间使用此类,以便记录值并打印适当的异常。
为了在Jenkins管道CPS中获得类似的行为,需要重构groovy代码库和Jenkins CPS代码,或者复制上面链接的AssertionWriter类中的大量功能。

y4ekin9u

y4ekin9u2#

旧的讨论,但现在,2023-11-07,此管道执行assert

pipeline {
    agent any
    stages {
        stage('Assert') {
            steps {
                script {
                    assert 1 == 2
                }
            }
        }
    }
}

字符串
正如预期的那样,Jenkins失败并显示:

Also:   org.jenkinsci.plugins.workflow.actions.ErrorAction$ErrorId: 89ab84d9-9d75-4bec-b0c5-b63db969d0d1
hudson.remoting.ProxyException: Assertion failed: 

assert 1 == 2

    at org.codehaus.groovy.runtime.InvokerHelper.assertFailed(InvokerHelper.java:420)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed(ScriptBytecodeAdapter.java:663)
...


请注意,steps{}中的script{}具有可以工作的assert

eqfvzcg8

eqfvzcg83#

这是一个黑客的例子,有点工作:

def ASSERT_EQ (def arg1, def arg2)
  {
  if (arg1 != arg2)
    {
    println ('arg1 = ' + arg1 + " " + arg1.getClass())
    println ('arg2 = ' + arg2 + " " + arg2.getClass())
    }
  assert arg1 == arg2
  }

字符串
它远不如普通的groovy powerAssert那么健壮。

相关问题