我正在尝试将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
答案 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]]]]]]
尽管在本地尝试使用所有依赖库都不可行。