【问题标题】:TeamCity ".Net Process Runner" hangsTeamCity“.Net Process Runner”挂起
【发布时间】:2013-04-23 14:16:33
【问题描述】:

作为 CI 的一部分,我们已经开始将我们的几个项目之一迁移到团队城市。下面是我们如何设置 teamcity 构建。我们正在尝试部署网站。

1) 构建步骤 1(包安装)

使用“命令行”运行器类型安装所需的包。

2) 构建步骤 2(构建)

使用 Runner 类型“Visual Studio (sln)”(Visual Studio 2010) 构建网站。

3) 构建步骤 3(部署网站)

使用“.Net Process Runner”,deployer.exe(使用 .Net Framework 4 构建的 x86)部署站点。

Deployer.exe 读取配置文件。配置文件包含我们想要推送构建的“BuildId”、“Environment”和“Servers”。

<buildType id="bt52">
    <env name="Debug">
        <server path="SERVER1" />
    </env>
    <env name="QA">
    <server path="SERVER2" />
    <server path="SERVER3" />
</env>
<env name="UAT">
    <server path="SERVER4" />
    <server path="SERVER5" />
</env>
</buildType>

Deployer.exe 使用以下所需参数调用。它读取配置并将站点部署到 Server2 和 Server3。

Deployer.exe "bt52" "QA" "siteQA" "E:\BuildAgent\work\2483052e33e5e1e8\src\diy\" msdeploy.exe

问题区域是第 3 步。

当我们使用 .Net 进程运行程序作为团队城市的一部分运行 deployer.exe 时,我们看到它挂起并且有时甚至 45 分钟都没有响应。当我们尝试使用命令行脚本从构建服务器执行相同的 deployer.exe 时,会在几秒钟内执行。

E:\TeamCity_custom_applications\deployer>Deployer.exe farm1-1 QA siteQA E:\BuildAgent\work\2483052e33e5e1e8\src\diy\ msdeploy.exe

信息

:处理批处理运行...信息:处理命令...msdeploy.exe -verb:sync -source:contentPath="E:\BuildAgent\work\2483052e33e5e1e8\src\diy\" -dest:contentPath="siteQA",wmsvc="SERVER2",userName="*****",password ="******",authType="Basic"-skip:objectName=filePath,absolutePath=web.config -skip:objectName=dirPath,absolutePath="bin" -enableRule:DoNotDeleteRule -allowUntrusted 信息:输出>>更改总数:0(添加 0、删除 0、更新 0、更改参数 0、更改参数 0 复制的字节数)信息:错误>>(无)信息:ExitCode >> 0信息:

处理命令 ...msdeploy.exe -verb:sync -source:contentPath="E:\BuildAgent\work\2483052e33e5e1e8\src\diy\" -dest:contentPath="siteQA",wmsvc="SERVER3",userName="******",password="* *****",authType="基本" -skip:objectName=filePath,absolutePath=web.config -skip:objectName=dirPath,absolutePath="bin" -enableRule:DoNotDeleteRule -allowUntrusted Info : output >>Total changes: 0 (0 added, 0 deleted, 0 updated, 0参数改变,0 复制的字节数)信息:错误>>(无)信息:ExitCode >> 0

信息:部署脚本完成。

我们观察到的另一件事是通过 teamcity 运行 deployer.exe 我看到站点内容被复制但仅适用于 1 台服务器,并且 teamcity 构建状态保持在“运行”模式。我想知道是否有人可以就我如何看待这个问题提出一些见解。

更新 1:

感谢您花时间研究它!我们最终做的是,我们没有从“cmd.exe”运行命令“msdeploy.exe”,而是将“msdeploy.exe”位置添加为环境变量,并在#服务器的循环中执行“msdeploy.exe”。这解决了挂起的问题。现在我很想知道为什么它会以这种方式运行,如果你从“cmd.exe”执行“msdeploy.exe”,它会在直接运行“msdeploy.exe”时挂起,它会成功执行。任何对此的见解将不胜感激。

更新 2:

我添加了使用进程资源管理器解释行为的图像。如果我们从进程资源管理器中杀死 msdeploy.exe,那么接下来对该服务器的所有部署都不会出现构建挂起的问题。请看下图

【问题讨论】:

    标签: c#-4.0 msbuild continuous-integration teamcity msdeploy


    【解决方案1】:

    说实话,听起来您在重定向输入/输出流时遇到了问题。 TeamCity 在完全无头的环境中运行您的应用程序,然后您又尝试重定向和解析 msdeploy.exe 的输出

    如果是这种情况,我建议考虑使用MSDeploy API 而不是msdeploy.exe。后者只是前者的命令行包装器,因此您可以使用所有功能。如果您需要入门帮助,可以在 IIS 博客上找到sample deployment application

    【讨论】:

    • 谢谢理查德!我无法理解为什么 TeamCity => Cmd => MsDeploy(有时有效(20-30%),有时完全挂起(70-80%))会导致问题,而 TeamCity => MsDeploy 会有效。我认为 MSDEPLOY Api 是非常好的资源。感谢分享。
    【解决方案2】:

    您似乎在 TeamCity 中配置了 NUnit 构建步骤,并从您的测试中调用 cmd.exe。这看起来像是测试代码的问题。如果您直接使用 NUnit 运行有问题的测试,它很可能会在没有 TeamCity 的情况下重现。

    正如 Richard 所指出的,问题的根本原因很可能与 stdin/stdout 处理有关。 如果你想在你的代码中修复它,你可以尝试通过显式关闭 stdin 或其他方式来进行试验,尝试在其中写入一些东西等等。

    【讨论】:

    • 谢谢!!我已经添加了这样做的代码。让我们看看我们是否遇到任何问题。另一个问题是,这个问题的发生是如此随机,我们无法预测它何时会发生。所以我得等几天才能确认理查德的回答。
    • 关闭流对我没有帮助。我们所做的解决方法是,我们观察到 msdeploy 执行和部署的时间不超过 3-5 秒。所以我们将超时设置为 20 秒。到目前为止,自过去 1 周以来,我们还没有发现任何问题,希望它不会造成更多麻烦,但我们仍然不确定为什么会出现这种行为。
    【解决方案3】:

    我们所做的解决方法是,我们观察到 msdeploy 执行和部署的时间不超过 3-5 秒(即使对于我们最大的项目,几乎 300mb 的网站也是如此)。所以我们将超时设置为 20 秒。到目前为止,自过去 1 周以来,我们还没有发现任何问题,希望它不会造成更多麻烦,但我们仍然不确定为什么会出现这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2016-11-23
      • 1970-01-01
      • 2012-01-31
      • 2021-02-06
      相关资源
      最近更新 更多