Msbuild 在构建步骤中访问TeamCity工件

Msbuild 在构建步骤中访问TeamCity工件,msbuild,teamcity,msdeploy,teamcity-8.0,Msbuild,Teamcity,Msdeploy,Teamcity 8.0,我一直在与TeamCity合作,以建立并运行CI环境 我从Troy Hunt开始,这非常有用,但是我想将打包和部署分为两个单独的步骤,原因如下: 我想向msdeploy传递一些额外的标志,这在使用特洛伊描述的MSBuild包和部署时是不可能的(据我所知) 如果我需要构建包但不部署它,我可以很容易地禁用第二个构建步骤,即部署 我想在msdeploy上使用-skip标志来防止它删除某些文件夹,同样,如果不将其作为参数传递给命令行,我找不到任何方法 因此,在我的第一个MSBuild步骤中,我只有以下参

我一直在与TeamCity合作,以建立并运行CI环境

我从Troy Hunt开始,这非常有用,但是我想将打包和部署分为两个单独的步骤,原因如下:

  • 我想向msdeploy传递一些额外的标志,这在使用特洛伊描述的MSBuild包和部署时是不可能的(据我所知)
  • 如果我需要构建包但不部署它,我可以很容易地禁用第二个构建步骤,即部署
  • 我想在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文件实际上不存在

    我读过一些关于这方面的文章,但这确实有点像黑客


    任何建议都将不胜感激。

    您最好有两个构建,而不是两个构建步骤

    第一个(构建A)将有一个构建步骤来进行构建,然后第二个(构建B)将使用第一个构建步骤中的工件在一个构建步骤中进行部署

    因此,在构建A的第一个配置选项卡下,您将指定需要从第一个构建中提供的工件。然后,您可以运行构建并确认在artifacts部分下,您需要的一切都是可用的。(这些将在生成A完成运行时显示)

    然后在Build B的dependencies部分(不记得确切的名称,我不在TC实例中),您可以将其设置为使用Build A的工件,然后将其用于部署

    一旦您完成了所有这些工作,您可以添加一个构建触发器,使构建B在成功执行构建a后运行,然后如果您在某一点上只想运行构建a,请禁用构建B上的触发器或暂停构建B配置,这将停止触发