一、目的
由于项目发布点多,更新迭代耗时,想搞一个自动发布的任务,以前也没有用python写过,这个任务当做练手了。
二、步骤
1、安装python,pip。我安装的是python3.6,只要在安装过程中选择安装pip即可。
2、首先考虑的是弄一个定时钟跑,check_update检测更新,有更新则停止服务,备份war包,跑sql脚本,备份sql脚本。关键代码如下:
def process_update():
try:
result = check_update()
print("check result: %s" %result)
if( result== 1):
now = datetime.datetime.now()
year_month_day_hour_minute = str(now.year)+str(now.month)+str(now.day)+str(now.hour)+str(now.minute)
service.stop_service(service_name)
#备份war
mymovefile(ftp.dest_dir+os.sep+ftp.dest_war_name, ftp.bak_dir+os.sep+year_month_day_hour_minute
+ os.sep+ftp.dest_war_name)
mymovefile(os.getcwd()+os.sep+ftp.file_name[0], ftp.dest_dir+os.sep+ftp.dest_war_name)
#移动script
script_files = []
path = os.listdir(os.getcwd())
for p in path:
if os.path.isfile(p) and p.find('.sql') != -1:
script_files.append(p)
mymovefile(os.getcwd()+os.sep+p, ftp.script_dest_dir+os.sep+p)
#移动script
#
while service.status_service(service_name) != service.STOPPED:
time.sleep(3)
print("服务关闭中....")
#执行script
sorted(script_files, key=lambda str: str[0:str.find('_')])
for script_file in script_files:
db.executeScript(ftp.script_dest_dir+os.sep+script_file)
#执行script
#备份scrpit
mymovefile(ftp.script_dest_dir+os.sep+script_file, ftp.script_bak_dir+os.sep +
year_month_day_hour_minute+os.sep+script_file)
#备份scrpit
service.start_service(service_name)
while service.status_service(service_name) != service.RUNNING:
time.sleep(3)
print("服务启动中....")
else:
print("服务无更新!")
except Exception as e:
print ('str(Exception):\t', str(Exception))
print ('str(e):\t\t', str(e))
print ('repr(e):\t', repr(e))
print ('e.message:\t', e.message)
finally:
timer = threading.Timer(3.0, process_update)
timer.start()
if __name__ == '__main__':
print("任务开始")
scheduler = BackgroundScheduler()
try:
timer = threading.Timer(3.0, process_update)
timer.start()
while True:
time.sleep(3)
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()
print('Exit The Job!')
3、下面就是实现check_update方法了,主要是到指定的ftp服务器中获取文件,与目的地文件进行比较,如果时间比本地文件新,则更新升级,关键代码如下:
def check_update():
now = datetime.datetime.now()
year_month_day_hour_minute = str(now.year)+str(now.month)+str(now.day)+str(now.hour)+str(now.minute)
ftp = connect() #连接登陆ftp
try:ftp.cwd(ftp_war_dir)
except ftplib.error_perm:
print('进入目录"%s" 失败' %ftp_war_dir)
# print('当前目录"%s"' %ftp.pwd())
del file_list[:]
del filter_file_list[:]
del file_name[:]
ftp.retrlines('LIST',set_file_property)
filter_file(file_list)
if(filter_file_list.__len__() > 0):
filename=filter_file_list[0]
print("开始下载war包....")
download(ftp,filename) #下载war文件
print("下载完毕")
# war备份文件
print("开始删除ftp上war包....")
ftp.delete(filename) #为了测试暂时不备份
print("删除完成")
try:
ftp.cwd(ftp_war_bak_dir+linux_sep+year_month_day_hour_minute)
except:
ftp.mkd(ftp_war_bak_dir+linux_sep+year_month_day_hour_minute)
ftp.cwd(ftp_war_bak_dir+linux_sep+year_month_day_hour_minute)
print("开始备份war包....")
upload(ftp,os.getcwd()+os.sep+filename)
print("备份完毕")
# war备份文件
try:ftp.cwd(ftp_script_dir)
except ftplib.error_perm:
print('进入目录"%s" 失败' %ftp_script_dir)
del script_list[:]
ftp.retrlines('LIST',get_script_file)
for script in script_list:
download(ftp,script) #下载sql文件
#检查ftp目录下是否已没有war,如果没有,则移动script
del file_list[:]
try:ftp.cwd(ftp_war_dir)
except ftplib.error_perm:
print('进入目录"%s" 失败' %ftp_war_dir)
ftp.retrlines('LIST',set_file_property)
if file_list.__len__() == 0:
try:ftp.cwd(ftp_script_dir)
except ftplib.error_perm:
print('进入目录"%s" 失败' %ftp_script_dir)
#备份ftp script
for script in script_list:
ftp.delete(script)
try:
ftp.cwd(ftp_script_bak_dir+linux_sep+year_month_day_hour_minute)
except:
ftp.mkd(ftp_script_bak_dir+linux_sep+year_month_day_hour_minute)
ftp.cwd(ftp_script_bak_dir+linux_sep+year_month_day_hour_minute)
for script in script_list:
upload(ftp,os.getcwd()+os.sep+script)
#检查ftp目录下是否已没有war,如果没有,则移动script
file_name.append(filename)
return 1
else:
return 0
4、最后还有两个功能需要实现,一个是sql脚本执行,service操作。代码如下:
import pymysql
db_host='127.0.0.1'
db_username='root'
db_password='root1234'
ok_db_name='defect'
def executeScript(file):
try:
conn = pymysql.connect(
host = db_host,
user = db_username,
passwd = db_password,
#db = "dome"
)
cur = conn.cursor() #获取mysql中所有数据库
cur.execute('SHOW DATABASES')
db_names = cur.fetchall()
for db_name in db_names:
if db_name[0].count(ok_db_name) != 0:
use_db_name = db_name[0]
break
except:
return
conn.close()
db = pymysql.connect(db_host, db_username, db_password, use_db_name, charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
sql = '' #拼接的sql语句
f=open(file, "r")
for each_line in f.readlines():
each_line=each_line.replace("\n","")
# 过滤数据
if not each_line or each_line == "\n":
continue
# 如果没有遇到结束符则继续
elif each_line.find(";") == -1:
sql += each_line
# 否则就执行,执行后,清空sql
else:
sql += each_line
cursor.execute(sql)
sql=''
db.commit()
db.close()
def executeQuery (sql):
try:
conn = pymysql.connect(
host = db_host,
user = db_username,
passwd = db_password,
#db = "dome"
)
cur = conn.cursor() #获取mysql中所有数据库
cur.execute('SHOW DATABASES')
db_names = cur.fetchall()
for db_name in db_names:
if db_name[0].count(ok_db_name) != 0:
use_db_name = db_name[0]
break
except:
return
conn.close()
# 打开数据库连接
db = pymysql.connect(db_host, db_username, db_password, use_db_name, charset='utf8')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL语句
cursor.execute(sql)
# 使用 fetchone() 方法获取一条数据
data = cursor.fetchall()
# 关闭数据库连接
db.close()
return data