发送电子邮件的例外情况不会在CC.net控制台中显示

时间:2015-10-10 11:20:03

标签: cruisecontrol.net

全部,我成功在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的构建报告时看到此错误。我可以看到一个失败的构建。但我没有找到任何错误信息或信息让我知道它到底是什么错误。 (在这种情况下。这是错误的电子邮件配置)。

我错过了什么吗?感谢。

1 个答案:

答案 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。然后,异常将显示在仪表板的构建报告中。

有什么好主意吗?感谢。