利用 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 &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"
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 学士帽戴不稳怎么办 我不想当部长怎么办 把小三打住院会怎么办 汽车ems认证失败怎么办 工行介质失败是怎么办 校园网翻不了墙怎么办 xp网站证书错误怎么办 wifi一直掉线怎么办 太累了头晕怎么办 大专证没有认证怎么办 学生信息怎么办忘了 中专对口大专考不上怎么办 学历认证待校对怎么办 毕业证上没照片怎么办 怎么办学历学位认证证明 教育部学历学位认证怎么办 兵役登记被注册怎么办 学信网手机号忘了怎么办 注销手机号了学信网怎么办 学信网手机换了怎么办 学籍不在籍结业怎么办 电教馆的幼师证怎么办 中考不够建档线怎么办 医保漏交一年怎么办 南通图书馆怎么办饭卡 工商银行卡坏了怎么办 北京一卡通丢了怎么办 甲状腺右叶结节怎么办 ca证书掉了怎么办 地税ca丢了怎么办 南京乘车卡丢失怎么办 老干妈瓶盖打不开怎么办 金陵图书馆书丢失怎么办 幼师资格证丢了怎么办 双证毕业没有怎么办 幼师面试没特长怎么办 资格证到6年没换怎么办 中央巡视组走了怎么办 校园招聘学生违约怎么办 应届毕业生考上公务员档案怎么办 移动硬盘弹不出来怎么办