利用 MSBuild 实现 Web Application 项目的每日构建(下)

本文是关于利用MSBuild进行Web Application项目每日构建的下篇,提供完整代码示例,包括TestProject.proj、DailyBuild.proj和DailyBuild.bat,旨在促进自动化构建过程的交流与分享。

 

在上篇文章 利用 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 &quot;WWWRoot&quot; property or environment variable must be set."
            Condition
="'$(WWWRoot)' == ''"
        
/>
        
        
< Error
            
Text =" The &quot;SourceBranch&quot; property or environment variable must be set."
            Condition
="'$(SourceBranch)' == ''"
        
/>
        
        
< Error
            
Text =" The &quot;SourceDir&quot; property or environment variable must be set."
            Condition
="'$(SourceDir)' == ''"
        
/>
        
        
< Error
            
Text =" The &quot;BuildDir&quot; property or environment variable must be set."
            Condition
="'$(BuildDir)' == ''"
        
/>
        
        
< Error
            
Text =" The &quot;BuildNumber&quot; 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 &quot;WWWPath&quot; property or environment variable must be set."
            Condition
="'$(WWWPath)' == ''"
        
/>
        
        
< Error
            
Text =" The &quot;SourcePath&quot; property or environment variable must be set."
            Condition
="'$(SourcePath)' == ''"
        
/>
        
        
< Error
            
Text =" The &quot;BuildPath&quot; 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*&quot;([*0-9]+)(.([*0-9]+))+&quot;s*)"
            Replacement
="(&quot;$(Version)&quot;)"  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 >

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 "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值