Jenkins测试环境到生产环境的一键部署策略(Windows)

一、前言

    前面我们已经初步实现了开发集成环境、测试环境的持续集成(自动化构建、自动化测试、自动化部署)。但生产环境自动化部署迟迟没有推进。其原因主要在以下几个方面:

  • 尚未实现部署之前的自动化备份
  • 尚未实现部署出现问题后的自动化回滚
  • 由于之前采用FTP上传部署需要生产环境开放FTP端口存在安全性问题且FTP会因为各种的网速问题,导致站点瞬间挂掉

只要解决以上三个问题,我们就可以初步实现生产环境的自动化部署。

系列文章

.NET实现持续集成与自动化部署1-Jenkins

.NET实现持续集成与自动化部署2-NuGet

.NET实现持续集成与自动化部署3-测试环境到生产环境策略

二、实现思路

  1. 利用Jenkins分布式的特性,其中Jenkins服务器作为Master服务器,将生产环境(可以一台也可以多台服务器)作为Jenkins集群中的一台Slave服务器。
  2. 测试环境应该模拟和生产环境的配置和编译版本保持是Release状态,且功能已经满足预期发布需求。
  3. 通过文件复制插件,复制测试环境上的部署文件到生产环境上的jenkins工作空间。
  4. 通过批处理处理不需要覆盖的文件或者临时要修改的配置等。
  5. 利用rar备份生成环境上即将要覆盖的文件,注意命名上遵循一定规律:项目-文件夹-{BuildID}.bak.rar或日期-项目-文件夹-{BuildID}.bak.rar。
  6. 利用批处理进行从jenkins工作空间上把文件复制到站点上,常用命令:xcopy。
  7. 若生产环境程序出现问题,由项目经理和运维人员决定是紧急修复bug还是启用回滚,回滚则采用批处理命令将备份的文件压缩回生产环境站点下的目录内。

通过以上策略可以实现测试环境到生产环境的一键部署,实现了部署前的自动化备份,出现问题的自动化回滚,利用Jenkins Master-Slave特性解决了需要开放FTP端口的的问题,并且将先在测试站点测试好的文件,复制到正式站点上的一个缓冲区,进行预热配置,之后在本机进行文件替换,速度是相当的快,解决了FTP上传过程中网络问题导致站点挂掉的问题。

缺陷与问题:

  1. 生产环境需作为Jenkins 集群中的一台服务器并承担一部分构建任务,但通过配置此问题可忽略不计
  2. 生产环境需安装JDK并开启一个Java服务
  3. 待发现

三、生产环境拓扑图

四、所需Jenkins插件

  1. Copy data to workspace plugin 插件
  2. Copy Artifact Plugin
  3. Node and Label parameter plugin 插件

五、实现步骤

  1. 搭建slave

1.1 Jenkins系统管理-->管理节点-->新建节点

!

1.2 输入节点名称,next,配置如下图

其中,有如下几点需要注意:

  • 【# of executors】根据CPU的个数来填写数量

  • 【远程工作目录】这个就是用来存放master到slave时,存放的临时目录,如slave的服务软件也会放在此,并且会以每个job名称来区分开

  • 【用法】只需要选择【只允许运行绑定到这台机器的Job】这种模式下,Jenkins只会构建哪些分配到这台机器的Job。这允许一个节点专门保留给某种类型的Job。例如,在Jenkins上连续的执行测试,你可以设置执行者数量为1,那么同一时间就只会有一个构建,一个实行者不会阻止其它构建,其它构建会在另外的节点运行。通过这个配置生产环境就可以仅做自己的构建。

  • 【启动方式】只需要选择【Launch agent via Java Web Start】,以服务的方式启动,应用最广且最好配置,其余的都太复杂,不建议使用。注意:2.x版本的默认没有这个选项,需要单独开启。其余的基本按照上面默认选择即可。

Launch agent via Java Web Start开启方式:

Jenkins-->系统管理-->Configure Global Security-->Agents-->修改为随机选取



1.3 点击保存后,master上已经配置好节点,那么接下来就是到节点的服务器上安装slave的服务:

点击右侧列表的节点服务器,此时节点并未连通。



进入详情页面,会提示你如何安装服务:

注意:由于Slave服务为Java服务,因此Slave服务器上需安装JDK

当Slave服务器上出现以下服务时代表安装并连接成功



此时回到Jenkins 服务器上查看状态已经连接上

说明:这里只介绍基于现有需求的一种策略,关于Jenkins Master-Slave连接机制与原理不多做介绍,网上关于这方面的介绍也很多,大家可以自行搜索。

  1. 创建生产环境自动化部署任务

    2.1 参数化配置选择Slave构建

    Jenkins 新建自由风格的软件项目



    参数化构建-->添加参数-->选择node



    若没有此参数安装Node and Label parameter plugin 插件

    参数化配置可按下图进行,也可根据需要自行配置

2.2 文本复制

文本复制可选择两个插件

Copy data to workspace plugin 插件

可以复制Jenkins Master服务器的文件到Slave工作空间内

缺点:不支持参数化

Copy Artifact Plugin 插件

可以实现Jenkins Slave-Slave Master-Slave之间的复制,可以将一个Job构建后的生成物复制到当前工作空间内

缺点:需再要复制的Job内内配置Archive the artifact

可以根据所需自行选择插件,这里为了能够参数化我们选择Copy Artifact Plugin插件



配置说明:

  • Project name:要Copy的项目名称,这里可以使用参数化
  • Which build:选择那一次构建后的产物,一般可以选择Latest successful build
  • Stable build only:是否选择稳定的构建
  • Artifacts to copy:要Copy的文件,可以进行规则匹配,如Test/**/*,即Test文件夹下所有文件
  • Artifacts not to copy:根据规则排除某些文件
  • Target directory:本地工作空间的那个文件夹内
  • Parameter filters:这里没用到,用到的话,可以自己看说明

注意:这里需要前置Job配置

在要复制的Job内增加构建后操作如下图:

2.3 自动化备份

填写备份的批处理,这里可以使用WindowsRAR的压缩命令,所以如果要用RAR的时候,确保机器上已经安装WindowsRAR。注意名称必须要有规则且每次构建不能重复,因此可以使用项目名称+BuildID或者日期+项目名称+BuildID

//自动备份批处理命令
start c:\"Program Files"\winrar\rar.exe a -k -r -s -m1
-ag{HS.Shop.My-%BUILD_ID%.bak} {要备份到的文件夹} {要备份的文件夹}

2.4 覆盖站点目录下的文件

备份完成后将Jenkins工作空间下的文件复制到站点目录下,此时必须保证发布包已经排除掉了不需要覆盖的文件,并且是稳定可用的版本。批处理命令可采用xcopy命令。关于xcopy命令的使用可以自行百度

xcopy  {slave工作空间上的项目文件夹} {要复制到替换的文件夹}  /Y/E

到了这一步就完成了生产环境的自动化部署的任务配置。点击构建即可完成测试环境到生产环境的一键部署。此时若程序出现问题可以采用紧急修复或者自动化回滚。

  1. 创建生产环境自动化回滚任务

3.1 同样新建一个自由风格的软件项目

这里可以配置两个构建参数

1.回滚哪一个项目的哪一次构建

2.回滚哪一台服务器的构建(可以多台)

参数化配置可见下图

3.2 自动化回滚批处理

Setlocal enabledelayedexpansion
set "projectKey=ChioceBuild"
set "bakUrl=D:\HS.Shop.Bak\HS.Shop.My\" //备份文件的路径
set url="%ChioceBuild%" //参数
set "rollbackUrl=D:\"
set "projectName="
set "buildID="
set url=%url::=/%
set url=%url:///=/%
set url=%url://=/% for /f "tokens=1,2,3,4,5,6,7,8* delims=/" %%a in (%url%) do (
set "projectName=%%g"
set "buildID=%%h"
)
set projectName=!projectName:%projectKey%=!
set "fileName=" for %%a in (%bakUrl%%projectName%-%buildID%.bak.rar) do (
set "fileName=%%a"
)
c:\"Program Files"\winrar\rar.exe x -ep2 -o+- %fileName% %rollbackUrl%

点击保存即可完成自动化回滚任务的建立,点击构建选择参数即可进行回滚。

六、结束语

    Jenkins是一个持续集成工具,其功能非常强大,可以帮助我们做自动构建、自动测试、自动发布等等,它根据不同的需求实现各种各样的功能,它可以最大幅度的减少我们日常工作中重复性的工作。以上仅仅是我根据当下所需研究的一种使用策略,可能有漏洞,也可能存在问题,但如果不愿意尝试着去改进现有流程,去接受新的东西,那么我们永远不会进步。而我对其使用的了解也不过是九牛一毛,大家可以根据需求研究制定自己的使用策略。

    最后希望大家:即使搬砖,也要搬出艺术感!做一个有追求的搬砖者!

.NET持续集成与自动化部署之路第三篇——测试环境到生产环境的一键部署策略(Windows)的更多相关文章

  1. .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统

    .NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言     相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...

  2. .NET持续集成与自动化部署之路第二篇——使用NuGet.Server搭建公司内部的Nuget(包)管理器

    使用NuGet.Server搭建公司内部的Nuget(包)管理器 前言     Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基 ...

  3. NET持续集成与自动化部署

    https://www.cnblogs.com/hunternet/p/9590287.html 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们 ...

  4. .NET 半天搭建Jenkins持续集成与自动化部署系统

    前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由 ...

  5. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境

    写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...

  6. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署

    前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...

  7. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(一):Jenkins安装

    2019/1/31更新,经过我一段时间的使用 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用d ...

  8. Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚

    写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...

  9. 【转载】soapui基于持续集成工具自动化运行的调研姿势

    soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...

随机推荐

  1. python同步原语--线程锁

    多线程锁是python多种同步原语中的其中一种.首先解析一下什么是同步原语,python因为GIL(全局解析锁)的缘故,并没有真正的多线性.另外python的多线程存在一个问题,在多线程编程时,会出现 ...

  2. Node 编码规范(优秀是一种习惯)

    编码规范 空格与格式 1. 缩进 采用2个空格缩进,而不是tab缩进. 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来更紧凑.明快. 2. 变量声明 永远用var ...

  3. scrapy系列(二)——startproject、genspider创建项目与模板使用

    阅读本文之前需要安装scrapy,如果你还没有安装该框架,那么可以看之前一篇文章scrapy1.2windows安装. 现在默认大家都已经成功的安装了scrapy可以开始大展身手了.本文主要讲的是新建 ...

  4. 《R数据挖掘入门》彩色插图(第9章)

    图9.5  图9.9

  5. Fiddler抓包学习——https请求的抓取

    第一步:设置Fiddler  windows下安装证书 打开fiddler 查看证书是否安装 说明已安装成功 设置端口号(下面手机设置代理所需要的) 第二部  手机端安装证书 通过fiddler查看电 ...

  6. 洗礼灵魂,修炼python(60)--爬虫篇—httplib2模块

    这里先要补充一下,Python3自带两个用于和HTTP web 服务交互的标准库(内置模块): http.client 是HTTP协议的底层库 urllib.request 建立在http.clien ...

  7. 【HANA系列】SAP HANA XS的JavaScript API详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS的Java ...

  8. CentOS7安装搭建.Net Core 2.0环境-详细步骤

    一.构建.Net core 2的应用程web发布 因为是用来测试centos上的core 环境,先直接用vs17自带的core实例. 二.部署CentOS7的core环境 1.连接并启动之前安装的虚拟 ...

  9. javascript中获取元素尺寸

    Javascript获取获取屏幕.浏览器窗口 ,浏览器,网页高度.宽度的大小 屏幕可用工作区宽度:window.screen.availHeight,和浏览器无关,屏幕相关屏幕可用工作区高度:wind ...

  10. lamp/lnmp下添加PHP扩展

    在linux下安装好基本的PHP运行环境后有时候添加了新的功能,就得增加新的扩展,比如之前没有安装redis扩展,可以手动编译安装相关的扩展可以找下下载的php源码包中,ext目录下是否有相关的扩展源 ...