全部,我成功在ccnet.config中配置了电子邮件发布者。它工作正常。所有的任务,如构建,单元测试,合并结果等都已成功完成。 但出于某种原因。我误认为smtp身份验证用户名在运行构建时会导致异常。顺便说说。我将通知设置为始终。
<publishers>
<statistics />
<merge>
<files>
<file>TestResult\UnitTestResults.trx</file>
</files>
</merge>
<buildpublisher>
<sourceDir>E:\study\cc.net\Test\KMIH\BackUpFolder\Source</sourceDir>
<publishDir>E:\study\cc.net\Test\KMIH\BackUpFolder\Publish</publishDir>
<useLabelSubDirectory>true</useLabelSubDirectory>
<alwaysPublish>true</alwaysPublish>
</buildpublisher>
<email mailport="25" mailhostUsername="xxxxxx" mailhostPassword="xxxxxx" useSSL="FALSE" includeDetails="true">
<from>xxxxx@163.com</from>
<mailhost>smtp.163.com</mailhost>
<users>
<user name="JoeWang" group="BuildMaster" address="xxxxx@163.com"/>
</users>
<groups>
<group name="BuildMaster">
<notifications>
<notificationType>Always</notificationType>
</notifications>
</group>
</groups>
</email>
<xmllogger/>
<artifactcleanup cleanUpMethod="KeepLastXBuilds" cleanUpValue="50"/>
</publishers>
所以希望我在查看Dashboard的构建报告时看到此错误。我可以看到一个失败的构建。但我没有找到任何错误信息或信息让我知道它到底是什么错误。 (在这种情况下。这是错误的电子邮件配置)。
我错过了什么吗?感谢。
答案 0 :(得分:0)
查看源代码后。 (1.8.5.0)。我想我找到了原因..
这似乎是一个CC.net错误。希望不是。
以下是来自ThoughtWorks.CruiseControl.Core.Tasks.TaskBase
的例外情况。
public virtual void Run(IIntegrationResult result)
{
// Initialise the task
this.WasSuccessful = false;
if ((this.currentStatus == null) ||
(this.currentStatus.Status != ItemBuildStatus.Running))
{
InitialiseStatus(ItemBuildStatus.Pending);
currentStatus.Status = ItemBuildStatus.Running;
}
// Perform the actual run
currentStatus.TimeOfEstimatedCompletion = CalculateEstimatedTime();
currentStatus.TimeStarted = DateTime.Now;
try
{
this.WasSuccessful = Execute(result);//Email sending exception is threw out...
}
catch (Exception error)
{
// Store the error message
currentStatus.Error = error.Message;
result.Status = IntegrationStatus.Exception;
throw;
}
finally
{
// Clean up
currentStatus.Status = (this.WasSuccessful) ? ItemBuildStatus.CompletedSuccess : ItemBuildStatus.CompletedFailed;
currentStatus.TimeCompleted = DateTime.Now;
switch (result.Status)
{
case IntegrationStatus.Unknown:
case IntegrationStatus.Success:
result.Status = this.WasSuccessful ? IntegrationStatus.Success : IntegrationStatus.Failure;
break;
}
}
}
Execute是一个抽象函数。
protected abstract bool Execute(IIntegrationResult result);
构建日志构建在类XmlIntegrationResultWriter
public void Write(IIntegrationResult result)
{
writer.WriteStartElement(Elements.CRUISE_ROOT);
writer.WriteAttributeString("project", result.ProjectName);
WriteRequest(result.IntegrationRequest);
WriteModifications(result.Modifications);
WriteIntegrationProperties(result);
WriteBuildElement(result);
WriteException(result);//since no exception found . so the log no exception detail populated. That is the root cause.
writer.WriteEndElement();
}
所以我认为异常应该添加到IIntegrationResult中,如下所示。
try
{
this.WasSuccessful = Execute(result);
}
catch (Exception error)
{
// Store the error message
result.ExceptionResult = error;//Add the exception in the build process so that it will be generated in the build log.
currentStatus.Error = error.Message;
result.Status = IntegrationStatus.Exception;
throw;
}
我用新编译的ccnet.exe替换了ccnet.exe。然后,异常将显示在仪表板的构建报告中。
有什么好主意吗?感谢。