2持续部署系统
2.1分析
Web源码发布费时费力,需要先下载源码,进行编译,发布到本地,再将所有文件复制到服务器,但很多文件是不需要更新的。可以对流程进行优化。运行vs,获取最新源码,进行文件编译,发布到本地,按生成时间进行筛选,最终效果是获取指定SVN版本号间的改动文件,例如不同的发布环境下面的代码是根据不同的svn版本进行发布的,可以先查出来某一服务器上发布的svn版本,对旧的的svn版本和最新的svn版本做对比,筛选出有更新的文件,但操作难度太大参考:从SVN导出指定版本号之间修改的文件。可以退而求其次筛选出1个月内的最新文件,再分发给服务器进行更新,能大大减少更新文件的数量。
原理:进行更新文件的筛选,找出最新文件,压缩并上传到服务器。
优化后的流程:开发人员本地提交源码-自动化服务器定期获取源码并编译-筛查出更新包-同步到其他服务器上进行文件替换。
2.2准备工作
下面将使用发布平台,实现自动发布web端代码。
目前发现C:WindowsTemp目录,jenkins会在这里新建一个bat文件,360安全卫士一直会阻止而导致无法生成升级包。先关闭安全卫士。
检查需要发布的项目是基于.NET4.0还是4.6发布的,本教程适合4.0,目前4.6暂未进行测试。
2.2.1安装Jenkins工具
(1)下载Jenkins的windows安装包,进行安装。
(2)最好下载net4.7
(3)下载 Microsoft Build Tools 2013
地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=40760,下载文件为BuildTools_Full.exe
(4)安装7z压缩软件到C:Program Files7-Zip目录。
Jenkins安装完以后设置用户名和密码,进行初始化。
打开http://localhost:8080
默认管理员是admin,默认密码是那个目录里的文件
先复制密码,粘贴以后继续
安装推荐的插件,全程需要联外网
创建用户
若无法登录,则需要重启服务
用管理员身份启动cmd
进入jenkins安装根目录
cd C:\"Program Files (x86)"\Jenkins
关闭命令:
net stop jenkins
启动命令:
net start jenkins
可以把这个命令写成bat文件,每次开机以后执行一次。
项目目录C:Program Files (x86)Jenkinsworkspace
可以手动把svn的源码拷贝到 C:Program Files (x86)Jenkinsworkspace任务名称 下面
比如任务名称为lyweb那就把所有源码拷贝到C:Program Files (x86)Jenkinsworkspacelyweb文件夹下面
这样就不会再下载一次了,第一次下载都很漫长。
而且使用自动下载的源码构建以后所有的文件都是最新的日期,可以先构建成功一次,再删除C:Program Files (x86)Jenkinsworkspacelyweb文件夹下面的文件,把开发人员本地的文件夹复制进去,再构建一次。
2.2.2创建临时目录
D:uploadly项目发布程序 为编译以后的文件
D:uploadupload2 筛选出一个月内有更新的文件
D:uploadsync 这个里面是需要分发出去的upload.zip的包,此包是一个月内累计更新的文件,复制到服务器上替换就行了。
2.3插件安装
在面板配置里选择系统管理-插件管理 在可选插件里搜索MSBuild插件,并安装
安装完以后设置。
2.3.1配置MSBuild的版本
【系统管理】->【全局工具配置】->【MSBuild】,点击【新增MSBuild】进行版本的添加,如下:
其中name输入Version4
路径输入C:WindowsMicrosoft.NETFramework64v4.0.30319MSBuild.exe
注意:如果是4.6的项目,参考:http://www.cnblogs.com/EasonJim/p/6038363.html
2.3.2svn插件
还要在jenkins的配置里改svn的版本号,默认是1.4,我当前使用的是1.8
进入【系统管理】->【系统设置】把svn版本改一下。
2.4部署更新任务
2.4.1general设置
在http://localhost:8080中新建任务
选择【构建一个自由风格的软件项目】,其余的不要去选择。
2.4.2源码设置
在这里需要先添加用户名和密码,保存后,再选择该用户名和密码。
2.4.3构建触发器
也可以选择钩子,但不能每次有人提交代码就更新,定时更新,进行小版本迭代会更好。
2.4.4构建环境
都不选
2.4.5构建
del /f /q /s D:\upload\sync\upload.zip
del /f /q /s D:\upload\upload2\*.*
RD /s /q D:\upload\upload2\
mkdir D:\upload\upload2
del /f /q /s D:\upload\ly项目发布程序\*.*
RD /s /q D:\upload\ly项目发布程序\
mkdir D:\upload\ly项目发布程序
(2)设置编译哪个项目
MSBuild Version 选择Version4
在 MSBuild Build File里选择./src/LRSMES.WebUI/LRSMES.WebUI.csproj
这里是项目名称,最好选择具体的哪个项目。
Command Line Arguments设置为 /t:Rebuild /p:Configuration=Release /p:TargetFrameworkVersion=v4.0 /p:OutputPath=D:uploadly项目发布程序;Configuration=Release
注意这个/t:Rebuild每条命令与下一条命令之间都有一个空格。
/t:Rebuild 表示每次都重建,不使用增量编译
/p:Configuration=Release 表示编译Release版本,
/p:TargetFrameworkVersion=v4.0表示编译的目标是.NET4.0
/p:OutputPath=D:uploadly项目发布程序;Configuration=Release 表示发布到d盘的某一目录下。
(3)再新建批处理筛选出最新的文件
以下是代码:
@echo off
set y=%date:~0,4%
set m=%date:~5,2%
set d=25
set /a m-=1
if %m%==0 set m=12&set /a y-=1
if "%m%"=="1" (set mm1=01)
if "%m%"=="2" (set mm1=02)
if "%m%"=="3" (set mm1=03)
if "%m%"=="4" (set mm1=04)
if "%m%"=="5" (set mm1=05)
if "%m%"=="6" (set mm1=06)
if "%m%"=="7" (set mm1=07)
if "%m%"=="8" (set mm1=08)
if "%m%"=="9" (set mm1=09)
if "%m%"=="10" (set mm1=10)
if "%m%"=="11" (set mm1=11)
if "%m%"=="12" (set mm1=12)
echo 格式化以后月份为,前面加了0,例如05之类 %mm1%
echo 上个月25日的日期是%y%-%mm1%=%d%
echo 格式化日期mm-dd-yyyy后为%mm1%-%d%-%y%
echo d | xcopy D:\upload\ly项目发布程序\_PublishedWebsites\LRSMES.WebUI\Areas D:\upload\upload2\Areas /s /r /y /d:%mm1%-%d%-%y%
echo d | xcopy D:\upload\ly项目发布程序\_PublishedWebsites\LRSMES.WebUI\bin D:\upload\upload2\bin /s /r /y /d:%mm1%-%d%-%y%
echo d | xcopy D:\upload\ly项目发布程序\_PublishedWebsites\LRSMES.WebUI\Scripts D:\upload\upload2\Scripts /s /r /y /d:%mm1%-%d%-%y%
echo d | xcopy D:\upload\upload2\Areas D:\lyWeb\Areas /s /e /r /y /d
echo d | xcopy D:\upload\upload2\bin D:\lyWeb\bin /s /e /r /y /d
echo d | xcopy D:\upload\upload2\Scripts D:\lyWeb\Scripts /s /e /r /y /d
在这里解释一下为什么要得到上个月的日期,如当前日期是2019年5月25日,上个月的日期是2019年4月25日,若不写一个自动获取日期,则 echo d | xcopy D:uploadly项目发布程序_PublishedWebsitesLRSMES.WebUIbin D:uploadupload2bin /s /r /y /d:%mm1%-%d%-%y%命令执行时,最后面的/d:就只能把时间写死,成为/d:05-25-2019 这样才能避免可能出现的日期问题。至于_PublishedWebsites目录,则是本地发布以后就是在这个目录里,暂时未找到设置方法。echo d 和echo f的问题,由于复制文件时,系统会询问复制的是一个目录还是文件,分别对应d和f。后来发现这样有一个问题,就是若构建失败,有可能清空已下载好的源码,系统会重新下载一遍,导致该筛选方法失效,但一个月以后就正常了。临时的补救措施是手动把以前下载好的再覆盖一次源码。
这样可以自动选择出一个月内的更新文件,若本机也是web服务器,顺便可以直接更新。
(4)最后新建一个批处理进行压缩
echo [INFO] 压缩要上传的文件
echo revision:%SVN_REVISION% > D:\upload\upload2\revision.txt
call C:\"Program Files"\7-Zip\7z.exe a D:\upload\sync\upload.zip D:\upload\upload2\
echo f | xcopy D:\upload\sync\upload.zip D:\lyWeb\Resources\upload.zip /s /e /r /y /d
需要7z压缩软件先安装好。C:"Program Files"目录加引号是因为批处理在识别带空格的目录时必须要这样。
创建一个revision.txt文件,自动写入svn版本号。先用7z压缩软件压缩出upload.zip文件,再复制到能共享的目录里,如web的站点。
压缩一个作为同步到服务器上的包,命名必须固定如upload.zip,把文件也复制一份到web网站,这样其他主机可以访问http://XXXX/Resources/upload.zip地址获得最新的升级包了。
(5)构建后通知
可以写一个邮件通知,若不成功则发邮件。
也可以自动发钉钉消息通知,下面是使用钉钉的尝试。
详见[钉钉通知系列]Jenkins发布后自动通知
正在测试jenkins发送自定义格式和报错信息到钉钉指定人
目标:获取当前任务的svn版本号和构建id
2.5手动执行构建
2.5.1自动生成升级包
然后可以在左下角查看控制台的进度,一般10分钟内只能执行一次构建。
2.6分发
2.6.1客户端软件设置
其他服务器若需要同步最新的文件,需要安装7z软件到C:Program Files7-Zip目录,并下载wget.exe文件到C:WindowsSystem32文件夹
下载wget的方法是 https://zhuanlan.zhihu.com/p/28826000
下载链接为https://eternallybored.org/misc/wget/
至于为什么不用windows自带的命令,主要是wget是linux系统下非常好用的一个命令,使用简单。
2.6.2编写一键更新脚本
在d盘新建uploadtemp文件夹,并创建一个名称为“自动更新web代码.bat”的批处理文件,改扩展名为bat。其中D:pzWeb改为服务器上的web页面位置。
下面是代码:
del /f /q /s D:\upload\upload.zip
RD /s /q D:\upload\temp\
mkdir D:\upload\temp\
wget.exe -O D:\upload\upload.zip http://XXXXXX/Resources/upload.zip
call C:\"Program Files"\7-Zip\7z.exe x D:\upload\upload.zip -oD:\upload\temp
echo d | xcopy D:\upload\temp\upload2\Areas D:\pzWeb\Areas /s /e /r /y /d
echo d | xcopy D:\upload\temp\upload2\bin D:\pzWeb\bin /s /e /r /y /d
echo d | xcopy D:\upload\temp\upload2\Scripts D:\pzWeb\Scripts /s /e /r /y /d
echo 执行完毕。此脚本将于60秒后自动关闭!
ping 127.0.0.1 -n 60 >nul
由于7z压缩时默认把上级文件夹名也带上了,导致解压缩后是在D:uploadtempupload2目录。
先清空临时目录下的所有文件,再下载最新的升级包到本地,然后解压缩,把解压以后的文件复制到web站点目录。这里加了一个/d参数,若服务器的文件比较旧,而且最新的升级包里有这个最新的文件,则进行更新,否则不会自动替换。若服务器上的文件被人为修改过,则需要看修改的是哪些文件,先备份出来,提交源码以后再执行一次同步。若服务器长时间未进行过同步,例如超过一个月,则无法自动同步一个月以上的文件,可以先手动完全同步一次,再使用自动同步的命令。
下载到本地以后,若有些目录不需要更新,如Areasmap目录,则把D:uploadtempupload2Areasmap目录删除,删除命令是RD /s /q D:uploadtempupload2Areasmap,这样就不会同步该目录。
但目前还未实现iis自动回收池和重启web服务的命令
鉴于有些web会因为某些原因人工关闭站点,先不搞iis了
这些服务器同步时需要360开白名单,或者手动运行一下bat文件,让360放行
运行无误后在服务器设置一个定时执行任务就行。
2.7定期自动执行
默认每天中午10点自动获取一次源码并编译,12点同步到其他的web服务器,全程不需要人员参与。
2.8手动执行
(1)若需要手动编译,则登录此站点,并点击构建。
(2)然后可以在左下角查看控制台的进度,一般10分钟内只能执行一次构建。
(3)最后手动去其他web服务器上执行自动更新web代码.bat
还不快抢沙发