在构建步骤中访问TeamCity构件

4

我一直在使用TeamCity搭建CI环境。

一开始我按照Troy Hunt的'You\'re deploying wrong'进行操作,这非常有用。然而,我想将打包和部署分成两个步骤,原因如下:

  1. 我希望将一些额外的标志传递给msdeploy,但是我不知道通过使用Troy描述的MSBuild Package and Deploy方法实现这点是否可能。
  2. 如果我需要构建软件包但不需要部署它,我可以轻松禁用第二个构建步骤(即部署)。
  3. 我想使用msdeploy上的-skip标志来防止它删除某些文件夹,这同样没有找到任何不通过命令行参数传递实现的方法。

所以,在我的第一个MSBuild步骤中,我只有以下参数:

/P:Configuration=%env.Configuration%
/P:VisualStudioVersion=11.0
/P:IgnoreDeployManagedRuntimeVersion=True

然后我有一个第二个构建步骤,使用命令行构建运行程序执行以下msdeploy命令:

"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync       -source:package="C:\ProgramData\JetBrains\TeamCity\system\artifacts\MyProject\%system.teamcity.buildConfName%\%teamcity.build.id%\MyProject.Web.csproj.zip"   -dest:auto,ComputerName='https://devserver:8172/msdeploy.axd?site=MyWebsite',UserName='domain\username',Password='password',IncludeAcls='False',AuthType='Basic' -skip:objectName=dirPath,absolutePath=media$ -disableLink:AppPoolExtension -disableLink:ContentExtension   -disableLink:CertificateExtension -retryAttempts=2 -allowuntrusted

这样做的问题在于,显然TeamCity直到所有构建步骤完成之前才发布工件,因此命令行进程失败,因为此时包zip文件实际上不存在。
我已经阅读了有关在构建仍在进行时发布工件的内容,但这似乎有点像黑客。
非常感谢您的任何建议。
1个回答

8
你最好有两个构建版本而不是两个构建步骤。
第一个构建(Build A)将有1个构建步骤,该构建步骤将进行构建,然后第二个构建(Build B)将使用来自第一个构建的工件在一个构建步骤中仅进行部署。
因此,在构建A的第一个配置选项卡下,您需要指定需要从第一个构建提供的工件。然后可以运行构建,并确认在工件部分下,您需要的所有内容都可用。(这些内容将在构建A完成运行时显示)。
然后,在构建B的依赖项部分(我记不清确切名称,而且我远离我的TC实例)中,您可以设置它以使用构建A的工件,然后用于部署。
一旦你把所有的东西都搞定了,你就可以添加一个构建触发器,让Build B在Build A成功执行后运行,然后如果你只想运行Build A,禁用Build B上的触发器或暂停Build B配置,这将阻止触发器启动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接