Jenkins任务:创建运行回滚war包任务-war_rollback

综述:本文将介绍如何在Jenkins上创建和运行上一次备份war包的任务,主要包括:“新建Jenkins任务”、“选择构建一个Freesyle项目,输入任务名”、“配置任务”、“运行Jenkins任务”、“查看运行日志”。

 

1、新建Jenkins任务

2、选择构建一个Freesyle 项目,输入任务名

3、配置任务

(1)源码管理

选择Subversion,Repository URL填写$CURRENT_ReleaseUrlSVNNbr

Check-out Strategy填写Use 'svn update' as much as posible,with 'svn revert' before update

(2)构建触发器

不用填

(3)构建环境

不用填

(4)构建

选择Execute Windows batch command

批处理命令填写

call D:\BXERP\trunk\src\jenkins\war_rollback\war_rollback_preBuildSteps.py

exit 0

调用war_rollback_preBuildSteps.py,主要完成的逻辑:关闭tomcat,删除tomcat下旧的nbr项目war包、nbr和Root文件夹,获取release时备份好的war包并放到tomcat下,获取备份好的sql文件并执行sql语句,重启tomcat,验证是否回滚war成功

代码如下:

war_rollback_preBuildSteps.py

# coding=utf-8




import os

import shutil

import time

import urllib.request

import subprocess

from bs4 import BeautifulSoup

# 引用自定义的模块

import sys

sys.path.append('D:/BXERP/trunk/src/jenkins/Common')       #引用的自定义模块不与该python文件在同一目录时,需要指定路径

from bxUtility import printInfo

from bxUtility import closeTomcat

from bxUtility import startTomcat




# 需要从jenkins的环境变量读取的参数:release版本号、nbr版本号、nbr登录页网址、当前使用的TableCreate源代码文件夹目录(v1.0 or v1.1)

CURRENT_ReleaseNO = os.getenv("CURRENT_ReleaseNO")  #示例:CURRENT_ReleaseNO=00004_v1_0_r691_r691

CURRENT_ReleaseNbrVersionNO = os.getenv("CURRENT_ReleaseNbrVersionNO")

CURRENT_ReleaseNbrHomeUrl = os.getenv("CURRENT_ReleaseNbrHomeUrl")

CURRENT_SrcDirOfTableCreate = os.getenv("CURRENT_SrcDirOfTableCreate")

# 放置备份的sql文件的路径

FILE_SqlBackupPath = 'D:/Release/' + CURRENT_ReleaseNO + '/backup'

# Mysql bin directory

PATH_Mysql_bin_dir = 'C:/wamp/bin/mysql/mysql5.6.17/bin'

# 相关的操作文件和路径

FILE_WarPath = 'D:/Tomcat/webapps/nbr.war'

FILE_NbrPath = 'D:/Tomcat/webapps/nbr'

FILE_RootPath = 'D:/Tomcat/webapps/ROOT'




try:

         # 关闭tomcat

         closeTomcat(60)  #参数为等待的时间(s),每10秒会检查一次,直到超过等待的时间




         # 删除旧的nbr.war

         print ('正在删除Tomcat下旧的nbr.war...');

         if os.path.exists(FILE_WarPath):

                   os.remove(FILE_WarPath)

                   printInfo('删除Tomcat下旧的nbr.war完毕。', 0)

         else:

                   printInfo('找不到旧war包:' + FILE_WarPath + '。', 0)




         # 删除旧的nbr文件夹

         print ('正在删除Tomcat下旧的nbr文件夹...');

         if os.path.exists(FILE_NbrPath):

                   shutil.rmtree(FILE_NbrPath)

                   printInfo('删除Tomcat下旧的nbr文件夹完毕。', 0)

         else:

                   printInfo('找不到旧nbr文件夹:' + FILE_NbrPath + '。', 0)

        

         # 删除旧ROOT文件夹

         print ('正在删除旧ROOT文件夹...');

         if os.path.exists(FILE_RootPath):

                   shutil.rmtree(FILE_RootPath)

                   printInfo('删除Tomcat下旧的ROOT文件夹成功。', 0)

         else:

                   printInfo('找不到旧ROOT文件夹:' + FILE_RootPath + '。', 0)




         # rollback war包

         print ('Rolling back nbr.war ....');

         # 先找到上次release文件夹的关键字,这里有个问题,当release次数大于等于100000时,该代码需修改

         keyword = int(CURRENT_ReleaseNO[0:5])

         if keyword < 10:

                   keyword = '0000' + str(keyword-1)

         elif keyword < 100:

                   keyword = '000' + str(keyword-1)

         elif keyword < 1000:

                   keyword = '00' + str(keyword-1)

         elif keyword < 10000:

                   keyword = '0' + str(keyword-1)

         else:

                   keyword = str(keyword-1)

         #获取上次release文件夹命名

         lastTimeReleaseFolder = []

         for i in range(len(os.listdir('D:/Release'))):

                   if keyword in os.listdir('D:/Release')[i]:

                            lastTimeReleaseFolder.append(os.listdir('D:/Release')[i])

                   else:

                            continue     #未找到含有关键字的文件或文件夹

         #获取上次release文件夹中以.war结尾的文件

         if len(lastTimeReleaseFolder) == 1:

                   lastTimeWarFiles = os.listdir('D:/Release/' + lastTimeReleaseFolder[0] + '/backup')

                   for i in range(len(lastTimeWarFiles)):

                            if os.path.splitext(lastTimeWarFiles[i])[1] == '.war':

                                     shutil.copy('D:/Release/' + lastTimeReleaseFolder[0] + '/backup' + '/' + os.path.splitext(lastTimeWarFiles[i])[0] + os.path.splitext(lastTimeWarFiles[i])[1], 'D:/tomcat/webapps/nbr.war')

                                     printInfo('Rollback WAR done.', 0)

         else:

                   printInfo('含有关键字的文件夹不唯一。', 2)




         # rollback DB

         print ('Rolling back DB Data...');

         sqlFiles = os.listdir(FILE_SqlBackupPath)

         # 暂不需要先判断有多少个sql文件,正常情况下是不存在多个sql的情况

         for i in range(len(sqlFiles)):

                   if os.path.splitext(sqlFiles[i])[1] == '.sql':

                            rollbackScript = FILE_SqlBackupPath + '/' + os.path.splitext(sqlFiles[i])[0] + os.path.splitext(sqlFiles[i])[1]

                            print ('Rolling back ' + rollbackScript + '...');

                            (errCode, errMsg) = subprocess.getstatusoutput(PATH_Mysql_bin_dir + '/mysql --login-path=root <' + rollbackScript)

                            print ('Rollback DB的错误码=' + str(errCode))

                            print ('Rollback DB的错误信息=' + str(errMsg))

                            if (errCode == 0):

                                     printInfo('Rollback DB成功!', 0)

                            else:

                                     printInfo('Rollback DB失败!' + errMsg, errCode)




         # 重启tomcat

         startTomcat(300, CURRENT_ReleaseNbrHomeUrl, CURRENT_SrcDirOfTableCreate)




         # 获取页面版本号进行验证

         print ('正在打开nbr网址' + CURRENT_ReleaseNbrHomeUrl + ',获取版本号进行验证...');

         html = urllib.request.urlopen(CURRENT_ReleaseNbrHomeUrl)

         response = html.read()

         response = BeautifulSoup(response,'html.parser')

         nbrVersionNO = response.find('input', id='CURRENT_ReleaseNbrVersionNO')["value"]

         print ('当前web前端的版本号=' + nbrVersionNO);

         if nbrVersionNO == CURRENT_ReleaseNbrVersionNO:

                   printInfo('网页的版本号与jenkins设置的版本号一致。', 0)

         else:

                   printInfo('网页的版本号与Jenkins设置的版本号不一致。', 3)

except Exception as e:

         printInfo('出现异常:' + str(e), 1)

else:

         printInfo('Rollback成功!', 0)

         os._exit(0)

(5)保存,在主页面可以查看刚创建好的任务

4、运行Jenkins任务

点击Build Now按钮,即可开始运行任务

5、查看运行日志

在左下角可以查看运行中的任务,点击“控制台输出”查看日志

posted @ 2022-08-29 19:45  Boxin-kim  阅读(104)  评论(0)    收藏  举报
Web Analytics
Guang Zhou Boxin