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. 用PRODUCT_COPY_FILES拷贝文件夹

    拷贝文件PRODUCT_COPY_FILES += device/qcom/msm8909/media/media_profiles_8909.xml:system/etc/media_profile ...

  2. 12、多线程:Threading、守护线程

    线程与进程: 线程对于进程来说,就好似工厂里的工人,分配资源是分配到工厂,工人再去处理. 线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属 ...

  3. Oracle EBS FA 资产取值

    SELECT fb.book_type_code, fth.ASSET_NUMBER, fdh.units_assigned, fdh.assigned_to, pf.FULL_NAME, fl.se ...

  4. linux服务器系统盘坏且系统盘为软raid的修复方法

    1 需要换新盘的情况 1.1 一块盘grub损坏修复 一块盘grub损坏修复(可通过另一块盘进入系统的情况).更换硬盘的方式,可以热插拔,也可以服务器断电后更换,但如果是热插拔,可能会导致盘符变更.坏 ...

  5. BootStrap DateTimePicker的使用

    使用方法 1. 添加资源 2. 编写代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...

  6. 解决pycharm下代码报错的问题

    file-----settings------project:Pythonstudy------project structure-----选择要导入的文件并点击OK

  7. Python实现Excel转换工具小结

    经历过的打表工具从c++.C#,再到Python,算下来还是Python方便些.一天即可上手开发,非常适合快速迭代中的各种小工具开发. Python开源的第三方库很多,涉及excel方面的也有好几个x ...

  8. jQuery EasyUI combobox多选及赋值

      1.多选属性multiple multiple:true多选 multiple:false单选 <input class="easyui-combobox" id=&qu ...

  9. 修改CentOS 7.2系统的主机名

    之前使用网上的大部分说法,修改了两个配置文件: /etc/hosts /etc/sysconfig/network 然后,并没有什么卵用. 后来,搜阿里云配置,看到这个办法: 使用“经典网络”类型的E ...

  10. OCP 12c题库出现大量新题,062新题-第21题

    choose three Which three statements are true about Oracle checkpoint processing? A) Incremental chec ...