当前位置: 首页 > 知识库问答 >
问题:

如何从Groovy代码解析Jenkinsfile

漆雕疏珂
2023-03-14

例如,我有一个包含一些属性的Jenkinsfile

trace = false

userNotifications = [
    build_master :                 [name : 'name',
                                    email : 'email',
                                    slackid: 'slack id',
                                    slackchannel: 'slack channel']
]
env.aProperty = "aValue"
node('COMPILE')
{
...
}

我想在groovy代码中解析上面的Jenkinsfile,以便访问一些属性值。

当我像这样使用GroovyShell时

        Binding binding = new Binding()
        GroovyShell shell = new GroovyShell(binding)
        Object groovyDsl = shell.evaluate(clean)

我得到这个错误

groovy.lang.MissingMethodException: No signature of method: Script1.node() is applicable for argument types: (String, Script1$_run_closure1) values: [COMPILE, Script1$_run_closure1@7d804e7]

我可能能够通过一些Groovy元编程绕过特定错误,但是,我不确定这是否是正确的方向。我的问题是,在Groovy代码中解析Jenkinsfile的最佳方法是什么?这就是Groovy DSL,我希望它更简单。

共有2个答案

谢俊英
2023-03-14

DSL是特定于上下文的,不能在上下文之外运行。

你可以试试

  • 管理Jenkins下的脚本控制台
年运珧
2023-03-14

以下是我最终如何做到我想要的:

import org.codehaus.groovy.control.CompilerConfiguration

class JenkinsfileParser {
    static void main(String[] args) {
        LinkedHashMap vars = JenkinsfileParser.parse('Jenkinsfile' as File)
        println vars.toString()
    }

    static LinkedHashMap parse(File jenkinsfile) {
        CompilerConfiguration config = new CompilerConfiguration()
        config.scriptBaseClass = JenkinsfileBaseClass.class.name
        Binding binding = new Binding()
        GroovyShell shell = new GroovyShell(this.class.classLoader, binding, config)
        String clean = jenkinsfile.text.replace('import hudson.model.*', '')
                .replace('import hudson.EnvVars', '')
        Script script = shell.parse(clean)
        script.run()
        return binding.variables
    }

    static abstract class JenkinsfileBaseClass extends Script {
        LinkedHashMap<String, Closure> nodeClosures = new LinkedHashMap<>()
        LinkedHashMap env = new LinkedHashMap()
        CurrentBuild currentBuild = new CurrentBuild()
        LinkedHashMap parallelClosures = new LinkedHashMap<>()

        void node(String name, Closure closure) {
            nodeClosures.put(name, closure)
        }

        void parallel(LinkedHashMap closures) {
            parallelClosures.putAll(closures)
        }

        class CurrentBuild {
            List<String> expectedResults = new ArrayList<>()

            boolean resultIsBetterOrEqualTo(String expected) {
                expectedResults << expected
                return true
            }
        }
    }
}

JenkinsfileBaseClass特定于我的Jenkinsfile,需要对不同的Jenkinsfile进行修改。

相关文件可在此处找到:https://groovy-lang.org/integrating.html

我试着使用实现组:“org”。詹金斯ci。main,名称:“jenkins core”,版本:“2.9”来自maven存储库的包http://repo.jenkins-ci.org/public/,然而,这里似乎没有任何对我的案例有用的东西。

如果有更好或更优雅的方法,请告诉我。

 类似资料:
  • 由于Groovy擅长解析几乎任何东西,因此搜索如何解析Groovy代码不会显示任何好的结果-所以我希望SO社区能够提供帮助:-) 我想为grails领域类编写某种(图形化)编辑器,但不想重新发明轮子。 通过反射检查域类很容易,但是我想更进一步——我想修改代码并将其作为域类文件写回来。 一个问题是反射(以及afaik AST)会丢弃所有注释和格式(格式不是大问题,我可以打印文件)… 我可以在哪里找到

  • IntelliJ的Sonarlint插件对我们的Java代码进行分析,但它不会在同一项目中分析Groovy代码。 我们有一个Grails项目,它在命令行上与sonar runner一起工作。当我安装IntelliJ IDEA Sonarlint插件时,该插件似乎没有从命令行配置中获取设置,并且它没有像编辑器中的Java文件那样显示问题的警告突出显示。 我们的项目使用“代码覆盖率”Grails插件生

  • 问题内容: 我想解析传入的JSON数据,例如: 我使用的代码是: 但是我无法分配任何东西给。有什么建议? 问题答案: 该响应是一个Map,具有单个元素,键为“ 212315952136472”。地图中没有“数据”键。如果要遍历所有条目,请使用以下命令: 如果您知道它是单元素地图,则可以直接访问: 而且,如果您知道ID(例如,如果您使用它来发出请求),则可以更简洁地访问该值:

  • 问题内容: 在下面的示例中,无论您为parseAndPrint函数选择的时区如何,结果始终为“ [日期] 05:00:00 +0000 UTC”。此代码有什么问题?时间应根据您选择的时区而变化。(Go Playground服务器显然是在UTC时区中配置的)。 http://play.golang.org/p/wP207BWYEd 问题答案: 解析时间时,就是在您当前的位置进行解析,只要您期望的那样

  • 请帮助::我如何处理这些每一个。每一个或为每一个或什么?我有一个.xml我正试图用Groovy脚本解析。下面是.xml: 下面是我的Groovy脚本: 结果如下: 我的问题是:我可以在的代码块中放入什么代码 为了单独打印每个项,如“port”和“protocol”等等,对于.xml块“connector”的每个实例?多谢了。

  • 我在我的Tomcat/Java应用程序中有一个解析代码的GroovyShell实例。解析非常慢,100行大约1秒。在分析应用程序时,我注意到解析抛出了大量java.lang.ClassNotFoundException异常。我想有什么东西在吞噬它们,因为我在原木的任何地方都没有看到它们。由于脚本使用了大量主应用程序的类,所以我假设这就是导致应用程序变慢的原因。 有没有办法让我捕捉那些异常并获取它们