1

作为 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字节)信息:错误>>(无)信息:退出代码>> 0 信息:

处理命令 ...msdeploy.exe -verb:sync -source:contentPath="E:\BuildAgent\work\2483052e33e5e1e8\src\diy\" -dest:contentPath="siteQA",wmsvc="SERVER3",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

信息:部署脚本完成。

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

更新1:

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

更新 2:

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

在此处输入图像描述

4

3 回答 3

0

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

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

于 2013-05-07T08:17:23.743 回答
0

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

于 2013-05-16T11:44:49.990 回答
0

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

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

于 2013-04-24T03:44:10.030 回答