尝试从Jenkinsfile源构建AST时引发NullPointerException

时间:2019-07-06 15:42:47

标签: jenkins groovy abstract-syntax-tree

我正在尝试将Jenkinsfile解析为AST,以便可以对其进行验证(而不是使用复杂的正则表达式)。

在我的groovysh会话中:

groovy:000> filePath = "/Users/ashleyconnor/Projects/Jenkins/Jenkinsfile"
===> /Users/ashleyconnor/Projects/Jenkins/Jenkinsfile

groovy:000> file = new File(filePath)
===> /Users/ashleyconnor/Projects/Jenkins/Jenkinsfile

groovy:000> ast = new AstBuilder().buildFromString(CompilePhase.CONVERSION, false, file.text)
ERROR java.lang.NullPointerException:
null
        at java_lang_Runnable$run.call (Unknown Source)

将代码写入源文件并通过groovy AST.groovy运行会产生不同的错误:

Caught: groovy.lang.MissingPropertyException: No such property: CompilePhase for class: AST
groovy.lang.MissingPropertyException: No such property: CompilePhase for class: AST
    at AST.run(AST.groovy:5)

Jenkinsfile的内容可用here

Groovy Version: 2.5.7 JVM: 1.8.0_121 Vendor: Oracle Corporation OS: Mac OS X

2 个答案:

答案 0 :(得分:1)

@Library('github.com/fabric8io/fabric8-pipeline-library@master')

我也有一半时间犯了这个错误,您需要在结尾加上下划线。

@Library('github.com/fabric8io/fabric8-pipeline-library@master') _

然后将第一行设置为#!groovy

我感到非常奇怪,您无法在Groovy管道中使用这些顶级def。 Jenkins Groovy的执行方式与在命令行上说Groovy的执行方式稍有不同。我将这些顶级def-if语句放在node闭包的 内。 (我知道您正在尝试一些聪明的isCD()方法……但是我的建议是首先使其与node中的所有内容一起使用,然后再添加if语句。

答案 1 :(得分:0)

将前两个参数拖放到buildFromString可以解决此问题:

import org.codehaus.groovy.ast.builder.AstBuilder;

def filePath = "/Users/ashleyconnor/Projects/Jenkins/Jenkinsfile"
def file = new File(filePath)
def ast = new AstBuilder().buildFromString(file.text)
println(ast)

输出:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script200423567329429.groovy: 3: unable to resolve class Library ,  unable to find class for annotation
 @ line 3, column 1.
   @Library('github.com/fabric8io/fabric8-pipeline-library@master')
   ^

Script200423567329429.groovy: 5: unable to resolve class io.fabric8.Utils
 @ line 5, column 13.
   def utils = new io.fabric8.Utils()
               ^

2 errors

Jenkinsfile更改为包含println("Hello World")会产生AST:

[org.codehaus.groovy.ast.stmt.BlockStatement@d9f41[org.codehaus.groovy.ast.stmt.ReturnStatement@e8fd7[expression:org.codehaus.groovy.ast.expr.MethodCallExpression@e8fd7[object: org.codehaus.groovy.ast.expr.VariableExpression@d9f41[variable: this] method: ConstantExpression[println] arguments: org.codehaus.groovy.ast.expr.ArgumentListExpression@eadde[ConstantExpression[Hello world]]]]]]

尽管在本地尝试使用所有依赖库都不可行。