为什么Groovy的权力不能在Jenkins的工作中发挥作用

时间:2018-07-24 11:11:57

标签: jenkins groovy

Power assertions在/ script中工作,但在Jenkinsfile驱动的工作中不工作。 为什么? 有办法使其工作吗?

在Jenkinsfile作业中:

assert 1 == 2

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

在/ 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

2 个答案:

答案 0 :(得分:4)

据我所知不可能。 Jenkins管道groovy DSL在groovy解释期间使用自定义CPS解释器。这意味着它绕过/替代了Groovy的许多标准实现,因此也绕过了assert实现。可以在here中找到Jenkins Pipeline CPS的assert实现,而实际的Groovy实现在assert评估期间使用this类以记录值并打印适当的异常。

为了在Jenkins管道CPS中获得相似的行为,要么需要重构Groovy代码库和Jenkins CPS代码,要么需要复制上面链接的AssertionWriter类中的许多功能。

答案 1 :(得分:0)

这是一种可以完成此类工作的骇客示例:

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

它的鲁棒性不如正常的槽纹功率强。