我一直在玩TeamCity以启动和运行CI环境。
我开始关注Troy Hunt的'You're deploying wrong',这非常有用,但我想将打包和部署分成两个单独的步骤,原因如下:
所以,在我的第一个MSBuild步骤中,我只有参数:
/P:Configuration=%env.Configuration%
/P:VisualStudioVersion=11.0
/ P:IgnoreDeployManagedRuntimeVersion =真
然后我有第二个Build Step,它使用命令行构建运行器来执行以下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文件实际上并不存在。
我已经阅读了一些关于publishing artifacts whilst the Build is still in progress的内容,但这看起来有点像黑客。
非常感谢任何建议。
答案 0 :(得分:7)
你最好有两个构建与两个构建步骤。
第一个(Build A)将有1个构建步骤来执行构建,然后第二个(构建B)将使用第一个构件在一个构建步骤中进行部署。
因此,在构建A的第一个配置选项卡下,您将指定需要从第一个构建中获得的工件。然后,您可以运行构建并确认在工件部分下,您需要的所有内容都可用。 (这些将在构建A完成运行时显示。)
然后在Build B的依赖项部分(不记得确切名称,我离开我的TC实例)下,您可以将其设置为使用构建A的工件,然后将其用于部署
一旦你完成所有工作,你可以添加一个构建触发器,让Build B在成功执行Build A之后运行,然后如果你曾经想要运行Build A,那么在构建B上禁用触发器或暂停Build B配置将阻止触发器触发。