作为 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,那么接下来对该服务器的所有部署都不会出现构建挂起的问题。请看下图