Windows + Jenkins + .NetFramework + SVN 持续部署

环境准备

服务端环境

安装 Windows 服务器

1、阿里云购买临时服务器

阿里云:https://www.aliyun.com/

2、使用虚拟机安装

可以使用VMWare、VisualBox等虚拟机管理工具来安装环境,本教程将使用虚拟机安装,且 Windows Server 版本为 2016。

Windows Server 2016 安装包:https://download.microsoft.com/download/B/5/F/B5F1A996-B590-45FD-BA99-DE7E745A0882/14393.0.161119-1705.RS1_REFRESH_SERVER_EVAL_X64FRE_ZH-CN.ISO

安装 IIS

必须安装 .net framework 4.6

安装 MSBuild

若要在没有 Visual Studio 的系统上安装 MSBuild,请转到 Visual Studio 下载并向下滚动到“所有下载”,然后展开 “Visual Studio 2019 工具” 。 安装 Visual Studio 2019 生成工具(包含 MSBuild)

在安装程序中,确保选择要为工作负载使用的 MSBuild 工具,然后选择“安装”。

其他版本:MSBuild V14.0

安装 SVN Server 和 SVN Client

SVN Server

1、下载 SVN 安装包

下载地址:https://www.visualsvn.com/downloads/

根据操作系统版本选择 32 位或 64 位安装包,这里选择 64 位安装包。

2、创建用户及 Repository

创建用户:

创建 Repository:

SVN Client

安装 Visual SVN

下载地址:https://www.visualsvn.com/downloads/

跟着安装流程走即可。

安装 nuget.exe CLI

nuget.exe CLI(即 nuget.exe)是适用于 Windows 的命令行实用工具,可提供所有 NuGet 功能;它也可以使用存在一些限制的 Mono 在 Mac OSX 和 Linux 上运行。

要了解如何在 nuget.exe CLI 中使用基本命令,请参阅使用 nuget.exe CLI 安装并使用包

Windows

备注

NuGet.exe 5.0 及更高版本需要 .NET Framework 4.7.2 或更高版本才能执行。

  1. 请访问 nuget.org/downloads,并选择 NuGet 3.3 或更高版本(2.8.6 与 Mono 不兼容)。 始终建议使用最新版。若要将包发布到 nuget.org,版本至少必须是 4.1.0。
  2. 每次下载都直接下载 nuget.exe 文件。 让浏览器将文件保存到选定文件夹。 此文件不 是安装程序;如果直接在浏览器中运行,就不会看到任何内容。
  3. 将文件夹添加到 nuget.exe 中放置 PATH 环境变量的位置,这样就可以从任意位置使用 CLI 工具。

由于我们使用的是 .net framework 4.6,下载 nuget.exe v4.9.4 ,然后放在 C:\nuget 目录下。

然后再配置环境变量。

验证效果:

nuget

安装 .net framework 4.6 Developer Pack

正常情况下,不允许在服务器上安装开发软件,而由于需要在服务器上构建项目,那就需要安装 Developer Pack。

下载地址:https://dotnet.microsoft.com/download/dotnet-framework/net46

客户端环境

安装 Visual Studio 及 Visual SVN

1、安装 Visual Studio 2019

这里安装 Visual Studio 2019 社区版,大家也可以安装专业版。

官网下载:https://visualstudio.microsoft.com/zh-hans/vs/

2、安装 Visual SVN

下载地址:https://www.visualsvn.com/downloads/

跟着安装流程走即可。

项目准备

1、Checkout 和 项目目录结构初始化

在本地电脑上,创建目录 D:\test\helloworld(你也可以在任意位置创建)

  • 将上面 SVN 的仓库 helloworld 签出。

  • 初始化项目目录结构,如下:

  • build:放构建的 bat 脚本
  • lib:放第三方库
  • src:放项目源代码
  • test:放测试代码

2、创建一个初始项目

3、按 F5 运行,查看效果

4、编写 MSBuild

在 build 目录下创建两个文件。

build.bat:

SET MSBUILD="C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin"
SET APPCMD="C:\WINDOWS\System32\inetsrv\appcmd.exe"
SET YEAR=%date:~0,4%
SET MONTH=%date:~5,2%
SET DAY=%date:~8,2%
SET HOUR=%time:~0,2%
SET MINUTE=%time:~3,2%
SET SECOND=%time:~6,2%
%appcmd% stop site helloworld
%MSBUILD% build.proj /target:Default /property:Rebuild=true;Configuration=Debug;RELEASE=false;PatchVersion=%month: =0%%day: =0%;BuildVersion=%hour: =0%%minute: =0%;SolutionName=src\HelloWorld.sln;DeployDir=..\..\..\websites\helloworld
%appcmd% start site helloworld

这个批处理主要做了3件事:

  • 设置变量:SET MSBUILD 等
  • 停止/开始IIS站点:appcmd stop[start] site helloworld,更多请查看https://www.cnblogs.com/sharesdk/p/11290597.html
  • 构建项目:msbuild build.proj
    • /target:Default:表示要执行名字是 Default 的 Target,具体看 build.proj
    • /property:表示要传进 build.proj 的参数,以 key=value 为一对,用分号(;)隔开

build.proj:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Default"
xmlns='http://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="4.0"> <!-- 设置属性值,后面可以使用 $(...) 来调用 -->
<!-- Condition 表示只有当条件成立,才进行设置,一般作为默认值。如果 msbuild.exe 执行时传值进来,就不会使用此默认值 -->
<PropertyGroup>
<MajorVersion Condition="$(MajorVersion) == ''">1</MajorVersion>
<MinorVersion Condition="$(MinorVersion) == ''">0</MinorVersion>
<PatchVersion Condition="$(PatchVersion) == ''">0</PatchVersion>
<BuildVersion Condition="$(BuildVersion) == ''">0</BuildVersion>
</PropertyGroup> <PropertyGroup>
<BuildSolutionDir>$(MSBuildProjectDirectory)\..</BuildSolutionDir>
<SrcDir>$(BuildSolutionDir)\src</SrcDir>
<DeployDir Condition="$(DeployDir) == ''">deploy</DeployDir>
<SolutionName Condition="$(SolutionName) == ''">..\xx.sln</SolutionName>
<Configuration Condition="$(Configuration) == ''">Debug</Configuration>
<!--是否需要重新编译(会删除编译输出目录),编译时间较长-->
<Rebuild Condition="$(Rebuild) == ''">false</Rebuild>
<Version>$(MajorVersion).$(MinorVersion).$(PatchVersion).$(BuildVersion)</Version>
<UnstableTag Condition="$(RELEASE) == ''">-unstable</UnstableTag>
<PackageVersion>$(MajorVersion).$(MinorVersion).$(PatchVersion).$(BuildVersion)</PackageVersion>
<EnvVersion>$(MajorVersion).$(MinorVersion).$(PatchVersion)</EnvVersion>
</PropertyGroup> <!-- Build依赖顺序,即执行顺序 -->
<PropertyGroup>
<DoBuildSolutionsDependsOn>
UpdateSVNReporitory;
BuildSolutions;
BackupWebsite;
DeployWebsite;
</DoBuildSolutionsDependsOn>
</PropertyGroup> <!-- 默认任务 -->
<Target Name="Default" DependsOnTargets="$(DoBuildSolutionsDependsOn)" /> <!-- 从 SVN 更新最新代码 -->
<Target Name="UpdateSVNReporitory">
<Message Text="*****正在从SVN库拉取最新代码*****" Importance="high"/>
<Exec Command="svn update $(BuildSolutionDir)\src" ></Exec>
</Target> <!--编译任务-->
<Target Name="BuildSolutions">
<Message Text="*****正在还原引用的程序包*****" Importance="high"/>
<Exec Command="nuget restore $(BuildSolutionDir)\$(SolutionName) "></Exec> <!--排除web\bin目录垃圾组件影响-->
<Message Text="*****正在清空站点BIN目录文件和dist目录文件*****" Importance="high"/>
<RemoveDir Directories="$(BuildSolutionDir)\src\HelloWorld.Web\bin"></RemoveDir>
<RemoveDir Directories="$(BuildSolutionDir)\lib\dist"></RemoveDir> <MSBuild Projects="$(BuildSolutionDir)\$(SolutionName) " Targets="Build"
Properties="Configuration=$(Configuration);Version=$(PackageVersion)" ContinueOnError="true"/>
</Target> <!--备份原站点目录下的配置文件-->
<Target Name="BackupWebsite">
<Message Text="*****正在备份站点配置文件*****" Importance="high"/>
<Exec Command="XCOPY $(DeployDir)\Web.config $(DeployDir)\backup\ /y" ContinueOnError="true"></Exec>
<!--备份目录下上传的图片文件等资料-->
<!--<Exec Command="XCOPY $(BuildSolutionDir)\$(DeployDir)\files $(BuildSolutionDir)\$(DeployDir)\backup\ /y" ContinueOnError="true"></Exec>-->
</Target> <!--部署站点任务-->
<Target Name="DeployWebsite">
<!--正在清空原部署站点-->
<Message Text="*****正在清空站点目录及文件*****" Importance="high"/>
<RemoveDir Directories="$(DeployDir)\bin" ContinueOnError="true"></RemoveDir> <Message Text="*****正在合并站点文件*****" Importance="high"/>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\App_Data $(BuildSolutionDir)\lib\dist\App_Data\ /y /s /e"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\Content $(BuildSolutionDir)\lib\dist\Content\ /y /s /e"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\fonts $(BuildSolutionDir)\lib\dist\fonts\ /y /s /e"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\Scripts $(BuildSolutionDir)\lib\dist\Scripts\ /y /s /e"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\Views $(BuildSolutionDir)\lib\dist\Views\ /y /s /e"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\bin $(BuildSolutionDir)\lib\dist\bin\ /y /s /e"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\Web.config $(BuildSolutionDir)\lib\dist\ /y /D:m-d-"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\favicon.ico $(BuildSolutionDir)\lib\dist\ /y /D:m-d-"></Exec>
<Exec Command="XCOPY $(BuildSolutionDir)\src\HelloWorld.Web\Global.asax $(BuildSolutionDir)\lib\dist\ /y /D:m-d-"></Exec> <Message Text="*****正在拷贝站点文件*****" Importance="high"/>
<Exec Command="XCOPY $(BuildSolutionDir)\lib\dist $(DeployDir)\ /y /s /e"></Exec> <Message Text="*****正在还原站点备份组件*****" Importance="high"/>
<Exec Command="XCOPY $(DeployDir)\backup $(DeployDir)\ /y /s /e" ContinueOnError="true"></Exec>
</Target> </Project>

更多查看官网:https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild-batching?view=vs-2019

关于 XCOPY 的命令请查看:https://www.jianshu.com/p/83e5cb09d55b

注:在构建时,可能会出现 MSBuild 版本问题,看这篇文章解决:https://my.oschina.net/u/3797416/blog/3164082

再把 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VisualStudio\v16.0(注意 Visual Studio 版本不同,位置不同,这里是 Visual Studio 2019 社区版) 复制到源代码管理下的 BuildTargets 文件夹。

5、创建站点

在本地电脑创建站点 helloworld

注意:站点路径,这里与 build.bat 的参数 DeployDir 有关,站点可以放在任意地方,但是需要同时修改 build.bat 的参数 DeployDir

6、构建效果

在 build 目录下打开 cmd 或 powershell

在浏览器上打开 http://localhost:5000/

7、提交代码

将目录下的所有内容提交到 svn 服务器。

8、服务器签出代码

jenkins

什么是 jenkins?

Jenkins是一个独立的开源自动化服务器,可用于自动化各种任务,如构建,测试和部署软件。Jenkins可以通过本机系统包 Docker 安装,甚至可以通过安装 Java Runtime Environment 的任何机器独立运行。

安装 jenkins

安装 JDK

下载 JDK8:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html

由于官网下载比较慢,且要登录才能下载。可以使用以下地址下载:

链接:https://pan.baidu.com/s/1vJnHF1OMm_XuLNJvcOkoIg

提取码:zxin

配置 java

  • 新建环境变更 JAVA_HOME
变量名:JAVA_HOME
变量值:C:\Java\jdk1.8.0_281

  • 新建/修改 CLASSPATH 变量
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

  • 修改 Path 变量

新建两条路径:

%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin

验证 java 安装成功

java -version

下载 jenkins war 包

jenkins 的Web应用程序 ARchive(WAR)文件版本可以安装在任何支持 java 的操作系统或平台上。

要下载并运行 jenkins 的 WAR 文件版本,请执行以下操作:

  1. 最新的稳定Jenkins WAR包 下载到您计算机上的相应目录。
  2. 在下载的目录内打开一个终端/命令提示符窗口到。
  3. 运行命令java -jar jenkins.war
  4. 浏览 http://localhost:8080 并等到 Unlock Jenkins 页面出现。
  5. 继续使用 Post-installation setup wizard 后面步骤设置向导。

最新的稳定Jenkins WAR包下载到您计算机上的相应目录。

Notes:

  • 不像在Docker中下载和运行有Blue Ocean的Jenkins,这个过程不会自动安装Blue Ocean功能, 这将分别需要在jenkins上通过 Manage Jenkins > Manage Plugins安装。 在Getting started with Blue Ocean有关于安装Blue Ocean的详细信息 。.
  • 您可以通过--httpPort在运行java -jar jenkins.war命令时指定选项来更改端口。例如,要通过端口9090访问Jenkins,请使用以下命令运行Jenkins: java -jar jenkins.war --httpPort=9090

配置 jenkins

1、运行 jenkins

cd /jenkins   			# 切换到 jenkins.war 的目录
java -jar jenkins.war # 运行,默认是 8080 端口

2、jenkins 初始化

  • 输入密码

  • 选择 ”安装推荐插件“

  • 等待安装

  • 创建第一个管理员用户

  • 填写 jenkins url,默认是 http://localhost:8080,可以修改为自己外网的 IP 或者使用域名。

  • 进入 jenkins

配置 jenkins svn

  • 安装 svn plugin

  • 等待安装完成

创建构建项目

  • 点击 ”新建 Item“,创建一个 free style 类型项目

  • 填写基本信息

  • 设置工作空间

点击 “高级”,然后设置自定义的工作空间 C:\test\helloworld

  • 配置源码管理

填写 Repository URL,这里使用的是本地的路径。

选择/添加 Credentials:

  • 配置 ”构建“

选择 ”Execute Windows batch command“:

cd build
call build.bat
  • 点击保存

立即构建

  • 创建站点

  • 点击 "Build Now"

  • 点击 “构建历史”,再点击 “控制台输出”

  • 查看到 SUCCSS,表示构建成功

至此,一个简单的 .net 项目的持续部署配置完成。

如何自动构建

上面的构建是需要手动点击 "Build Now" 才执行的,正常情况下,我们希望是提交代码就触发构建。

由于 SVN 没有 Github、Gitee等 Git 工具的 push hook 功能,只能曲线求国,通过定时器来触发,判断版本号是否有更新。

总结

本教程主要是面向比较传统的 .net framework 开发方式,将其改造成持续部署。当然了,现在很多都已经在使用 git 系列的代码管理工具了,后面我们再来说说 .net core + git 的持续部署方式。

Windows + Jenkins + .NetFramework + SVN 持续部署的更多相关文章

  1. .NET Core微服务之基于Jenkins+Docker实现持续部署(Part 1)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.CI, CD 与Jenkins 互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous i ...

  2. jenkins+maven+svn 持续集成环境搭建

    说明:部署传统的web应用(.war) 准备工作: (1) 系统环境:CentOS7 (2) 安装JDK:https://www.cnblogs.com/myitnews/p/11493847.htm ...

  3. jenkins+maven+svn 自动化部署

    背景: 公司的web平台使用JAVA写的,但是不是用Tomcat部署的,代码内部自带了Web服务器,所以只需要有JAVA环境,将代码打包上传,启动脚本就可以. 项目是根据pom.xml打包成的是.zi ...

  4. Jenkins与SVN持续集成

    官网下载Jenkins&SVN&eclipse,版本号没要求,建议使用最新稳定版本 登录Jenkins:http://localhost:8080 登录SVN:http://local ...

  5. jenkins+php+svn快速部署测试环境开发环境快速部署

    jenkins 虽然作为java常用的打包部署工具,不过也可以使用在phpweb项目部署管理,前段时间帮公司部署了开发环境与测试环境,简单分享一下. 1.内网web环境搭建lnmp,centos下编译 ...

  6. Jenkins+maven+SVN+Tomcat部署过程

    一.下载地址 应首先确认安装了JDK: Jenkins下载地址:http://mirrors.shu.edu.cn/jenkins/windows-stable/jenkins-2.107.3.zip ...

  7. Jenkins + maven + svn 自动部署项目

    1.安装Jenkins sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins. ...

  8. # k8s-jenkins在kubernetes中持续部署

    k8s-jenkins在kubernetes中持续部署 1. k8s-jenkins在kubernetes中持续部署 Kubernetes Continuous Deploy插件:用于将资源配置部署到 ...

  9. Jenkins+MSbuild+SVN实现快速搭建.net持续集成环境(构建、编辑、部署到服务器)

    Jenkins是一个可扩展的持续集成引擎,Jenkins非常易于安装和配置,简单易用,下面开始搭建.net持续集成环境 Jenkins和SVN安装这里就不介绍了 一.准备工作 1.Jenkins中系统 ...

随机推荐

  1. Open Collective

    Open Collective Open Collective is an online funding platform for open and transparent communities. ...

  2. JavaScript 如何使用 setTimeout 实现 setInterval

    JavaScript 如何使用 setTimeout 实现 setInterval website multi content page setIntervalSimulator "use ...

  3. npm & package.json & directories & files

    npm & package.json & directories & files package.json https://docs.npmjs.com/files/packa ...

  4. qt 获取窗口句柄的线程id和进程id GetWindowThreadProcessId

    int lpdwProcessId; int id = GetWindowThreadProcessId((HWND)0x707d6, (LPDWORD)&lpdwProcessId); qD ...

  5. DAPHNE PATEL:有主见的人,才能活出精彩人生

    有主见的人,会活出什么样子呢?近日,NGK灵石团队技术副总裁DAPHNE 女士给出了答案. DAPHNE PATEL表示,有主见的人,才能活出精彩的人生.为什么这么说呢? DAPHNE PATEL用自 ...

  6. NGK全球巡回路演莫斯科站,共探BGV能否超越YFI?

    近日,NGK全球巡回路演在俄罗斯首都莫斯科落下帷幕.此次路演取得了空前的成功.路演伊始俄罗斯路演讲师Andrew致开幕辞,安德鲁称,俄罗斯作为未一个幅员辽阔的大国,区块链技术有着非常大的应用场景. 俄 ...

  7. Java自学第2期——注释、数据类型、运算符、方法

    2.1.注释 注释用于说明某段代码的作用,某个类的用途,某个方法的功能,参数和返回值数据类型的意义等等: 注释非常非常非常重要,回顾代码时通过注释找回思路:团队沟通需要,让别人读懂你的代码,增加效率: ...

  8. idea加载maven项目遇见的坑---2

    idea每次加载完一个maven项目,都需要重新配置 file>>>Settings 然后继续找 还有就是配置项目的时候 配置项目jdk 最后需要注意,有时候你会发现都设置完了,但是 ...

  9. 痞子衡嵌入式:自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动. 接着上篇文章 <了解i.M ...

  10. 阿里云DataWorks实践:数据集成+数据开发

    简介 什么是DataWorks: DataWorks(数据工场,原大数据开发套件)是阿里云重要的PaaS(Platform-as-a-Service)平台产品,为您提供数据集成.数据开发.数据地图.数 ...