65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.68/5 (8投票s)

2008 年 7 月 16 日

CPOL

6分钟阅读

viewsIcon

89292

本文旨在展示如何安装、配置 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 仪表板加载,但没有配置项目。

现在,我们准备好:

  1. 创建简单的控制台应用程序来监控 URL
  2. 配置和计划 CruiseControl.NET 来运行我们的应用程序
  3. 在构建报告中显示控制台输出

1. 监控应用程序

此监控应用程序是一个简单的控制台应用程序,它将返回 01,取决于 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 日志?
  1. 首先要做的是检查您的构建文件是否能从命令行正常工作。
  2. 检查 CruiseControl.NET 构建和 NAnt 日志文件。可以通过点击您想检查的构建并在左侧选择相应的链接来访问它们。
  3. 如果您在 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 如何工作超出了本文的范围,但我将简要讨论上述突出显示的区域。

  1. 我们设置了条件来从构建日志文件中提取正确的元素。
  2. 创建一个变量来测试我们是否有消息要显示。
  3. 如果我们有消息,则应用我们的简单模板来显示每条消息。

注意:如果您的控制台应用程序每行输出一个关键字,并且您只选择带有该关键字的特定消息,那么您可以使 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

  • 文章已发布
© . All rights reserved.