在上篇文章 利用 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
>
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
>
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
"
本文是关于利用MSBuild进行Web Application项目每日构建的下篇,提供完整代码示例,包括TestProject.proj、DailyBuild.proj和DailyBuild.bat,旨在促进自动化构建过程的交流与分享。
&spm=1001.2101.3001.5002&articleId=1865198&d=1&t=3&u=472a54fc4a18469b9447a699b013abde)
194

被折叠的 条评论
为什么被折叠?



