前言

因每次发布版本的时候,都需要打开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. geo-经纬度计算

    经纬度计算, 本质上是球面三角函数的应用, 将数学公式转换为代码的过程, 站在前人的肩膀上, 自己又补充了一点: package com.iwhere.easy.travel.tool; public ...

  2. <Think Python>中统计文献单词的处理代码

    def process_line(line, hist):    """Adds the words in the line to the histogram. Modi ...

  3. 第五章 Web应用程序状态管理

      状态管理概述 Cookie Session URL重写   状态管理概述: HTTP协议使用的是无状态的连接 对容器而言,每一个请求都来自于一个新的客户 这里我们有四种方法来解决这个状态: a:表 ...

  4. 熟悉DAO模式的用法

    今天主要是使用DAO模式. DAO模式通过对业务层提供数据抽象层接口,实现了以下目标: 1. 数据存储逻辑的分离 通过对数据访问逻辑进行抽象,为上层机构提供抽象化的数据访问接口.业务层无需关心具体的s ...

  5. tcp/ip通信中ip头部结构iph->check校验计算

    通过raw socket修改通信数据后,可通过该函数重新校验计算iph->check值 在http://www.cnblogs.com/dpf-10/p/7899237.html查看实际调用 s ...

  6. Docker实战-为镜像添加SSH服务

    1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...

  7. 【CentOS7】CentOS 7 安装 MySQL

    转自:http://www.centoscn.com/mysql/2016/0315/6844.html 环境 CentOS 7.1 (64-bit system) MySQL 5.6.24 Cent ...

  8. NIO,AIO,BIO

    同步和异步:同步和异步关注的是消息通信机制, 同步:就是在发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,但是一旦调用返回,就得到返回值了;换句话说:就是由“调用者”主动等待“调用”结果 ...

  9. Logback 日志持久化

    Logback是log4j的增强版,比log4j更具灵活,其提供了将日志输出到数据库的功能,本文将介绍如何将指定的日志输出到mysql中. 一.自定义log标志 由于Logback原生的配置会将所有的 ...

  10. 设计模式(9)--Composite(组合模式)--结构型

    1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...