При попытке создать AST из исходного кода Jenkinsfile выбрасывается исключение NullPointerException - PullRequest
1 голос
/ 06 июля 2019

Я пытаюсь проанализировать 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 доступно здесь .

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

Ответы [ 2 ]

1 голос
/ 06 июля 2019
@Library('github.com/fabric8io/fabric8-pipeline-library@master')

Я тоже ошибаюсь половину времени, вам нужно заключительное подчеркивание.

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

И, возможно, установите в первой строке значение #!groovy.

И у меня очень странное ощущение, что эти верхние уровни def, которые у вас есть, не будут работать в Groovy Pipeline. Дженкинс Groovy ... в некоторых местах выполняется немного иначе, чем Groovy в командной строке. Я бы поместил эти определения верхнего уровня - и этот оператор if - в закрытие node. (Я знаю, что вы пытаетесь сделать что-то умное isCD() ... но я советую сначала заставить его работать со всем в node, а потом добавить ваши операторы if.

0 голосов
/ 06 июля 2019

Удаление первых двух аргументов для 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]]]]]]

Хотя наличие всех зависимых библиотек, доступных локально, непрактично для того, что я пытаюсь сделать.

...