因本人一直使用.NET开发,在做项目的时候,每次都要涉及到各个环境的部署问题,手工操作容易出错,并且重复劳动多,所以一直在寻找一个能实现自动化部署的方案。
废话不多讲,先讲讲我的初步实现方案。
准备工具:GIT版本控制(gitlab),Jenkins, msbuild
1. 安装git版本控制器,提交代码。(svn好像也可以), 并生成ssh public key上传到gitlab的ssh key中(个人配置/SSH KEY)。
2. 安装jenkins开源工具。
3. Jenkins安装git plugin, Msbuild插件(Manager Jenkins/Manage Plugins)
4. 配置Jenkins中的git(Manager Jenkins/Configure System)
在git栏中输入name和Path: git install path\cmd\git.exe
5. 添加对应.NET framework version MSBuild
Name: .NET4.0
Path to MSBuild:
%system%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
6. 建立.NET项目文件,并添加MSBuild文件
建立一个解决方案nonsuch.sln,里面包含一个website: nonesuch.web.
在解决方案根目录建立一个xml文件,改名为: build.targets
<?
xml version="1.0" encoding="utf-8"
?>
<
Project
ToolsVersion
="4.0"
DefaultTargets
="Build-Release"
xmlns
="http://schemas.microsoft.com/developer/msbuild/2003"
>
<
ItemGroup
>
<
Solution
Include
="$(MSBuildThisFileDirectory)nonsuch.sln"
>
<
Properties
>
Platform=Any CPU;
Configuration=Release;
DeployOnBuild=True;
DeployTarget=Package;
_PackageTempDir=$(OutDir);
AutoParameterizationWebConfigConnectionStrings=false;
UseWPP_CopyWebApplication=true;
PipelineDependsOnBuild=false
</
Properties
>
</
Solution
>
</
ItemGroup
>
<!--
Log level properties
-->
<
PropertyGroup
>
<
Configuration
Condition
=" '$(Configuration)' == '' "
>Release
</
Configuration
>
<
BuildPlatform
Condition
=" '$(BuildPlatform)' == '' "
>Any CPU
</
BuildPlatform
>
<
OutDir
>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.targets))\..\WebSite\nonsuch.web
</
OutDir
>
</
PropertyGroup
>
<
Target
Name
="Build-Release"
BeforeTargets
="BeforeBuild"
AfterTargets
="AfterBuild"
DependsOnTargets
="Init"
>
<
MSBuild
Projects
="@(Solution)"
>
<
Output
TaskParameter
="TargetOutputs"
ItemName
="Assemblies"
/>
</
MSBuild
>
</
Target
>
<
Target
Name
="CopyContentFiles"
AfterTargets
="Build"
>
</
Target
>
<
Target
Name
="Clean"
>
<
Message
Text
="如果需要,可以清除之前的目录"
Importance
="high"
/>
</
Target
>
<
Target
Name
="Init"
DependsOnTargets
="Clean"
>
<
Message
Text
="在编译前做的一些事情"
Importance
="high"
/>
</
Target
>
<
Target
Name
="RunUnitTests"
DependsOnTargets
="Compile"
>
<
Exec
Command
='"@(NUnitConsole)" @(UnitTestsDLL) /xml=@(TestResultsPath)'
/>
</
Target
>
<
Target
Name
="BeforeBuild"
>
<
Message
Text
="%(AssembliesBuiltByChildProjects.Identity)"
/>
</
Target
>
<
Target
Name
="AfterBuild"
>
<
Message
Text
="编译之后做的事情"
Importance
="high"
/>
</
Target
>
</
Project
>
Build.targets
7. 新建一个任务: Build a free-style software project
1) Advanced Project options: Use custom workspace
输入此任务的文件夹,获取的git项目文件,将放入此文件夹中(d:\Git\nonsuch)。
2) Source code Management: Git
Repositories Url: 输入项目的Git地址,如:
[email protected]:dotnet/nonsuch.git
Repository browser: gitlab
Url: gitlab的url地址,比如: http://gitlab.gofund.com.cn/dotnet/nonsuch
Version: 6.2
3) Build
Build a Visual Studio Project or solution using MSBuild
MSBuild Version: .NET 4.0(之前配置的MSBuild版本)
MSBuild Build File: 这个地址就是之前配置的workspace路径:
d:\Git\nonsuch\Build.targets
4) Post-build Actions
Archive the artifacts(这个主要是为了nuget下载的包,每次编译之前保留)
File to archive : packages/**
5) 点击Save保存,之后点击:Build Now
8. 如果有时候提示git没有权限,则进入服务,切换Jenkins的运行者为当前用户。
9. 为了解决一些引用依赖路径问题,我用在msbuild中用了GetDirectoryNameOfFileAbove这个关键字,有兴趣的可以搜索下。
10. 这样就通过Jenkins工具,调用git版本控制器,自动获取最新版本代码,发布到某个文件夹,然后IIS可以指向到发布的文件夹。但这样涉及到web.config配置,如果希望不同环境的web.config配置不一样,可以利用debug, release生成的web.config文件,甚至可以把配置放入到统一个数据库中,根据机器的名字自动获取对应环境。
这是我的实现,不知道有没有更好的解决方案。主要是利用msbuild, 这个还有很多功能需要去探索。