【问题标题】:CruiseControl.NET run as a windows service and as a standalone process behaves differentlyCruiseControl.NET 作为 Windows 服务运行,作为独立进程运行不同
【发布时间】:2010-05-10 12:33:37
【问题描述】:

我有一个正在使用 CruiseControl.NET 构建的项目。该项目包含一个“MSBuild 任务”,它运行项目的构建以及单元测试。反过来,单元测试只是一个运行可执行文件的 MSBuild 'exec' 任务。

单元测试涉及一些 .NET 远程处理。当单元测试通过系统命令提示符运行时,软件窗口打开,测试运行并退出进程。

当我通过 Web 仪表板强制构建时,构建会在单元测试开始运行的位置挂起。软件的窗口没有打开,但可执行文件正在运行。如果进程通过任务资源管理器被终止,则构建以“失败”状态进行。当我将 ccnet 作为 Windows 服务运行时会发生这种情况。

如果我直接运行 CCNet(而不是作为 Windows 服务)并通过 Web 仪表板强制构建,则构建和单元测试会按预期顺利进行。 (软件窗口打开。)

在 CCNet 作为 Windows 服务运行的情况下,似乎出现了死锁。我猜它与标准输出/错误流有关。

  1. 这是已知问题吗?

  2. 可能是什么问题?

  3. 关于调试有什么建议吗?

  4. 我该如何解决?

(我使用的是 CCNet 版本 1.4.4 SP1)

【问题讨论】:

    标签: unit-testing windows-services cruisecontrol.net .net-remoting


    【解决方案1】:

    当 CCNet 作为服务运行时,它将无法访问显示,因此不要期望在此配置中在屏幕上看到任何内容。我要检查的第一件事是权限 - 确保服务作为有权访问您需要的任何资源的帐户运行。您还可以通过仪表板找到 CCNet 日志文件。

    顺便说一句,试试 TeamCity 而不是 CCNet,它领先 10 年。

    【讨论】:

    • 服务所在的账号是admin账号,有权限,但是还是没用。我不明白“访问显示器”。 CCNet 正在启动一个应用程序。这在 CCNet 作为简单应用程序运行时显示应用程序的窗口,而在 CCNet 作为服务运行时不显示。您能否解释一下 CCNet 启动应用程序时“访问显示”是如何生效的?并且在抱怨权限被拒绝的日志文件中没有错误/异常。
    • @Poulo,在 Windows 中,出于安全原因,服务无权访问屏幕上显示的内容。因此,当 ccnet 作为服务运行启动您的应用程序时,它不会显示命令窗口,也不会创建任何窗口/控件等。否则该过程将照常工作,因此应该没有任何问题。我唯一能建议的是使用一些记录器(例如 log4net)并在您的测试中添加大量日志记录以找出正在发生的事情。或者尝试 Team City(我认为它对于小型项目是免费的)。
    • 谢谢。你能指点我一些有用的读物​​吗? (服务启动应用程序不会创建窗口/控件)我想了解这如何影响应用程序中的 .NET 远程调用。如果我能找到具体的东西,那么我可以更改我的单元测试应用程序以解决该问题或不使用 .NET 远程处理。自从我开始使用 CCNet 已经有一段时间了,其中有 7 个项目,所以按照您的建议尝试 Team City 将是我列表中的最后一个。
    【解决方案2】:

    也许这个答案会有所帮助: delphi windows service can't download file from internet

    您应该知道,在将 CCNet 作为应用程序(dosbox)运行时,它使用环境变量和来自已登录帐户的所有权限。因此它可能会连接到服务器,使用缓存的密码,获取此帐户的注册表变量。

    但是当作为服务运行时,该帐户是您提供的帐户:LocalSystem 例如,其中 env.变量不一样。

    所以,您可以做的是更改CCNet服务帐户进行测试。将其更改为您的用户帐户(带密码),我相信它会更好!

    【讨论】:

    • 服务所在的账号是admin账号,有权限,但是还是没用。
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2016-09-07
    • 2023-03-17
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多