我正在尝试为jenkins制作测试结果的仪表板(由os / hardware / ect标签动态过滤)。
jenkins将测试结果从xml文件保存到中央数据库(最好是postgres)的最佳方法是什么?
sql插件似乎被设计为由其他插件使用。
我应该从jenkins.groovy
脚本调用java sql apis吗?
答案 0 :(得分:7)
几种可能性:
使用现有的Java sql库和Grab
有几个世界级的java sql库(https://commons.apache.org/proper/commons-dbutils/,https://github.com/jOOQ/jOOQ),您可以在管道中与Grab一起使用。我个人喜欢jooq。然后你在groovy中编写你的特定代码。
@Grab(group='org.jooq', module='jooq', version='3.10.5')
import ...
使用现有的java库并将其放在类路径
上像上面的解决方案一样。但是你不用Grab导入库。而是直接从战争中启动jenkins,您可以维护自己的码头安装(https://wiki.jenkins.io/display/JENKINS/Jetty)。这使您可以自由地将其他库添加到类路径中,然后可以在管道中使用它。
编写一个java库并将其与Grab或classpath一起使用
而不是使用通用库并在groovy中编写您的特定要求。您可以创建一个库,该库提供满足您需求的API。您可以使用Grab导入它,或者将其添加到应用程序服务器的类路径中。在你的groovy脚本中,你只需要调用特定的API并传递参数。
编写自己的插件
你可以为你的目的编写一个插件,这并不是那么困难https://jenkins.io/doc/developer/plugin-development/pipeline-integration/。该插件将文件路径作为参数。合同将是xml文件的结构(xml架构)。您还可以添加参数来控制导入。
个人意见:
我会选择“编写一个java库并将其与Grab或classpath一起使用”:
@GrabResolver(name='custom', root='http://customserver/repo', m2Compatible='true')
答案 1 :(得分:4)
您也可以通过数据库REST API来完成。 只需在管道中调用sh并将工件放入数据库中。
sh("curl http://database:8080/api --verbose -X PUT \
-H "Content-Type: application/xml"
...
)
答案 2 :(得分:4)
我们在公司(以及我参与的其他一些项目)使用的是FluentD。您可以找到维护良好的Jenkins插件here或here。
主要功能是:发送任何有效的json,稍后可以使用自己的工具进行分析,比如ELK堆栈(你可以找到很多HOWTO文章)或其他一些堆栈。
为何选择FluentD?我猜它在作者的github页面上清楚地说明:“我们的选择是使用Fluentd看起来足够成熟以处理大量数据,并且它支持许多目标端点(DB,文件,http等)。”数据输出可以是您想要的任何Hadoop,Mongo,S3,AWS / Azure服务或任何现有数据库(https://www.fluentd.org/dataoutputs),以及大量可视化。
我假设您可以问“为什么不将它直接推送到数据库?”。答案是 - 您需要以特定格式推送它,并且数据不会轻易地格式化为另一种格式。即您已经构建了自己的工具,但后来意识到您可以使用Kibana,因此您需要迁移。如果你开始使用FluentD,你唯一应该考虑的是如何格式化json,这比设计数据库要简单得多。此外,FluentD具有高度可扩展性并支持强大的故障转移。
另一个潜在的问题是将您提到的XML作为测试输出转换为json。首先,很多测试运行器都支持json格式化。其次,有一种从xml中生成json的常用方法,我会建议像“xml2json”这样的工具,它做得非常好:
XML JSON
<e/> "e": null
<e>text</e> "e": "text"
<e name="value" /> "e": { "@name": "value" }
<e name="value">text</e> "e": { "@name": "value", "#text": "text" }
<e> <a>text</a ><b>text</b> </e> "e": { "a": "text", "b": "text" }
<e> <a>text</a> <a>text</a> </e> "e": { "a": ["text", "text"] }
<e> text <a>text</a> </e> "e": { "#text": "text", "a": "text" }