例如,我有一个包含一些属性的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,我希望它更简单。
DSL是特定于上下文的,不能在上下文之外运行。
你可以试试
以下是我最终如何做到我想要的:
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 问题答案: 解析时间时,就是在您当前的位置进行解析,只要您期望的那样
我在我的Tomcat/Java应用程序中有一个解析代码的GroovyShell实例。解析非常慢,100行大约1秒。在分析应用程序时,我注意到解析抛出了大量java.lang.ClassNotFoundException异常。我想有什么东西在吞噬它们,因为我在原木的任何地方都没有看到它们。由于脚本使用了大量主应用程序的类,所以我假设这就是导致应用程序变慢的原因。 有没有办法让我捕捉那些异常并获取它们
请帮助::我如何处理这些每一个。每一个或为每一个或什么?我有一个.xml我正试图用Groovy脚本解析。下面是.xml: 下面是我的Groovy脚本: 结果如下: 我的问题是:我可以在的代码块中放入什么代码 为了单独打印每个项,如“port”和“protocol”等等,对于.xml块“connector”的每个实例?多谢了。