.NET持续集成与自动化部署之路第三篇——测试环境到生产环境的一键部署策略(Windows)
Jenkins测试环境到生产环境的一键部署策略(Windows)
一、前言
前面我们已经初步实现了开发集成环境、测试环境的持续集成(自动化构建、自动化测试、自动化部署)。但生产环境自动化部署迟迟没有推进。其原因主要在以下几个方面:
- 尚未实现部署之前的自动化备份
- 尚未实现部署出现问题后的自动化回滚
- 由于之前采用FTP上传部署需要生产环境开放FTP端口存在安全性问题且FTP会因为各种的网速问题,导致站点瞬间挂掉
只要解决以上三个问题,我们就可以初步实现生产环境的自动化部署。
系列文章
二、实现思路
- 利用Jenkins分布式的特性,其中Jenkins服务器作为Master服务器,将生产环境(可以一台也可以多台服务器)作为Jenkins集群中的一台Slave服务器。
- 测试环境应该模拟和生产环境的配置和编译版本保持是Release状态,且功能已经满足预期发布需求。
- 通过文件复制插件,复制测试环境上的部署文件到生产环境上的jenkins工作空间。
- 通过批处理处理不需要覆盖的文件或者临时要修改的配置等。
- 利用rar备份生成环境上即将要覆盖的文件,注意命名上遵循一定规律:项目-文件夹-{BuildID}.bak.rar或日期-项目-文件夹-{BuildID}.bak.rar。
- 利用批处理进行从jenkins工作空间上把文件复制到站点上,常用命令:xcopy。
- 若生产环境程序出现问题,由项目经理和运维人员决定是紧急修复bug还是启用回滚,回滚则采用批处理命令将备份的文件压缩回生产环境站点下的目录内。
通过以上策略可以实现测试环境到生产环境的一键部署,实现了部署前的自动化备份,出现问题的自动化回滚,利用Jenkins Master-Slave特性解决了需要开放FTP端口的的问题,并且将先在测试站点测试好的文件,复制到正式站点上的一个缓冲区,进行预热配置,之后在本机进行文件替换,速度是相当的快,解决了FTP上传过程中网络问题导致站点挂掉的问题。
缺陷与问题:
- 生产环境需作为Jenkins 集群中的一台服务器并承担一部分构建任务,但通过配置此问题可忽略不计
- 生产环境需安装JDK并开启一个Java服务
- 待发现
三、生产环境拓扑图

四、所需Jenkins插件
- Copy data to workspace plugin 插件
- Copy Artifact Plugin
- Node and Label parameter plugin 插件
五、实现步骤
- 搭建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连接机制与原理不多做介绍,网上关于这方面的介绍也很多,大家可以自行搜索。
- 创建生产环境自动化部署任务
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
到了这一步就完成了生产环境的自动化部署的任务配置。点击构建即可完成测试环境到生产环境的一键部署。此时若程序出现问题可以采用紧急修复或者自动化回滚。
- 创建生产环境自动化回滚任务
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)的更多相关文章
- .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统
.NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...
- .NET持续集成与自动化部署之路第二篇——使用NuGet.Server搭建公司内部的Nuget(包)管理器
使用NuGet.Server搭建公司内部的Nuget(包)管理器 前言 Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基 ...
- NET持续集成与自动化部署
https://www.cnblogs.com/hunternet/p/9590287.html 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们 ...
- .NET 半天搭建Jenkins持续集成与自动化部署系统
前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛.由于我们所做的系统业务复杂,系统庞大,设计到多个系统之间的合作,而核心系统更是采用分布式系统架构,由 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境
写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署
前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(一):Jenkins安装
2019/1/31更新,经过我一段时间的使用 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用d ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(四):发布与回滚
写在前面 我们以前windows跑.net Framework程序的时候,发布,自己乖乖的替换程序:备份,也是自己一个一个的重命名备份:回滚,发布遇到问题的回滚更是不用说了:运维很是怕我们 这些用wi ...
- 【转载】soapui基于持续集成工具自动化运行的调研姿势
soapui中的testrunner.bat调研姿势,用于自动化测试副标题:soapui基于持续集成工具自动化运行的调研姿势 各位亲爱的同仁们,大家好吗?最近项目在搞持续集成工具,我们的测试用例都是基 ...
随机推荐
- Centos7安装搭建Bugzilla 5.0
1.安装准备: Centos7保证网络连通,如果网络不能连通,可通过配置yum源使用代理服务. vim /etc/yum.conf # The proxy server - proxy server: ...
- 洗礼灵魂,修炼python(17)--跨平台操作三剑客—os,os.path.sys模块
os 1.作用: 因为客户基本都是使用不同的操作系统,在不同的系统下,要完成一个项目,那必须跨平台操作,而python本来就是一个跨平台的语言,而有了os模块,则不需要在意什么系统.并且os模块是用于 ...
- Nginx 错误日志配置
1.Nginx错误日志信息介绍: error_log的语法格式及参数说明: error_log file level; 关键字 日志文件 错误日志级别 其中,关键字 ...
- windows 实用技巧
以下内容版权归原作者所有!!!如果侵权,立即删除. 1.系统激活:https://mp.weixin.qq.com/s/Kl_iEeSSxSprblfSRZ6yEQ 2.百度云下载:https://w ...
- Calling Matlab function from python: “initializer must be a rectangular nested sequence”
I am writing a python script from which I hope to call the Matlab anovan function. I have attempted ...
- 关掉 ubuntu bug 报告功能
想关掉这个: 通过服务加配置文件关掉
- Linux记录屏幕输出log
应用场景: 请专家通过Console处理问题时,保留console输出无疑是非常有意义的.一来可留着作为维护日志,二来可供事后学习. 最简洁的方式是通过系统自带的script命令去记录. $ scri ...
- js获取子节点和修改input的文本框内容
js获取子节点和修改input的文本框内容 js获取子节点: $("#"+defaultPVItemId).children().eq(3); //获取某个选择器下的第四个子节点 ...
- pip安装django的时候提示没有这个命令
问题描述: 在安装pyenv安装完python的时候,用pip安装django提示没有这个命令 [root@zabbix ~]# pip install django== 2.0 pyenv: pip ...
- Apache的配置详解 带图
对Apache 的 Http.conf 各项配置详解 1.01 ServerRoot 配置 [ServerRoot "" 主要用于指定 Apache 的安装路径,此选项参数值在安装 ...