CruiseControl.Net抱怨xml

时间:2009-02-27 11:40:53

标签: .net continuous-integration cruisecontrol.net build-server

我继承了一个构建失败的现有项目。我可以在ccnet.log文件中看到异常:

Exception: System.Xml.XmlException: Name cannot begin with the '%' character, hexadecimal value 0x25. Line 17, position 100.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
   at System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res, String[] args)
   at System.Xml.XmlTextReaderImpl.ParseQName(Boolean isQName, Int32 startOffset, Int32& colonPos)
   at System.Xml.XmlTextReaderImpl.ParseElement()
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr)
   at ThoughtWorks.CruiseControl.Core.Util.XmlFragmentWriter.WriteNode(XmlReader reader, Boolean defattr)
   at ThoughtWorks.CruiseControl.Core.Util.XmlFragmentWriter.WriteNode(String xml)

知道这是哪个xml文件,我该如何解决?令人讨厌的是构建变为红色,但它没有被添加到最近的构建网页中。

编辑让我澄清一下:这可能发生在构建结束时,可能是因为它试图生成构建报告xml或其他东西(我禁用了所有合并发布者)

4 个答案:

答案 0 :(得分:1)

由于堆栈框架,我不确定这是你的ccnet.config文件:

System.Xml.XmlWriter.WriteNode

......我不相信CC.NET会回写自己的ccnet.config文件。这可能发生在构建期间,没有?

很难准确地说出它在堆栈跟踪中使用的文件。从更高的位置有更多的堆栈帧吗?

无论XML文件是什么,问题出在第17行第100行。

如果您使用的是统计信息,则可能会发现此问题是由统计信息文件引起的。就像我说的,如果没有更完整的堆栈跟踪,很难说。

如果磁盘已完全填满,有时统计信息文件可能会损坏。您可能必须进入并手动更正XML文件的尾部,确保所有元素都正确关闭。

修改

我想到这个问题可能与发布商步骤合并文件有关。在ccnet.config文件中,有一个步骤发生在构建结束时,CC将多个文件(通常是XML文件)合并在一起,并创建一个较大的XML文档,从中生成Web仪表板。我的猜测是你正在合并的其中一个文件包含这个虚假字符,并且合并步骤失败。

在我的配置文件中,有问题的步骤如下所示:

<publishers>
  <merge>
    <files>
      <file>E:\Blah\Cruise Reports\*.xml</file>
    </files>
  </merge>
  ....

查看该文件夹并检查%字符不应该出现的位置。也许你正在吸吮某种根本不是XML的文件。

答案 1 :(得分:1)

最后设法找到问题:构建使用Nant来完成大部分任务并且Nant配置不正确:

  • 它已配置为记录所有调试信息
  • log4net配置为在&lt;&gt;中记录内容nant.exe.config中的括号

因此,当ccnet尝试将nant输出与构建输出合并时,构建失败。

非常感谢大家的帮助!

答案 2 :(得分:0)

很可能是CC.NET安装目录中的 ccnet.config

答案 3 :(得分:0)

有一点需要注意 - 如果您在巡航控制项目中指定构建任务,则不必专门告诉它合并输出 - 它会自动处理。一种调试方法是首先注释除第一个以外的所有任务。如果该构建成功,则取消注释下一个任务并再次尝试。您最终将找到失败的任务,并可以从那里继续调试。