将 CruiseControl.NET 设置为持续监控服务器






4.68/5 (8投票s)
本文旨在展示如何安装、配置 CruiseControl.NET,并通过运行计划任务使其执行持续监控。
引言
本文旨在展示如何安装、配置 CruiseControl.NET,并通过运行计划任务使其执行持续监控。
一旦您了解了设置思路,就可以很容易地将此概念扩展到执行以下方面的持续监控:
- 关键系统(数据库、Web 服务等)的运行状况监控
- 报告生成
- 批处理作业
- 通过 RSS 消耗或通过 FTP 导出供其他应用程序使用
为了让 CruiseControl.NET 能够用作监控服务器,您需要能够:
- 像在 Windows 中使用 Cruise Control Triggers 计划任务一样,在特定时间间隔安排任务的发生。
- 通过将监控应用程序的输出合并到构建报告页面,向用户提供任务失败/成功的反馈。
本文将重点介绍如何将计划功能与一个简单的 URL 监控程序结合起来。
注意:有许多方法可以实现 URL 监控;本示例仅提供了一种方法,用于展示如何将任何控制台输出获取到构建报告中。
所需软件
您可以从 这里 下载 CruiseControl.NET 1.3,我已使用所有默认选项安装了它。
注意:CruiseControl 1.4 是当前最新版本,本教程应该适用于它,尽管我尚未对其进行测试。
CruiseControl.NET 将使用 NAnt 来运行我们的控制台应用程序。您可以从 这里 下载 NAnt 0.85,然后将其解压到您的工具目录下。
安装 CruiseControl.NET 后,安装过程应该会在您的默认网站下配置一个名为 ccnet 的虚拟目录,并安装和启动 CruiseControl.NET 服务。
通过访问 https:///ccnet 来检查一切是否正常运行。您应该会看到 Web 仪表板加载,但没有配置项目。
现在,我们准备好:
- 创建简单的控制台应用程序来监控 URL
- 配置和计划 CruiseControl.NET 来运行我们的应用程序
- 在构建报告中显示控制台输出
1. 监控应用程序
此监控应用程序是一个简单的控制台应用程序,它将返回 0
或 1
,取决于 URL 检查是否成功。
该应用程序会将 URL 检查状态的简单信息输出到控制台。控制台应用程序输出的任何内容都将作为 NAnt 构建信息的一部分存储,并合并到构建报告中。如果您的程序引发了未捕获的异常,CruiseControl 将假定为失败。
控制台应用程序的 C# 代码如下:
Program.cs
using System;
using System.Net;
namespace MonitoringApplication
{
class Program
{
static int Main(string[] args)
{
string url = args[0];
string timestamp = DateTime.Now.ToString("HH:mm:ss ");
try
{
WebRequest request = WebRequest.Create(url);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine(timestamp + " Successfully connected to: "+ url);
return 0;
}
catch (Exception ex)
{
Console.WriteLine(timestamp + " Failed to connect to: "+ url);
Console.WriteLine(timestamp + " "+ ex.Message);
return 1;
}
}
}
}
2. 在 CruiseControl.NET 中计划项目
对于我们的 URL 监控示例,我们希望计划一个控制台应用程序在特定时间运行。
下面的代码展示了如何在 ccnet.config 中设置 <project>
定义的 <triggers>
部分,以实现以下计划:
- 程序将在周一至周五,上午 8 点至下午 6 点之间,每 15 分钟运行一次。
- 周六和周日不运行。
您需要在下面的配置中指定您自己的 <workingDirectory>
;该目录应包含应用程序和构建文件。
有关 <FilterTrigger>
的更多信息,请参阅 此处的文档,有关 NAnt <task>
的更详细信息,请参阅 此处的文档。
C:\Program Files\CruiseControl.NET\server\ccnet.config
<cruisecontrol>
<project name="Url Test">
<workingDirectory>[specify your working directory]</workingDirectory>
<triggers>
<filterTrigger startTime="18:00" endTime="08:30">
<trigger type="filterTrigger" startTime="0:00" endTime="23:59:59">
<trigger type="intervalTrigger" name="continuous"
seconds="900" buildCondition="ForceBuild"/>
<weekDays>
<weekDay>Saturday</weekDay>
<weekDay>Sunday</weekDay>
</weekDays>
</trigger>
</filterTrigger>
</triggers>
<tasks>
<nant>
<executable>C:\Program Files\Utils\nant-0.85\bin\NAnt.exe</executable>
<nologo>true</nologo>
<buildFile>C:\dev\MonitoringApplication\bin\Debug\
urltest.build</buildFile>
<targetList>
<target>UrlTest</target>
</targetList>
<buildTimeoutSeconds>300</buildTimeoutSeconds>
</nant>
</tasks>
</project>
</cruisecontrol>
3. 创建 NAnt 构建文件来运行应用程序
上面 ccnet.config 文件中引用的 <buildFile>
是 CruiseControl.NET 用于执行控制台应用程序的文件。在构建文件中,我通过 <exec>
任务的命令行参数传递了我想要测试的 URL。
有关 NAnt 文件的更多信息,请 单击此处,特别是有关 <exec>
任务的文档 在此处。
<您设置的 workingDirectory>\urltest.build
<?xml version="1.0" ?>
<project name="Url.Test" default="UrlTest"
xmlns="http://nant.sf.net/schemas/nant.xsd">
<property name="root" value="${path::get-full-path('.')}"/>
<property name="name" value="MonitoringApplication.exe"/>
<target name="UrlTest">
<exec verbose="true" append="true"
output="urltest.log" program="${root}\${name}"
commandline="http://www.yahoo.com" />
</target>
</project>
现在,您应该可以在 https:///ccnet 的 Web 仪表板上看到您的项目,并强制构建来测试控制台应用程序。尝试使用无效 URL 进行测试,您应该会看到与下图类似的输出。您会注意到,在失败时,您看不到错误原因,只知道它失败了。

接下来,我们将控制台输出合并到构建报告中,以改进错误报告。
CruiseControl.NET 没有运行我的程序或没有显示任何错误,我可以在哪里找到构建或 NAnt 日志?
- 首先要做的是检查您的构建文件是否能从命令行正常工作。
- 检查 CruiseControl.NET 构建和 NAnt 日志文件。可以通过点击您想检查的构建并在左侧选择相应的链接来访问它们。
- 如果您在 ccnet.config 的
<project>
部分使用了相对于<workingDirectory>
的相对路径,请尝试使用完整路径来消除任何路径错误。
4. 将控制台输出合并到构建报告页面
默认情况下,控制台应用程序的输出不包含在构建报告页面中。当一切正常工作时,这无关紧要,但当应用程序失败时,我们希望能够通过 CruiseControl.NET Web 仪表板看到发生了什么,而无需翻阅日志文件。
CruiseControl.NET 有一个可扩展样式表的列表,这些样式表将应用于构建输出。您可以在 dashboard.config 中通过 buildReportBuildPlugin
部分进行配置。
下面,您可以看到我添加了自己的 XSL 文件来样式化控制台应用程序的输出:
C:\Program Files\CruiseControl.NET\webdashboard\dashboard.config
<-- Snip -->
<buildReportBuildPlugin>
<xslFileNames>
<xslFile>xsl\header.xsl</xslFile>
<xslFile>xsl\ConsoleOutput.xsl</xslFile>
<-- Snip -->
现在,创建一个名为 ConsoleOuput.xsl 的新文件,并将其放在 C:\Program Files\CruiseControl.NET\webdashboard\xsl 目录下。
C:\Program Files\CruiseControl.NET\webdashboard\xsl\ConsoleOuput.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:variable name="messages"
select="/cruisecontrol//task[@name='exec']/message" />
<xsl:variable name="messages.count" select="count($messages)" />
<table class="section-table" cellpadding="2" cellspacing="0" border="0">
<tr>
<td colspan="2" class="sectionheader">Console Output</td>
</tr>
<tr>
<td colspan="2" class="header-data">
<xsl:choose>
<xsl:when test="$messages.count > 0">
<xsl:apply-templates select="$messages"/>
</xsl:when>
<xsl:otherwise>
No console output found
</xsl:otherwise>
</xsl:choose>
</td>
</tr>
</table>
</xsl:template>
<xsl:template match="message">
<xsl:value-of select="text()"/><br/>
</xsl:template>
</xsl:stylesheet>
XSL 如何工作超出了本文的范围,但我将简要讨论上述突出显示的区域。
- 我们设置了条件来从构建日志文件中提取正确的元素。
- 创建一个变量来测试我们是否有消息要显示。
- 如果我们有消息,则应用我们的简单模板来显示每条消息。
注意:如果您的控制台应用程序每行输出一个关键字,并且您只选择带有该关键字的特定消息,那么您可以使 XML 提取更智能。
现在,当构建失败时,您将获得控制台应用程序生成的所有信息。

远程监控和构建错误通知
每当监控应用程序失败时,结果就可以通过 CC.Net Web 仪表板轻松提供给任何用户,并且订阅了使用 CCTray 的项目的用户也能收到通知。CCTray 可以从 这里 下载,它允许用户订阅他们感兴趣的特定项目并获得状态通知。

贷方
本文的灵感来自 Scott Hanselman 的一个播客 - HanselMinutes,当时他采访了 Owen Rogers 关于持续监控。
Steve Trefethen 也创建了一个使用 CruiseControl 的定制解决方案,它是他完成的 EDI 发票项目的一部分;请查看文章以获取关于可以做什么的一些绝佳想法。
请通过任何评论、建议和反馈与我联系!
修订历史
2008-07-16
- 文章已迁移至 The Code Project
- 添加了致谢部分
- 将应用程序输出的 XSL 移至单独的文件,并将其添加为构建报告插件。
- 更改了文章措辞和布局
2008-06-09
- 文章已发布