2013-04-23 86 views
1

我们已经开始将我们的几个项目之一迁移到团队城市作为CI的一部分。以下是我们如何设置teamcity构建。我们正在尝试部署WebSite。TeamCity“.Net Process Runner”挂起

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

使用 “命令行” 转轮型安装所需包。

2)构建步骤2(构建)

使用转轮式 “的Visual Studio(SLN)”(Visual Studio 2010中)建立的网站。

3)建设第3步(部署Web网站)

使用 “净过程的人”,deployer.exe(x86平台上的.Net框架内置4)部署网站。

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”, “质量保证”, “siteQA” “E:\ BuildAgent \工作\ 2483052e33e5e1e8的\ src \ DIY \” msdeploy.exe

方面的问题是步骤#3。

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

E:\ TeamCity_custom_applications \部署> Deployer.exe farm1-1 QA siteQA E:\ BuildAgent \工作\ 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 -s kip:objectName = dirPath,absolutePath =“bin”-enableRule:DoNotDeleteRule -allowUntrusted Info:输出>>全部更改:0(0增加,0删除,0更新,0参数更改,0 字节复制)信息:错误>> (无)信息:的ExitCode >> 0资料:

处理命令msdeploy.exe -verb:同步 -source:=的contentPath “E:\ BuildAgent \工作\ 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 Info:输出>>总变化: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:

我添加图像,其使用Process Explorer的解释行为。如果我们从进程资源管理器中终止msdeploy.exe,那么所有到该服务器的部署都不会有挂起问题。请参考下面的图像

enter image description here

回答

0

解决办法我们做的是,我们观察到msdeploy没有需要3-5秒以上来执行和部署(即使我们最大的项目是近300mb的网站)。所以我们设置了20秒的超时时间。到目前为止,自从最近1周以来,我们还没有看到任何问题,希望它不会造成更多麻烦,但我们仍然不确定这种行为的原因。

0

说实话,这听起来像你正在运行到问题与重定向输入/输出流。 TeamCity的运行你的应用程序在一个完全无头环境,然后你,反过来,正试图重定向和解析的msdeploy.exe

输出。如果是那样的话,我会建议考虑使用MSDeploy API代替msdeploy.exe。后者只是前者的命令行包装器,因此所有功能都可供您使用。如果您需要入门帮助,可以在IIS博客上找到sample deployment application

+0

感谢理查!我无法理解为什么TeamCity => Cmd => MsDeploy(有时可以工作(20-30%),有时会完全挂起(70-80%))会导致问题,而TeamCity => MsDeploy可以工作。我认为MSDEPLOY Api是非常好的资源。感谢分享。 – TorontoKid 2013-04-24 13:23:38

0

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

正如理查德指出的,最可能的问题根源与标准输入/标准输出处理有关。 如果你想在你的代码中修复它,你可以尝试通过明确地关闭stdin或其他方式来尝试,尝试写入东西,等等。

+0

谢谢!我已经添加了代码来这样做。让我们看看我们是否遇到任何问题。另一个问题是,这个问题的发生是如此随机,我们无法预测什么时候会发生。所以我必须等待几天才能确认Richard的答案。 – TorontoKid 2013-05-07 19:57:59

+0

关闭流没有帮助我。我们所做的是,我们观察到msdeploy不需要超过3-5秒的时间来执行和部署。所以我们设置了20秒的超时时间。到目前为止,自从最近1周以来,我们还没有看到任何问题,希望它不会造成更多麻烦,但我们仍然不确定这种行为的原因。 – TorontoKid 2013-05-16 11:43:21