.NET实现自动编译
前言
因每次发布版本的时候,都需要打开vs项目,然后进行编译。如果刚好手里有文件在修改,就需要先签入之类的。所以想找个可以实现自动编译的工具。
在网上查询了不少资料,终于基本上实现了自动编译的功能。因为自动部署涉及到服务器管理,本人也不熟悉,就不讨论了。
一、环境准备
1. 我这边使用的是git,也可以用svn之类的其他版本控制器。git服务器用的是gitlab.
2. 下载git windows客户端,在自动编译服务器上安装。
3. 下载TortoiseGit windows客户端, 安装。
4. 在任意目录上右键,选择Git Bash here, 输入ssh-keygen, 一直默认回车。 之后会在用户目录(c:\user\你的系统用户名\.ssh)下生成2个文件: id_rsa和id_rsa.pub.
5. 打开开始菜单,打开TortioseGit里面的PuTTYGen 。 点击Conversion下的Import Key, 打开之前生成的id_rsa(不带后缀的)。复制输入框中的ssh-rsa那一大串文字到gitlab里面的ssh keys. 点击Save private key, 保存文件为id_rsa.ppk。
6. 下载jenkins安装。需要安装的插件:git plugin, msbuild plugin, credentials binding plugin, Parameterized trigger plugin.
7. 下载nuget.exe.
二、编写msbuild
1. 新建一个空解决方案Lake, 里面有Lake.Web这个web项目。
2. 在解决方案根目录增加一个文件: build.msbuild。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build-Release" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<BuildArtifactsDir Include="BuildArtifacts\" />
<Solution Include="$(MSBuildThisFileDirectory)Lake.Web\Lake.Web.csproj">
<Properties>
Platform=Any CPU;
Configuration=Release;
DeployOnBuild=True;
DeployTarget=Package;
_PackageTempDir=$(OutDir);
AutoParameterizationWebConfigConnectionStrings=false;
UseWPP_CopyWebApplication=true;
PipelineDependsOnBuild=false;
OutputPath=..\Published\Lake.Web
</Properties>
</Solution>
</ItemGroup>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<BuildPlatform Condition=" '$(BuildPlatform)' == '' ">Any CPU</BuildPlatform>
<OutDir>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.targets))\release\Lake.Web</OutDir>
</PropertyGroup>
<Target Name="Build-Release" BeforeTargets="BeforeBuild"
AfterTargets="AfterBuild"
DependsOnTargets="Init">
<MSBuild Projects="@(Solution)"
Targets="Rebuild">
<Output TaskParameter="TargetOutputs" ItemName="Assemblies" />
</MSBuild>
</Target>
<Target Name="CopyContentFiles" AfterTargets="Build">
</Target>
<Target Name="Clean">
<RemoveDir Directories ="$(MSBuildThisFileDirectory)..\Published\Lake.Web" />
<RemoveDir Directories="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.targets))\release\Lake.Web" />
</Target>
<Target Name="Init" DependsOnTargets="Clean">
<!-- <MakeDir Directories="@(BuildArtifactsDir)" /> -->
</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="after build" Importance="high" />
</Target>
</Project>
msbuild
这里面有几个目录:
$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), common.targets))\release\Lake.Web 这个是表示从当前目录,一直往上找,找到一个common.targets的文件,最终的的发布文件会在这个目录里面的release\Lake.web下。
..\Published\Lake.Web 这个目录表示编译后的输出目录。
3. 签入提交到git.
三、配置Jenkins
1. 打开Manager Jenkins/Configure System, 点击Home directory 下的Advanced..., 其中Workspace Root Directory就是以后所有的git repoistory放置的目录。
我这里设置的是: D:\git/${ITEM_FULLNAME} .
然后在这个目录下(d:\git)新建一个空文件: common.targets.
把之前下载的nuget.exe也复制到这里。
2. Manager Jenkins/ Global Tool Configuration
Git-Path to Git executable, 这个是你的git安装地址: C:\Program Files\Git\bin\git.exe
MSBuild-> MSBuild installations: Name:Dotnet4.0, Path to MSBuild: C:\Program Files (x86)\MSBuild\14.0\Bin\ 注: 这个path是看你安装的.net版本.
四、发布任务
1. New Item
Enter an item name, 然后选择Freestyle project.
2. Git
Repositoryies: git@192.168.1.8:.net/Lake.git (git里面可以查看到)
Credentials: 点击Add, 在key里面输入之前id_rsa.ppk内容。

Repository browser: gitlab
version: 6.5
3. Build: Add build step -> Build a Visual Studio project or solution using MSBuild
MSBuild Version: 之前MSBuild输入的Dotnet4.0
MSBuild Build File: D:\git\Lake\build.msbuild
4. 如果这个任务依赖于别的任务,在此项目之前,必须编译另外一个任务,在Add build step里面选择Trigger/call builds onother projects. 然后输入另外一个Projects的名称。 勾选Block until.
5. 还原Nuget包
Add build step -> Execute Windows batch command.
输入: d:\git\nuget.exe restore "D:\git\Lake\Lake.sln"
6. Post-build Actions
Archive the artifacts(这个主要是为了nuget下载的包,每次编译之前保留)
File to archive: packages/**
7. 如果有时候提示git没有权限,则进入服务,切换Jenkins的运行在为当前用户。
8. Build Now, 可以看到成功还是失败。
9. 所有的编译文件,都在之前build.msbuild里面的release\Lake.web
五、参考资料
1. 用MSBuild和Jenkins搭建持续集成环境(1)
2. .NET Web Development and Tools Blog
3. Configure NuGet Package Restoration
.NET实现自动编译的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询
问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...
- [CI] 使用Jenkins自动编译部署web应用
写在前面 初步接触持续集成自动化过程,本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程 持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作 ...
- 【Android】Eclipse自动编译NDK/JNI的三种方法
[Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...
- gulp之压缩合并MD5清空替换加前缀以及自动编译自动刷新浏览器大全
gulp是基于流的前端构件化工具.目前比较火的前端构建化工具还是挺多的,grunt gulp fis3等等. 这个鬼东西有什么用?请参考https://www.zhihu.com/question/3 ...
- Eclipse不自动编译java文件的终极解决方案
最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...
- Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)
文章来源:http://www.cnblogs.com/xfiver/archive/2010/07/07/1772764.html 1. IOException parsing XML docum ...
- TypeScript 自动编译
安装Typescript npm install -g typescript 手动编译 tsc greeter.ts 自动编译 tsc -w greeter.ts
- Eclipse不能自动编译 java文件
在网上的解决方法 方法参考如下: (1) Window-->Preferences-->General-->Workspace 有个"Build automatica ...
- WebStorm 9 自动编译 SCSS 产出 CSS 和 source maps
1. 上一节我们学习了Windows下搭建Ruby开发环境,也为这一节的学习做了铺垫.因为本节需要在Ruby环境下安装SASS.详细请见:http://www.cnblogs.com/wind128 ...
- WebStorm 9 自动编译 LESS 产出 CSS 和 source maps
1.双击桌面Chrome图标,打开Chrome,按键盘“F12”键,打开开发工具界面,点击其右上角的“设置”按钮,勾选“Enable JavaScript source maps” 及“Enable ...
随机推荐
- WPF中Grid的行的Height和列的Width根据内容自适应
Grid中RowDefinition的Height和ColumnDefinition的设置都有三种: 1. 具体数值,固定不变: 2. * 星号,如: 2*,5*,8*: 分母为(2+5+8=15), ...
- 关于winform文本框怎么实现html的placeholder效果
winfrom默认是不支持这种操作的,此时需要重写控件操作,具体代码如下: public class TextBoxEx : TextBox { public String PlaceHolderSt ...
- 反射实现Model修改前后的内容对比
在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 public class User { priv ...
- Effective C++ 50条款
条款1:尽量用const和inline而不用#define 以const 行使常量折叠,用inline 代替常用操作的宏定义,而且库里面有很多常用函数可用.当然不能抛弃宏,宏还是很有用滴.偶最近才发现 ...
- 【游记】CCHO TY国初划水记
没想到第一篇游记竟然是化学国初(其实是上次SXACM时候懒得写 DAY0 一下午做了5个小时的校车,服务区水真贵 肝了4个小时模拟题,颠到崩溃. 下榻在距离山大附不远的一个酒店,高三人好多哇,我们年级 ...
- [android] WebView自定义浏览器
在布局文件中添加<EditText/>和<Button/>控件, 在布局文件中添加<WebView/>控件 在Activity中获取WebView对象 调用WebV ...
- SpringBoot结合Swagger2自动生成api文档
首先在pom.xml中添加如下依赖,其它web,lombok等依赖自行添加 <dependency> <groupId>io.springfox</groupId> ...
- uni-app初体验及打包成apk
首先用HBuilderX新建建一个uni-app项目 新建一个目录ucenter,该目录下新建两个vue文件ucenter.vue和setting.vue ucenter.vue <templa ...
- EF Codefirst(二)数据注释
CodeFirst通过分析我们在代码里编写的类,以及类之间的关系生成数据库表,以及表之间的各种关系.数据库的表会涉及到主键,外键,列是否为空,列类型等等. 我们要通过怎样的方式来暴露这些信息呢? ...
- Python paramiko ssh 在同一个session里run多个命令
import threading, paramiko strdata='' fulldata='' class ssh: shell = None client = None transport = ...