软件需要发布一个新版本时,需要比较多的操作。其中很多操作,我们是可以使用脚本语句代替人手去完成的,这样可以减少人工操作出错的风险,也能提高效率,我们只需要准备好必要的文件就好了。本文将介绍如何使用Jenkins和python脚本帮助我们发布软件新版本,包括:”准备发布新版文的文件RPK(release package)“、”服务器端新版本的发布“、”安卓客户端发布新版本“、”回滚war包和数据库“。
1、准备发布新版文的文件RPK(release package)。
(1)准备发布新版本的sql语句。
准备好新版本需要更新的sql语句,如修改数据库表、插入新数据、修改过的存储过程等。
如果是使用svn版本控制工具,可以找出发布版本号范围的所有涉及的数据库改动,
对于修改过的数据库表,直接对比两个文件:发布范围内最大版本和最小版本的上一个版本文件,就可以知道做了那些修改,从而写出sql更新语句。
对于修改过的存储过程,准备删除存储过程和创建存储过程sql语句。
调用其它文件的sql命令:
USE nbr;
source D:/BXERP/trunk/release/00015_v2_0_r2193_r2312/SQL/1_所有私有DB_DeleteFutureRetailTradeAggregation.sql;
source D:/BXERP/trunk/release/00015_v2_0_r2193_r2312/SQL/2_所有私有DB_T_ConfigCacheSize_Reset.sql;
source D:/BXERP/trunk/release/00015_v2_0_r2193_r2312/SQL/5_所有私有DB_CreateTables.sql;
DROP PROCEDURE IF EXISTS `SP_RetailTradePromotingSyncCacheDispatcher_RetriveN`;
DROP PROCEDURE IF EXISTS `SP_RetailTradePromotingSyncCacheDispatcher_UpdatePOSStatus`;
DROP PROCEDURE IF EXISTS `SP_RetailTradePromotingSyncCache_DeleteAll`;
DROP PROCEDURE IF EXISTS `SP_RetailTradePromotingSyncCache_POSUpload`;
DROP PROCEDURE IF EXISTS `SP_RetailTradePromotingSyncCache_RetrieveN`;
DROP PROCEDURE IF EXISTS `SP_VipCategorySyncCacheDispatcher_RetriveN`;
DROP PROCEDURE IF EXISTS `SP_VipCategorySyncCacheDispatcher_UpdatePOSStatus`;
DROP PROCEDURE IF EXISTS `SP_VipCategorySyncCache_Delete`;
DROP PROCEDURE IF EXISTS `SP_VipCategorySyncCache_DeleteAll`;
DROP PROCEDURE IF EXISTS `SP_VipCategorySyncCache_POSUpload`;
DROP PROCEDURE IF EXISTS `SP_VipCategorySyncCache_RetrieveN`;
DELIMITER $$
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PrivateDB/SP_Vip_UpdateBonus.sql
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PrivateDB/SP_VIP_Create.sql
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PrivateDB/SP_VIP_Update.sql
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PrivateDB/SP_SmallSheetFrame_Delete.sql
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/Function/Func_CheckPosDependency.sql
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PrivateDB/SP_VIPCategory_Delete.sql
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PrivateDB/SP_VipCardCode_Create.sql
DELIMITER ;
USE nbr_bx;
source D:/BXERP/trunk/release/00015_v2_0_r2193_r2312/SQL/3_公有DB_T_Bxconfiggeneral.sql
DELIMITER $$
source D:/BXERP/tags/nbr_20200515_v2.0.4/src/sql/SP/PublicDB/SP_Company_MatchVip.sql
DELIMITER ;
具体文件的sql命令如:1_所有私有DB_DeleteFutureRetailTradeAggregation.sql
DELETE FROM t_retailtradeaggregation WHERE F_WorkTimeStart > date_sub(now(),interval 1 day);
……
(2)编写release步骤、注意事项。
一般根据上一次发布经验编写,检查运行环境、修改Jenkins变量等信息。
(3)准备替换配置文件的批处理文件。
如:更新最近的PublicAccount.properties配置文件:
copy /y D:/BXERP/trunk/release/00015_v2_0_r2193_r2312/NbrConfigFile/PublicAccount.properties D:/NbrConfigFile/PublicAccount.properties
2、服务器端新版本的发布。
使用Jenkins工具创建发布war的任务,调用python脚本。
如果是第一次在Jenkins发布新版本,需要新建任务,如服务器端新版本的发布任务war_release,配置调用的python脚本语句。
war_release_preBuildSteps.py脚本做一些发布war前的工作:
查看代码# coding=utf-8
"""
case1: release成功
case2: release失败>重新release(特别注意:如果release失败需要rollback时,sql使用此次备份成功的sql文件,war包拿上一次release成功的war包进行rollback)
case3: 之前有无成功release(目前保证每次release的文件夹都是成功的,故可略过该case)
case4: 之前有无release过(暂不考虑该case)
"""
import time
import os
import subprocess
# 引用自定义的模块
import sys
sys.path.append('D:/BXERP/trunk/src/jenkins/Common') #引用的自定义模块不与该python文件在同一目录时,需要指定路径
from bxUtility import printInfo
from bxUtility import closeTomcat
from bxUtility import replaceLine
# 需要从jenkins的环境变量读取的参数:文件夹路径、现使用场、版本号
CURRENT_ReleaseNO = os.getenv("CURRENT_ReleaseNO") #示例:CURRENT_ReleaseNO=00004_v1_0_r691_r691
CURRENT_Env = os.getenv("CURRENT_Env")
CURRENT_ReleaseNbrVersionNO = os.getenv("CURRENT_ReleaseNbrVersionNO")
# 此次release放置输出文件的总路径
CURRENT_ReleasePath = 'D:/Release/' + CURRENT_ReleaseNO
# DB备份的文件夹路径
CURRENT_DbBackupPath = CURRENT_ReleasePath + '/backup'
# DB的备份
CURRENT_Time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
DB_BackupFile = CURRENT_DbBackupPath + '/' + CURRENT_Time + '.sql'
# 要执行的BAT文件
PATH_BatToRelease = 'D:/BXERP/trunk/release/' + CURRENT_ReleaseNO + '/BAT/pre_steps.bat'
# 要Release的SQL文件
PATH_SqlToRelease = 'D:/BXERP/trunk/release/' + CURRENT_ReleaseNO + '/' + CURRENT_Env + '/release'
FILE_SqlToRelease = PATH_SqlToRelease + '/release.sql'
# 找不到release.sql时的特殊提示
errTag = '~~~~~~XXXXXXXX~~~~~~~~~~~~~XXXX~~~~~~~~~~XXXX~~~~~~~~~';
# 要修改的login.jsp的路径
FILE_LoginJsp = "D:/Jenkins/workspace/war_release/src/main/webapp/WEB-INF/admin/login.jsp"
# 要修改的QueenService的helper.properties的路径
FILE_HelperProperties = "D:/QueenService/Bin/helper.properties"
def dbBackup():
"""
备份db(sql)
"""
os.system('cd D:/wamp/bin/mysql/mysql5.6.17/bin')
(errCode, errMsg) = subprocess.getstatusoutput('mysqldump --no-defaults --login-path=root --default-character-set=gb2312 -R --hex-blob -A>' + DB_BackupFile)
print ('备份DB的错误码=' + str(errCode)