我继承了一个构建失败的现有项目。我可以在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或其他东西(我禁用了所有合并发布者)
答案 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配置不正确:
因此,当ccnet尝试将nant输出与构建输出合并时,构建失败。
非常感谢大家的帮助!
答案 2 :(得分:0)
很可能是CC.NET安装目录中的 ccnet.config 。
答案 3 :(得分:0)
有一点需要注意 - 如果您在巡航控制项目中指定构建任务,则不必专门告诉它合并输出 - 它会自动处理。一种调试方法是首先注释除第一个以外的所有任务。如果该构建成功,则取消注释下一个任务并再次尝试。您最终将找到失败的任务,并可以从那里继续调试。