利用 MSBuild 实现 Web Application 项目的每日构建(下)
来源:互联网 发布:linux解压缩 编辑:程序博客网 时间:2024/05/29 03:03
在上篇文章 利用 MSBuild 实现 Web Application 项目的每日构建(上) 中,零零碎碎的发表了一些代码。在这篇文章中,我会附上完整的代码。欢迎各位积极交流。
1.TestProject.proj
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Required Import to use MSBuild Community Tasks -->
<Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
<SolutionDir>$(SourceDir)$(SourceBranch)TestProject</SolutionDir>
<LatestBuildDir>$(BuildDir)Latest$(SourceBranch)</LatestBuildDir>
<TempDir>$(BuildDir)Temp</TempDir>
<ProjectReferences>$(SolutionDir)WebWeb.csproj</ProjectReferences>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
<ItemGroup>
<Configuration Include="Debug" />
<Configuration Include="Release" />
<PublicFiles Include="$(SolutionDir)wwwroot***.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Error
Text=" The "WWWRoot" property or environment variable must be set."
Condition="'$(WWWRoot)' == ''"
/>
<Error
Text=" The "SourceBranch" property or environment variable must be set."
Condition="'$(SourceBranch)' == ''"
/>
<Error
Text=" The "SourceDir" property or environment variable must be set."
Condition="'$(SourceDir)' == ''"
/>
<Error
Text=" The "BuildDir" property or environment variable must be set."
Condition="'$(BuildDir)' == ''"
/>
<Error
Text=" The "BuildNumber" property or environment variable must be set."
Condition="'$(BuildNumber)' == ''"
/>
<MakeDir
Directories="$(LatestBuildDir)"
Condition="!Exists('$(LatestBuildDir)')"
/>
<Math.Subtract Numbers="$(BuildNumber);5">
<Output TaskParameter="Result" PropertyName="NeedsToBeDeletedBuildNumber" />
</Math.Subtract>
<CreateProperty Value="$(BuildDir)$(BuildNumber)$(SourceBranch)">
<Output TaskParameter="Value" PropertyName="DailyBuildDir" />
</CreateProperty>
<CreateProperty Value="TestProject$(BuildNumber)">
<Output TaskParameter="Value" PropertyName="VirtualDirectoryName" />
</CreateProperty>
<CreateProperty Value="$(WWWRoot)TestProject$(BuildNumber)">
<Output TaskParameter="Value" PropertyName="VirtualDirectoryPhysicalPath" />
</CreateProperty>
<CreateProperty Value="TestProject$(NeedsToBeDeletedBuildNumber)">
<Output TaskParameter="Value" PropertyName="NeedsToBeDeletedVirtualDirectoryName" />
</CreateProperty>
<CreateProperty Value="$(WWWRoot)TestProject$(NeedsToBeDeletedBuildNumber)">
<Output TaskParameter="Value" PropertyName="NeedsToBeDeletedVirtualDirectoryPhysicalPath" />
</CreateProperty>
</Target>
<Target Name="CoreBuild">
<RemoveDir Directories="$(TempDir)" Condition="Exists('$(TempDir)')" />
<MakeDir Directories="$(TempDir)%(Configuration.Identity)" />
<MSBuild Projects="$(ProjectReferences)" Targets="Build"
Properties="Configuration=%(Configuration.Identity);OutDir=$(TempDir)%(Configuration.Identity)"
/>
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeblog4net.config"
DestinationFolder="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebBin"
SkipUnchangedFiles="false"
/>
<Delete Files="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeblog4net.config" />
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config.%(Configuration.Identity)"
DestinationFiles="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config"
SkipUnchangedFiles="false"
/>
<Delete Files="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config.Debug" />
<Delete Files="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config.Release" />
<CreateItem Include="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeb***.*">
<Output TaskParameter="Include" ItemName="%(Configuration.Identity)SourceFiles"/>
</CreateItem>
<Zip
Files="@(%(Configuration.Identity)SourceFiles)"
WorkingDirectory="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeb"
ZipFileName="$(TempDir)%(Configuration.Identity)Web$(BuildNumber).zip" />
<RemoveDir
Directories="$(DailyBuildDir)%(Configuration.Identity)"
Condition="Exists('$(DailyBuildDir)%(Configuration.Identity)')"
/>
<MakeDir Directories="$(DailyBuildDir)%(Configuration.Identity)" />
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)Web$(BuildNumber).zip"
DestinationFolder="$(DailyBuildDir)%(Configuration.Identity)"
SkipUnchangedFiles="false"
/>
<RemoveDir
Directories="$(LatestBuildDir)%(Configuration.Identity)"
Condition="Exists('$(LatestBuildDir)%(Configuration.Identity)')"
/>
<MakeDir Directories="$(LatestBuildDir)%(Configuration.Identity)" />
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)Web$(BuildNumber).zip"
DestinationFolder="$(LatestBuildDir)%(Configuration.Identity)"
SkipUnchangedFiles="false"
/>
</Target>
<Target Name="AfterBuild">
<Copy
SourceFiles="@(PublicFiles)"
DestinationFiles="@(PublicFiles->'$(WWWRoot)%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="false"
/>
<ServiceController ServiceName="w3svc" Action="Restart" />
<WebDirectoryDelete
VirtualDirectoryName="$(VirtualDirectoryName)"
Condition="Exists('$(VirtualDirectoryPhysicalPath)')"
ContinueOnError="true"
/>
<RemoveDir
Directories="$(VirtualDirectoryPhysicalPath)"
Condition="Exists('$(VirtualDirectoryPhysicalPath)')"
/>
<MakeDir Directories="$(VirtualDirectoryPhysicalPath)" />
<Copy
SourceFiles="@(DebugSourceFiles)"
DestinationFiles="@(DebugSourceFiles->'$(VirtualDirectoryPhysicalPath)%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="false"
/>
<WebDirectoryCreate
VirtualDirectoryName="$(VirtualDirectoryName)"
VirtualDirectoryPhysicalPath="$(VirtualDirectoryPhysicalPath)"
AuthAnonymous="False"
AuthBasic="false"
AuthNtlm="true"
EnableDefaultDoc="true"
DefaultDoc="Index.aspx"
/>
<WebDirectoryDelete
VirtualDirectoryName="$(NeedsToBeDeletedVirtualDirectoryName)"
Condition="Exists('$(NeedsToBeDeletedVirtualDirectoryPhysicalPath)')"
ContinueOnError="true"
/>
<RemoveDir
Directories="$(NeedsToBeDeletedVirtualDirectoryPhysicalPath)"
Condition="Exists('$(NeedsToBeDeletedVirtualDirectoryPhysicalPath)')"
/>
</Target>
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)" />
</Project>
<!-- Required Import to use MSBuild Community Tasks -->
<Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
<SolutionDir>$(SourceDir)$(SourceBranch)TestProject</SolutionDir>
<LatestBuildDir>$(BuildDir)Latest$(SourceBranch)</LatestBuildDir>
<TempDir>$(BuildDir)Temp</TempDir>
<ProjectReferences>$(SolutionDir)WebWeb.csproj</ProjectReferences>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
<ItemGroup>
<Configuration Include="Debug" />
<Configuration Include="Release" />
<PublicFiles Include="$(SolutionDir)wwwroot***.*" />
</ItemGroup>
<Target Name="BeforeBuild">
<Error
Text=" The "WWWRoot" property or environment variable must be set."
Condition="'$(WWWRoot)' == ''"
/>
<Error
Text=" The "SourceBranch" property or environment variable must be set."
Condition="'$(SourceBranch)' == ''"
/>
<Error
Text=" The "SourceDir" property or environment variable must be set."
Condition="'$(SourceDir)' == ''"
/>
<Error
Text=" The "BuildDir" property or environment variable must be set."
Condition="'$(BuildDir)' == ''"
/>
<Error
Text=" The "BuildNumber" property or environment variable must be set."
Condition="'$(BuildNumber)' == ''"
/>
<MakeDir
Directories="$(LatestBuildDir)"
Condition="!Exists('$(LatestBuildDir)')"
/>
<Math.Subtract Numbers="$(BuildNumber);5">
<Output TaskParameter="Result" PropertyName="NeedsToBeDeletedBuildNumber" />
</Math.Subtract>
<CreateProperty Value="$(BuildDir)$(BuildNumber)$(SourceBranch)">
<Output TaskParameter="Value" PropertyName="DailyBuildDir" />
</CreateProperty>
<CreateProperty Value="TestProject$(BuildNumber)">
<Output TaskParameter="Value" PropertyName="VirtualDirectoryName" />
</CreateProperty>
<CreateProperty Value="$(WWWRoot)TestProject$(BuildNumber)">
<Output TaskParameter="Value" PropertyName="VirtualDirectoryPhysicalPath" />
</CreateProperty>
<CreateProperty Value="TestProject$(NeedsToBeDeletedBuildNumber)">
<Output TaskParameter="Value" PropertyName="NeedsToBeDeletedVirtualDirectoryName" />
</CreateProperty>
<CreateProperty Value="$(WWWRoot)TestProject$(NeedsToBeDeletedBuildNumber)">
<Output TaskParameter="Value" PropertyName="NeedsToBeDeletedVirtualDirectoryPhysicalPath" />
</CreateProperty>
</Target>
<Target Name="CoreBuild">
<RemoveDir Directories="$(TempDir)" Condition="Exists('$(TempDir)')" />
<MakeDir Directories="$(TempDir)%(Configuration.Identity)" />
<MSBuild Projects="$(ProjectReferences)" Targets="Build"
Properties="Configuration=%(Configuration.Identity);OutDir=$(TempDir)%(Configuration.Identity)"
/>
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeblog4net.config"
DestinationFolder="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebBin"
SkipUnchangedFiles="false"
/>
<Delete Files="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeblog4net.config" />
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config.%(Configuration.Identity)"
DestinationFiles="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config"
SkipUnchangedFiles="false"
/>
<Delete Files="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config.Debug" />
<Delete Files="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWebWeb.config.Release" />
<CreateItem Include="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeb***.*">
<Output TaskParameter="Include" ItemName="%(Configuration.Identity)SourceFiles"/>
</CreateItem>
<Zip
Files="@(%(Configuration.Identity)SourceFiles)"
WorkingDirectory="$(TempDir)%(Configuration.Identity)_PublishedWebsitesWeb"
ZipFileName="$(TempDir)%(Configuration.Identity)Web$(BuildNumber).zip" />
<RemoveDir
Directories="$(DailyBuildDir)%(Configuration.Identity)"
Condition="Exists('$(DailyBuildDir)%(Configuration.Identity)')"
/>
<MakeDir Directories="$(DailyBuildDir)%(Configuration.Identity)" />
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)Web$(BuildNumber).zip"
DestinationFolder="$(DailyBuildDir)%(Configuration.Identity)"
SkipUnchangedFiles="false"
/>
<RemoveDir
Directories="$(LatestBuildDir)%(Configuration.Identity)"
Condition="Exists('$(LatestBuildDir)%(Configuration.Identity)')"
/>
<MakeDir Directories="$(LatestBuildDir)%(Configuration.Identity)" />
<Copy
SourceFiles="$(TempDir)%(Configuration.Identity)Web$(BuildNumber).zip"
DestinationFolder="$(LatestBuildDir)%(Configuration.Identity)"
SkipUnchangedFiles="false"
/>
</Target>
<Target Name="AfterBuild">
<Copy
SourceFiles="@(PublicFiles)"
DestinationFiles="@(PublicFiles->'$(WWWRoot)%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="false"
/>
<ServiceController ServiceName="w3svc" Action="Restart" />
<WebDirectoryDelete
VirtualDirectoryName="$(VirtualDirectoryName)"
Condition="Exists('$(VirtualDirectoryPhysicalPath)')"
ContinueOnError="true"
/>
<RemoveDir
Directories="$(VirtualDirectoryPhysicalPath)"
Condition="Exists('$(VirtualDirectoryPhysicalPath)')"
/>
<MakeDir Directories="$(VirtualDirectoryPhysicalPath)" />
<Copy
SourceFiles="@(DebugSourceFiles)"
DestinationFiles="@(DebugSourceFiles->'$(VirtualDirectoryPhysicalPath)%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="false"
/>
<WebDirectoryCreate
VirtualDirectoryName="$(VirtualDirectoryName)"
VirtualDirectoryPhysicalPath="$(VirtualDirectoryPhysicalPath)"
AuthAnonymous="False"
AuthBasic="false"
AuthNtlm="true"
EnableDefaultDoc="true"
DefaultDoc="Index.aspx"
/>
<WebDirectoryDelete
VirtualDirectoryName="$(NeedsToBeDeletedVirtualDirectoryName)"
Condition="Exists('$(NeedsToBeDeletedVirtualDirectoryPhysicalPath)')"
ContinueOnError="true"
/>
<RemoveDir
Directories="$(NeedsToBeDeletedVirtualDirectoryPhysicalPath)"
Condition="Exists('$(NeedsToBeDeletedVirtualDirectoryPhysicalPath)')"
/>
</Target>
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)" />
</Project>
2.DailyBuild.proj
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Required Import to use MSBuild Community Tasks -->
<Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
<WWWRoot Condition=" '$(WWWPath)' != '' and !HasTrailingSlash('$(WWWPath)') ">$(WWWPath)</WWWRoot>
<SourceBranch Condition=" '$(SourceBranch)' == '' ">Development</SourceBranch>
<SourceDir Condition=" '$(SourcePath)' != '' and HasTrailingSlash('$(SourcePath)') ">$(SourcePath)</SourceDir>
<SourceDir Condition=" '$(SourcePath)' != '' and !HasTrailingSlash('$(SourcePath)') ">$(SourcePath)</SourceDir>
<BuildDir Condition=" '$(BuildPath)' != '' and HasTrailingSlash('$(BuildPath)') ">$(BuildPath)</BuildDir>
<BuildDir Condition=" '$(BuildPath)' != '' and !HasTrailingSlash('$(BuildPath)') ">$(BuildPath)</BuildDir>
<LatestBuildDir>$(BuildDir)Latest$(SourceBranch)</LatestBuildDir>
<LogFileDir>$(BuildDir)Logs</LogFileDir>
<MajorNumber>2</MajorNumber>
<MinorNumber>0</MinorNumber>
<VersionFile>$(LatestBuildDir)CurrentVersion.txt</VersionFile>
<AssemblyVersionFile>$(SourceDir)$(SourceBranch)TestProjectAssemblyVersionInfo.cs</AssemblyVersionFile>
<ProjectReferences>$(MSBuildProjectDirectory)TestProject.proj</ProjectReferences>
<FromEMailAddress>sesgops@microsoft.com</FromEMailAddress>
<BuildDependsOn>
Times;
CheckDirs;
SyncSource;
Version
</BuildDependsOn>
</PropertyGroup>
<ItemGroup>
<ToEMailAddress Include="a@abc.com" />
<ToEMailAddress Include="b@abc.com" />
<ToEMailAddress Include="c@abc.com" />
<CcEMailAddress Include="a1@abc.com" />
<CcEMailAddress Include="a2@abc.com" />
<CcEMailAddress Include="a3@abc.com" />
</ItemGroup>
<Target Name="Times">
<Time Format="yyyyMMdd.HHmmss">
<Output TaskParameter="FormattedTime" PropertyName="LogFileTime" />
</Time>
<CreateItem Include="$(LogFileDir)$(SourceBranch).$(LogFileTime).log">
<Output TaskParameter="Include" ItemName="LogFile"/>
</CreateItem>
<Time Format="MM/dd/yyyy HH:mm:ss">
<Output TaskParameter="FormattedTime" PropertyName="BuildTime" />
</Time>
</Target>
<Target Name="CheckDirs">
<Error
Text=" The "WWWPath" property or environment variable must be set."
Condition="'$(WWWPath)' == ''"
/>
<Error
Text=" The "SourcePath" property or environment variable must be set."
Condition="'$(SourcePath)' == ''"
/>
<Error
Text=" The "BuildPath" property or environment variable must be set."
Condition="'$(BuildPath)' == ''"
/>
<MakeDir
Directories="$(BuildPath)"
Condition="!Exists('$(BuildPath)')"
/>
<MakeDir
Directories="$(LatestBuildDir)"
Condition="!Exists('$(LatestBuildDir)')"
/>
<MakeDir
Directories="$(LogFileDir)"
Condition="!Exists('$(LogFileDir)')"
/>
</Target>
<Target Name="SyncSource">
<Exec
Command="[Your command line]"
IgnoreExitCode="true"
>
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<Error Text="Failed to Sync source code." Condition=" $(ExitCode) != 0 " />
</Target>
<Target Name="Version">
<Version Major="$(MajorNumber)" Minor="$(MinorNumber)" BuildType="Automatic" RevisionType="Automatic" StartDate="2004-07-01">
<Output TaskParameter="Build" PropertyName="BuildNumber" />
<Output TaskParameter="Revision" PropertyName="RevisionNumber" />
</Version>
<CreateProperty Value="$(MajorNumber).$(MinorNumber).$(BuildNumber).$(RevisionNumber)">
<Output TaskParameter="Value" PropertyName="Version" />
</CreateProperty>
<WriteLinesToFile File="$(VersionFile)" Lines="$(Version)" Overwrite="true" />
<ReadLinesFromFile File="$(AssemblyVersionFile)">
<Output TaskParameter="Lines" ItemName="VersionInfo"/>
</ReadLinesFromFile>
<RegexReplace
Input="@(VersionInfo)"
Expression="(s*"([*0-9]+)(.([*0-9]+))+"s*)"
Replacement="("$(Version)")" Startat="0"
>
<Output TaskParameter="Output" ItemName ="NewVersionInfo" />
</RegexReplace>
<Attrib Files="$(AssemblyVersionFile)" ReadOnly="false"/>
<WriteLinesToFile File="$(AssemblyVersionFile)" Lines="@(NewVersionInfo)" Overwrite="true"/>
</Target>
<Target Name="RevertVersionFile">
<Exec
Command="[Your command line]"
IgnoreExitCode="true"
/>
</Target>
<Target Name="SendEMailOnSuccess">
<Mail
SmtpServer="smtphost"
To="@(ToEMailAddress)"
Cc="@(CcEMailAddress)"
From="$(FromEMailAddress)"
Subject="TestProject Daily Build from $(SourceBranch) source"
IsBodyHtml="true"
Body="[Your mail body for success]"
Attachments="@(LogFile)"
/>
</Target>
<Target Name="SendEMailOnFail">
<Mail
SmtpServer="smtphost"
To="@(ToEMailAddress)"
Cc="@(CcEMailAddress)"
From="$(FromEMailAddress)"
Subject="TestProject Daily Build from $(SourceBranch) source"
IsBodyHtml="true"
Body="[Your mail body for fail]"
Attachments="@(LogFile)"
/>
</Target>
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
<Exec Command="MSBuild.exe /nologo /noconlog /l:FileLogger,Microsoft.Build.Engine;logfile=$(LogFileDir)$(SourceBranch).$(LogFileTime).log;append=false;verbosity=normal;encoding=utf-8 /p:WWWRoot=$(WWWRoot);SourceBranch=$(SourceBranch);SourceDir=$(SourceDir);BuildDir=$(BuildDir);BuildNumber=$(BuildNumber) $(ProjectReferences)"
WorkingDirectory="$(SystemRoot)Microsoft.NETFrameworkv2.0.50727"
IgnoreExitCode="true"
>
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<CallTarget Targets="RevertVersionFile" />
<CallTarget Targets="SendEMailOnSuccess" Condition=" $(ExitCode) == 0 " />
<CallTarget Targets="SendEMailOnFail" Condition=" $(ExitCode) != 0 " />
<Error Text="Build failed." Condition=" $(ExitCode) != 0 " />
</Target>
</Project>
<!-- Required Import to use MSBuild Community Tasks -->
<Import Project="$(MSBuildExtensionsPath)MSBuildCommunityTasksMSBuild.Community.Tasks.Targets"/>
<PropertyGroup>
<WWWRoot Condition=" '$(WWWPath)' != '' and !HasTrailingSlash('$(WWWPath)') ">$(WWWPath)</WWWRoot>
<SourceBranch Condition=" '$(SourceBranch)' == '' ">Development</SourceBranch>
<SourceDir Condition=" '$(SourcePath)' != '' and HasTrailingSlash('$(SourcePath)') ">$(SourcePath)</SourceDir>
<SourceDir Condition=" '$(SourcePath)' != '' and !HasTrailingSlash('$(SourcePath)') ">$(SourcePath)</SourceDir>
<BuildDir Condition=" '$(BuildPath)' != '' and HasTrailingSlash('$(BuildPath)') ">$(BuildPath)</BuildDir>
<BuildDir Condition=" '$(BuildPath)' != '' and !HasTrailingSlash('$(BuildPath)') ">$(BuildPath)</BuildDir>
<LatestBuildDir>$(BuildDir)Latest$(SourceBranch)</LatestBuildDir>
<LogFileDir>$(BuildDir)Logs</LogFileDir>
<MajorNumber>2</MajorNumber>
<MinorNumber>0</MinorNumber>
<VersionFile>$(LatestBuildDir)CurrentVersion.txt</VersionFile>
<AssemblyVersionFile>$(SourceDir)$(SourceBranch)TestProjectAssemblyVersionInfo.cs</AssemblyVersionFile>
<ProjectReferences>$(MSBuildProjectDirectory)TestProject.proj</ProjectReferences>
<FromEMailAddress>sesgops@microsoft.com</FromEMailAddress>
<BuildDependsOn>
Times;
CheckDirs;
SyncSource;
Version
</BuildDependsOn>
</PropertyGroup>
<ItemGroup>
<ToEMailAddress Include="a@abc.com" />
<ToEMailAddress Include="b@abc.com" />
<ToEMailAddress Include="c@abc.com" />
<CcEMailAddress Include="a1@abc.com" />
<CcEMailAddress Include="a2@abc.com" />
<CcEMailAddress Include="a3@abc.com" />
</ItemGroup>
<Target Name="Times">
<Time Format="yyyyMMdd.HHmmss">
<Output TaskParameter="FormattedTime" PropertyName="LogFileTime" />
</Time>
<CreateItem Include="$(LogFileDir)$(SourceBranch).$(LogFileTime).log">
<Output TaskParameter="Include" ItemName="LogFile"/>
</CreateItem>
<Time Format="MM/dd/yyyy HH:mm:ss">
<Output TaskParameter="FormattedTime" PropertyName="BuildTime" />
</Time>
</Target>
<Target Name="CheckDirs">
<Error
Text=" The "WWWPath" property or environment variable must be set."
Condition="'$(WWWPath)' == ''"
/>
<Error
Text=" The "SourcePath" property or environment variable must be set."
Condition="'$(SourcePath)' == ''"
/>
<Error
Text=" The "BuildPath" property or environment variable must be set."
Condition="'$(BuildPath)' == ''"
/>
<MakeDir
Directories="$(BuildPath)"
Condition="!Exists('$(BuildPath)')"
/>
<MakeDir
Directories="$(LatestBuildDir)"
Condition="!Exists('$(LatestBuildDir)')"
/>
<MakeDir
Directories="$(LogFileDir)"
Condition="!Exists('$(LogFileDir)')"
/>
</Target>
<Target Name="SyncSource">
<Exec
Command="[Your command line]"
IgnoreExitCode="true"
>
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<Error Text="Failed to Sync source code." Condition=" $(ExitCode) != 0 " />
</Target>
<Target Name="Version">
<Version Major="$(MajorNumber)" Minor="$(MinorNumber)" BuildType="Automatic" RevisionType="Automatic" StartDate="2004-07-01">
<Output TaskParameter="Build" PropertyName="BuildNumber" />
<Output TaskParameter="Revision" PropertyName="RevisionNumber" />
</Version>
<CreateProperty Value="$(MajorNumber).$(MinorNumber).$(BuildNumber).$(RevisionNumber)">
<Output TaskParameter="Value" PropertyName="Version" />
</CreateProperty>
<WriteLinesToFile File="$(VersionFile)" Lines="$(Version)" Overwrite="true" />
<ReadLinesFromFile File="$(AssemblyVersionFile)">
<Output TaskParameter="Lines" ItemName="VersionInfo"/>
</ReadLinesFromFile>
<RegexReplace
Input="@(VersionInfo)"
Expression="(s*"([*0-9]+)(.([*0-9]+))+"s*)"
Replacement="("$(Version)")" Startat="0"
>
<Output TaskParameter="Output" ItemName ="NewVersionInfo" />
</RegexReplace>
<Attrib Files="$(AssemblyVersionFile)" ReadOnly="false"/>
<WriteLinesToFile File="$(AssemblyVersionFile)" Lines="@(NewVersionInfo)" Overwrite="true"/>
</Target>
<Target Name="RevertVersionFile">
<Exec
Command="[Your command line]"
IgnoreExitCode="true"
/>
</Target>
<Target Name="SendEMailOnSuccess">
SmtpServer="smtphost"
To="@(ToEMailAddress)"
Cc="@(CcEMailAddress)"
From="$(FromEMailAddress)"
Subject="TestProject Daily Build from $(SourceBranch) source"
IsBodyHtml="true"
Body="[Your mail body for success]"
Attachments="@(LogFile)"
/>
</Target>
<Target Name="SendEMailOnFail">
SmtpServer="smtphost"
To="@(ToEMailAddress)"
Cc="@(CcEMailAddress)"
From="$(FromEMailAddress)"
Subject="TestProject Daily Build from $(SourceBranch) source"
IsBodyHtml="true"
Body="[Your mail body for fail]"
Attachments="@(LogFile)"
/>
</Target>
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">
<Exec Command="MSBuild.exe /nologo /noconlog /l:FileLogger,Microsoft.Build.Engine;logfile=$(LogFileDir)$(SourceBranch).$(LogFileTime).log;append=false;verbosity=normal;encoding=utf-8 /p:WWWRoot=$(WWWRoot);SourceBranch=$(SourceBranch);SourceDir=$(SourceDir);BuildDir=$(BuildDir);BuildNumber=$(BuildNumber) $(ProjectReferences)"
WorkingDirectory="$(SystemRoot)Microsoft.NETFrameworkv2.0.50727"
IgnoreExitCode="true"
>
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<CallTarget Targets="RevertVersionFile" />
<CallTarget Targets="SendEMailOnSuccess" Condition=" $(ExitCode) == 0 " />
<CallTarget Targets="SendEMailOnFail" Condition=" $(ExitCode) != 0 " />
<Error Text="Build failed." Condition=" $(ExitCode) != 0 " />
</Target>
</Project>
3.DailyBuild.bat
rem @echo off
echo User Domain: %userdnsdomain%
echo User Name: %username%
set CurrentDate=%date: =_%
set CurrentDate=%CurrentDate:/=_%
set CurrentDate=%CurrentDate:-=_%
set CurrentTime=%time: =0%
set CurrentTime=%CurrentTime::=_%
set CurrentTime=%CurrentTime:.=_%
set LogFileName=%CurrentDate%.%CurrentTime%.log
%SystemRoot%/Microsoft.NET/Framework/v2.0.50727/MSBuild.exe /nologo /noconlog /l:FileLogger,Microsoft.Build.Engine;logfile=E:/Build/Logs/DailyBuild.%LogFileName%;append=false;verbosity=normal;encoding=utf-8 /p:WWWPath=C:/Inetpub/wwwroot;SourceBranch=Development;SourcePath=D:/Source/TestProject/Web;BuildPath=E:/Build "D:Source/TestProject/Build/DailyBuild.proj"
echo User Domain: %userdnsdomain%
echo User Name: %username%
set CurrentDate=%date: =_%
set CurrentDate=%CurrentDate:/=_%
set CurrentDate=%CurrentDate:-=_%
set CurrentTime=%time: =0%
set CurrentTime=%CurrentTime::=_%
set CurrentTime=%CurrentTime:.=_%
set LogFileName=%CurrentDate%.%CurrentTime%.log
%SystemRoot%/Microsoft.NET/Framework/v2.0.50727/MSBuild.exe /nologo /noconlog /l:FileLogger,Microsoft.Build.Engine;logfile=E:/Build/Logs/DailyBuild.%LogFileName%;append=false;verbosity=normal;encoding=utf-8 /p:WWWPath=C:/Inetpub/wwwroot;SourceBranch=Development;SourcePath=D:/Source/TestProject/Web;BuildPath=E:/Build "D:Source/TestProject/Build/DailyBuild.proj"
- 利用 MSBuild 实现 Web Application 项目的每日构建(下)
- 利用 MSBuild 实现 Web Application 项目的每日构建(上)
- ccnet +msbuild +svn 每日构建( 一 )
- VSTS2005实现团队项目的每日构建
- 使用MSBUILD发布Web Application
- msbuild构建web应用脚本
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CCNET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 项目管理实践【三】每日构建【Daily Build Using CruiseControl.NET and MSBuild】
- 在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇
- 在.NET环境中实现每日构建(Daily Build)--ccnet,MSBuild篇
- 利用Ant实现项目自动构建测试备份并发布到项目web(1)
- 利用Ant实现项目自动构建测试备份并发布到项目web(2)
- 《ATL Internals》书评 . 潘爱民(转)
- Oracle的CEO Larry.Ellison在耶鲁大学2000届毕业典礼上的演讲
- JSP乱码解决之道1
- JSP连接MYSQL乱码解决方法 (转载)
- DAOFactory 的生成方法
- 利用 MSBuild 实现 Web Application 项目的每日构建(下)
- Google的OpenSocial API
- 展望2008年后11大IT技术的发展方向
- 工厂方法的应用2
- 工厂方法的应用3
- JSD方法
- VB TextBox 简易扩展
- Windows服务编写原理及探讨
- 关于doc命令可以同时执行两条的困扰