4

Team Foundation Server 2008 のインストールに成功し、別のビルド サーバーを作成しました (ビルドが現在失敗しているため、これは機能します)。

簡単な "Hello World" Web アプリケーション (すべて標準の Default.aspx ページ) を作成し、TFS のソース管理システムに配置しました。

以前は、TFS が導入される前は、Web アプリケーションをプリコンパイルし、その結果を事前に作成された IIS 仮想ディレクトリに xcopy していました。

しばらく Google を探し回っていますが、TeamBuild を介して TFS ソースから指定されたテスト Web サーバーにアプリケーションを正しくデプロイするためのステップ バイ ステップ ガイドをまだ見つけていません。MS ビルドがこの方程式に該当することはわかっているため、ガイダンスがあれば役立ちます。

_PublishedWebSites などのフォルダーが言及されている展開に関する断片を見てきましたが、段階的に何かをまだ見つけていません。

4

3 に答える 3

4

TFSBuild.projファイルのAfterDropBuildターゲットでexecタスクを使用して成功しました。

<Target Name="AfterDropBuild>
    <Exec Command="xcopy /Y /E &quot;$(DropLocation)\\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites\MyWebsite1\*.*&quot; &quot;\\server\MyWebsite1\&quot;" />
    <Exec Command="xcopy /Y /E &quot;$(DropLocation)\\$(BuildNumber)\%(ConfigurationToBuild.FlavorToBuild)\_PublishedWebsites\MyWebsite2\*.*&quot; &quot;\\server\MyWebsite2\&quot;" />
</Target>

TFSサービスユーザーがコピー先のサーバー上のフォルダーにアクセスするには、アクセス許可を正しく設定する必要があることに注意してください。

于 2009-03-10T16:34:18.050 に答える
4

まず、WebDeployment プロジェクトを使用する必要があります。これにより、コードとマークアップのコンパイルとチェックがさらに多くなります。詳細については、こちらを参照してください。

DV [開発]、PY [プロトタイプ]、PP [本番前]、PD [本番] の 4 つの環境をセットアップしており、すべて TFS に一致するブランチがあります。これらのそれぞれには、ビルドに必要なプロジェクトとビルド フラグを設定できる sln 構成マネージャーのエントリもあります。

正しくセットアップされたら、デプロイ スクリプトのセットアップを開始できます。MSbuild を使用して展開することをお勧めします。MSbuild を使用すると、よりきめ細かい展開方法が得られるからです。MSbuild は最初は少し奇妙ですが、慣れると非常に強力です。

TeamBuild 構成に追加される私の展開スクリプトは以下のとおりです。基本的にご覧のとおり、ライブ サーバーにコピーする前にビルド後のクリーンアップを少し行います。また、2 つの MSbuild フレームワークも使用します (上部にインポートされます)。

<Import Project="$(MSBuildExtensionsPath)\Microsoft\SDC Tasks - Release 2.1.3155.0\Microsoft.Sdc.Common.tasks"/>
<Import Project="$(MSBuildExtensionsPath)\FreeToDev\MSBuild Tasks Suite 3.5\FreeToDev.MSBuild.tasks"/>

<PropertyGroup>
    <InetpubFolder>\\PathToInetPub</InetpubFolder>
    <AppFolder>AppFolder</AppFolder>
    <AppFolderPath>$(InetpubFolder)$(AppFolder)</AppFolderPath>
    <WebDeployName>WebDeployProjectName</WebDeployName>
    <Debug>0</Debug>
    <AppConfiguration>DV</AppConfiguration>
</PropertyGroup>

<Target Name="AfterDropBuild">
    <Message Text="Begin Release to $(AppConfiguration) Webserver" />
    <Message Text="DropLocation = $(DropLocation)" />
    <CallTarget Targets="PostBuildCleanUp"  />
    <CallTarget Targets="DeployApp"  />
</Target>

<Target Name="DeployApp">

    <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
        <Output TaskParameter="DropLocation" PropertyName="DropLocation"></Output>
    </GetBuildProperties>

    <PropertyGroup>
        <CodeDropLocation>$(DropLocation)\$(AppConfiguration) Release</CodeDropLocation>
    </PropertyGroup>

    <ItemGroup>
        <AppFilesToDelete Include="$(AppFolderPath)\**\*.*" Exclude="$(AppFolderPath)\Library\*.*;$(AppFolderPath)\App_Offline.htm;$(AppFolderPath)\jobs\**\*.*" />
    </ItemGroup>

    <ItemGroup>
        <FilesToDeploy Include="$(CodeDropLocation)\$(AppFolder)\**\*.*" Exclude="" />
    </ItemGroup>

    <Copy SourceFiles="$(CodeDropLocation)\$(AppFolder)\App_Offline[RemoveToActivate].htm" DestinationFiles="$(AppFolderPath)\App_Offline.htm" OverwriteReadOnlyFiles="true"/>

    <Message Text="Deleting files in $(AppFolderPath)" />
    <Microsoft.Sdc.Tasks.File.DeleteFiles Files="@(AppFilesToDelete)" Force="true" Condition="$(Debug)==0" />

    <Message Text="Copy $(CodeDropLocation)\$(AppFolder) to $(AppFolderPath)" />
    <Copy Condition="$(Debug)==0" SourceFiles="@(FilesToDeploy)" DestinationFiles="@(FilesToDeploy->'$(AppFolderPath)\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true"/>

    <Message Text="Deploy to $(AppConfiguration) Completed" />
    <Microsoft.Sdc.Tasks.File.DeleteFiles Files="$(AppFolderPath)\App_Offline.htm" Force="true" />

    <OnError ExecuteTargets="ErrorHandler" />
</Target>

<Target Name="ErrorHandler">
    <Message Text="Error encountered!!" />
</Target>

<Target Name="PostBuildCleanUp">

    <GetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)">
        <Output TaskParameter="DropLocation" PropertyName="DropLocation"></Output>
    </GetBuildProperties>

    <PropertyGroup>
        <CodeDropLocation>$(DropLocation)\$(AppConfiguration) Release</CodeDropLocation>
    </PropertyGroup>

    <ItemGroup>
        <PostBuildCleanUpFilesToDelete Include="$(CodeDropLocation)\*.*;$(CodeDropLocation)\bin\*.xml;$(CodeDropLocation)\bin\*.pdb"/>
    </ItemGroup>

    <RemoveDir Directories="$(CodeDropLocation)\_PublishedWebsites\Web" />
    <Microsoft.Sdc.Tasks.File.DeleteFiles Files="@(PostBuildCleanUpFilesToDelete)" Force="true">
        <Output TaskParameter="DeletedFiles" ItemName="FilesThatWereDeleted" />
    </Microsoft.Sdc.Tasks.File.DeleteFiles>
    <Message Text="The files that were removed were @(FilesThatWereDeleted)" />

    <FTDFolder TaskAction="Move" Path="$(CodeDropLocation)\_PublishedWebsites\$(WebDeployName)" TargetPath="$(CodeDropLocation)\$(AppFolder)"/>

    <RemoveDir Directories="$(CodeDropLocation)\_PublishedWebsites" />

    <RemoveDir Directories="$(CodeDropLocation)\$(AppFolder)\WebDeploy" />

    <OnError ExecuteTargets="ErrorHandler" />
</Target>

明らかに、システム設定を変更する必要があります。また、新しいビルドのコピーを開始する前に、ターゲット フォルダーをクリアします。これは、システムがクリーンであることを確認するためですが、保持する必要があるものはすべて ExcludedFiles リストに追加する必要があることは明らかです。

また、メイン アプリケーション プロジェクトの各環境用のフォルダーもあります。これは、web.config の置換 (WebDeployment プロジェクトの別の機能) とその他の環境固有のファイルを保持します。

正しく動作するようになるまでには長いプロセスが必要ですが、うまくいけば、これで始めることができます!! (もちろん、このアプローチを選択すれば!)

于 2009-04-14T19:24:40.313 に答える
2

これは、ビルド スクリプトを介して直接行うことができます。Vertigo Software の担当者は、通常、このような TFS に関する多くの質問に対する最良の情報源です。残念ながら、彼らのブログ投稿は通常、Google でそれほど高くランク付けされていません。これは、このサイトの作成者の 1 人である Jeff Atwood によるものです。

チーム ビルド後の Web ファイルのコピー

于 2009-03-10T15:41:25.493 に答える