从jenkins / hudson将测试数据保存到数据库的最佳方法是什么?

时间:2018-02-13 09:25:43

标签: sql jenkins dashboard

我正在尝试为jenkins制作测试结果的仪表板(由os / hardware / ect标签动态过滤)。

jenkins将测试结果从xml文件保存到中央数据库(最好是postgres)的最佳方法是什么?

sql插件似乎被设计为由其他插件使用。

我应该从jenkins.groovy脚本调用java sql apis吗?

3 个答案:

答案 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一起使用”:

  • 单元级别的良好测试可能性,因为简单
  • 没有对jenkins执行具体要求的依赖,也可以在没有jenkins的情况下使用
  • 易于分发,可以部署到任何符合maven标准的存储库并从那里获取@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插件herehere

主要功能是:发送任何有效的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" }