【问题标题】:How to copy files into main directory and deploying如何将文件复制到主目录并部署
【发布时间】:2014-05-01 16:18:40
【问题描述】:

我已经检查了我在 StackOverflow 和各种 Google 链接上找到的所有问题,但没有找到。

我们有 3 台不同的服务器,需要将最后 3 个版本之一部署到它。这就是我在本地构建级别上处理它的方式:

<PostBuildEvent>
  start xcopy /Y /Q "$(TargetDir)EncompassSDKDlls\$(ConfigurationName)\*.*" "$(TargetDir)"
</PostBuildEvent>

而且效果很好。但是,当它尝试进行部署时,它会在此之前运行它。我确实尝试过做一些事情,例如:MSDeploy Extra Files,但这似乎并没有复制部署中的文件,只是复制了 bin 目录中的原始文件。

这是我最后尝试的:

<PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
        CustomCollectFiles;
        $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>
    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
        CustomCollectFiles;
        $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
<Target Name="CustomCollectFiles">
    <ItemGroup>
        <_CustomFiles Include="Dlls\$(ConfigurationName)\*" />

        <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>(Filename)%(Extension)</DestinationRelativePath>
        </FilesForPackagingFromProject>
    </ItemGroup>
</Target>
<PropertyGroup>

【问题讨论】:

  • 我最近成功地将构建后步骤转变为构建前步骤。它的步骤实际上并不依赖于构建中产生的任何东西。然后我可以使用&lt;FilesForPackagingFromProject/&gt; 收集它们以进行部署。
  • 看起来好像你想运行一个 Post Build Step,但在这种情况下它实际上是一个 Post Deploy 步骤?我做对了吗?很难理解“当它尝试进行部署时,它会在此之前运行它”是什么意思。
  • 谢谢约翰,准备试试看。会让你知道的。
  • Domin8urMind - 我正在尝试根据配置将文件复制到 bin 文件夹中(配置告诉我正在构建哪个 API 版本),以便在部署的 Web 服务中包含正确的 API DLL .

标签: asp.net teamcity msdeploy webdeploy


【解决方案1】:

我认为您可以通过在构建步骤中使用 TeamCity 的 %build.number% 参数来获得一些工作。

您提到您需要 3 台不同的服务器,这些服务器需要部署到它的最后 3 个版本之一。

我们使用 %build.number% 作为打包步骤的参数,这将生成一个包含内部版本号的 deloyment .zip 文件。

考虑如下打包构建步骤:

Build Step:
Runner type: MSBuild
Step Name: Package
Build file path: <path to ASP.NET project file >.csproj
Command line parameters:
/T:Package 
/P:configuration =BUILD 
/P:DeployServiceUrl=http://build.server:8091 
/p:DeployIisAppPath="IIS_App_Name";PackageLocation ="c:\Packages\%build.number%\Iis_App_Name_%build.number%.zip" 
/p:_PackageTempDir=c:\Packages\Temp

PackageLocation 参数包括内部版本号 - 因此,内部版本 100 - 102 的输出将类似于以下内容:

c:\Packages\100\Iis_App_Name_100.zip
c:\Packages\101\Iis_App_Name_101.zip
c:\Packages\102\Iis_App_Name_102.zip

然后您可以使用将 build.number 作为参数的 powershell 脚本,计算最后三个构建,并将它们部署到您需要的任何服务器。

例如,以下 TeamCity 构建步骤将部署最新版本:

Build Step: 
Runner type: MSBuild
Run : Custom Script
c:\Packages\100\Iis_App_Name_%build.number%.deploy.cmd /Y

希望这会有所帮助。

【讨论】:

  • 这适用于我们控制内部版本号的项目,但是,这些是第 3 方库,所以我认为这对我们不起作用。
【解决方案2】:

让它工作。副本确实需要在构建后事件中,但是 FilesForPackagingProject 没有所有正确的设置来识别新文件。我想发布这个包裹,它可以帮助将来的任何人:

<ItemGroup>
  <_CustomFiles Include="EncompassSDKDlls\$(ConfigurationName)\*" />
  <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
    <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
  </FilesForPackagingFromProject>
</ItemGroup>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多