如何使用Jenkins运行,测试和终止HTTP服务器?

时间:2014-04-15 19:57:41

标签: jenkins

我正在建立一个正在构建RESTful HTTP服务的团队。我们在设置Jenkins CI作业时遇到问题,该作业将构建服务,在后台运行,执行一些测试,然后终止服务器。

具体细节

  • 服务器是使用hapi框架在Node.js中构建的,并且有一些用mocha编写的单元测试。
  • 测试是使用Maven用Java编写的。 (为什么不进行基于node.js的测试?因为我们的测试部门已经投入时间来创建基于Java的REST测试框架。)
  • 如果基于节点的单元测试失败或者java测试失败,构建应该失败。
  • 我们的Jenkins盒子由公司其他地方的支持团队经营;我们的构建在Linux slave上执行。

当前尝试

我们现在有一些类似的工作,但它不可靠。我们使用3个构建步骤:

第一个构建步骤是Execute Shell步骤,其中包含以下命令:

npm install
npm test
node server.js ./test-config.json &

其次,我们执行Invoke Maven 3步骤,指向测试pom.xml

第三,我们运行Invoke Standalone Sonar Analysis来进行静态代码分析。

这大部分都有效,但我们依赖于Jenkins' ProcessTreeKiller在作业完成后停止服务。我们总是收到警告:Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+buildfor more information

不幸的是,我们有过这样的情况:服务很快终止(在测试完成之前)或服务根本没有终止(导致后续构建失败,因为端口已经在使用)。

所以我们需要更可靠的东西。

尝试失败

我们尝试设置一个shell脚本来处理启动服务,运行maven,终止服务,然后输出退出代码。但这并没有成功,因为mvn命令在命令行中不可用。我们的Jenkins有多个maven版本(也有jdks版本),我不知道他们在奴隶身上的位置,或者如何在不使用Invoke Maven 3构建步骤的情况下使用它们。

我们已经玩弄了一些解决这个问题的想法,但希望得到其他可能解决Jenkins类似问题的指导。

  1. 让服务在一段时间后自行终止。问题在于弄清楚让他们跑多久。
  2. 添加构建步骤以在我们完成后终止服务。问题是如果maven执行失败,后续步骤将无法运行。 (如果我们告诉maven忽略测试失败,那么如果构建失败,构建就不会显示为已损坏。)
  3. 尝试将任何现有服务进程视为构建的第一步和最后一步。问题是其他团队也使用这些Jenkins从属设备,所以我们需要确保在我们完成构建时终止服务。
  4. 通过Maven启动和停止node.js服务,执行this blog suggests之类的操作。问题是我们不知道Jenkins是否会将生成的后台任务识别为"泄露的文件描述符"在我们完成测试之前杀掉它。
  5. 如果Jenkins有一个"构建后的动作"那将是很好的。让你运行一个清理脚本。或者,如果它有一个"执行后台进程"构建步骤将在构建结束时终止后台项目。但我找不到那样的东西。

    有没有人设法让Jenkins像这样远程做任何事情?

1 个答案:

答案 0 :(得分:3)

一些头脑风暴:

  • 您可以全局或按次调用关闭Jenkins ProcessTreeKiller。我不确定为什么这不是你的选择。

  • 在回应#2时,有几个选项:

    1. 无论构建步骤是否失败,都会执行构建后操作。这将是触发“服务清理”任务的好方法,无论构建状态如何,该任务都将运行。
    2. 您可以使用 Any Build Step 插件将任何构建步骤设置为构建后操作,也可以使用 Post Build Tasks 插件,后者甚至提供了定义触发条件的选项。
  • 您可以使用 Text-finder plugin

  • 根据RegEx条件更改构建状态
  • 您可以设置 Conditional Build Steps 。 “条件”甚至可能是某些脚本执行的结果