前言

因每次发布版本的时候,都需要打开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实现自动编译的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

  2. [CI] 使用Jenkins自动编译部署web应用

    写在前面 初步接触持续集成自动化过程,本篇主要介绍基于Jenkins实现持续集成的方式,通过案例介绍线上自动编译及部署的配置过程 持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成它们的工作 ...

  3. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  4. gulp之压缩合并MD5清空替换加前缀以及自动编译自动刷新浏览器大全

    gulp是基于流的前端构件化工具.目前比较火的前端构建化工具还是挺多的,grunt gulp fis3等等. 这个鬼东西有什么用?请参考https://www.zhihu.com/question/3 ...

  5. Eclipse不自动编译java文件的终极解决方案

    最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...

  6. Eclipse下无法自动编译,或者WEB-INF/classes目录下没文件,编译失败的解决办法(转载)

    文章来源:http://www.cnblogs.com/xfiver/archive/2010/07/07/1772764.html 1.  IOException parsing XML docum ...

  7. TypeScript 自动编译

    安装Typescript npm install -g typescript 手动编译 tsc greeter.ts 自动编译 tsc -w greeter.ts

  8. Eclipse不能自动编译 java文件

      在网上的解决方法 方法参考如下: (1) Window-->Preferences-->General-->Workspace  有个"Build automatica ...

  9. WebStorm 9 自动编译 SCSS 产出 CSS 和 source maps

    1.  上一节我们学习了Windows下搭建Ruby开发环境,也为这一节的学习做了铺垫.因为本节需要在Ruby环境下安装SASS.详细请见:http://www.cnblogs.com/wind128 ...

  10. WebStorm 9 自动编译 LESS 产出 CSS 和 source maps

    1.双击桌面Chrome图标,打开Chrome,按键盘“F12”键,打开开发工具界面,点击其右上角的“设置”按钮,勾选“Enable JavaScript source maps”  及“Enable ...

随机推荐

  1. WPF中Grid的行的Height和列的Width根据内容自适应

    Grid中RowDefinition的Height和ColumnDefinition的设置都有三种: 1. 具体数值,固定不变: 2. * 星号,如: 2*,5*,8*: 分母为(2+5+8=15), ...

  2. 关于winform文本框怎么实现html的placeholder效果

    winfrom默认是不支持这种操作的,此时需要重写控件操作,具体代码如下: public class TextBoxEx : TextBox { public String PlaceHolderSt ...

  3. 反射实现Model修改前后的内容对比

    在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 public class User { priv ...

  4. Effective C++ 50条款

    条款1:尽量用const和inline而不用#define 以const 行使常量折叠,用inline 代替常用操作的宏定义,而且库里面有很多常用函数可用.当然不能抛弃宏,宏还是很有用滴.偶最近才发现 ...

  5. 【游记】CCHO TY国初划水记

    没想到第一篇游记竟然是化学国初(其实是上次SXACM时候懒得写 DAY0 一下午做了5个小时的校车,服务区水真贵 肝了4个小时模拟题,颠到崩溃. 下榻在距离山大附不远的一个酒店,高三人好多哇,我们年级 ...

  6. [android] WebView自定义浏览器

    在布局文件中添加<EditText/>和<Button/>控件, 在布局文件中添加<WebView/>控件 在Activity中获取WebView对象 调用WebV ...

  7. SpringBoot结合Swagger2自动生成api文档

    首先在pom.xml中添加如下依赖,其它web,lombok等依赖自行添加 <dependency> <groupId>io.springfox</groupId> ...

  8. uni-app初体验及打包成apk

    首先用HBuilderX新建建一个uni-app项目 新建一个目录ucenter,该目录下新建两个vue文件ucenter.vue和setting.vue ucenter.vue <templa ...

  9. EF Codefirst(二)数据注释

    CodeFirst通过分析我们在代码里编写的类,以及类之间的关系生成数据库表,以及表之间的各种关系.数据库的表会涉及到主键,外键,列是否为空,列类型等等. 我们要通过怎样的方式来暴露这些信息呢?   ...

  10. Python paramiko ssh 在同一个session里run多个命令

    import threading, paramiko strdata='' fulldata='' class ssh: shell = None client = None transport = ...