本文共 5066 字,大约阅读时间需要 16 分钟。
此实现是建立在容器里面运行业务的情况下实现的
脚本内容如下:
#!/usr/bin/env python3# -*- coding: UTF-8 -*-# Time:2020-10# Author:Shensgimport sysimport osimport time# import readlineimport requests# Gets the current script directory as the working directory // 获取当前脚本目录作为工作目录dir = sys.path[0]os.chdir(dir)# help // 运行脚本的帮助def used_Usge(): help = "Example:\npython3 + %s + servername" % (sys.argv[0]) return help# obtain current version //获取当前版本def current_version(sname): os.system("docker ps -a | grep -i %s | awk '{print $2}' | awk -F[:] '{print $2}' > ./version.txt" % (sname)) f = open("./version.txt") vold = f.readline() return vold# obtain docker image new version //获取docker最新镜像版本def obtain_new_version(sname): try: if sname == 0: print("\033[1;31mInsert server name error\033[0m\033[5;32m!!!...\033[0m") else: r = requests.get("http://stry.snwit.com:5000/v2/%s/tags/list" % (sname)) i = r.json() v = i['tags'] v.sort(reverse=True) # print(v) l = v[0] # print(l) return l except EOFError: print("\033[1;31mAll version obtain fail, exit\033[0m\033[5;32m!!!...\033[0m") sys.exit(3551)# check versioin update // 检查版本更新def checkup(sname): newv = obtain_new_version(sname) # print(newv) oldv = current_version(sname) # print("this: %s" % (oldv)) time.sleep(5) if newv in oldv: print("\033[1;32mThis's the latest version\033[0m\033[5;32m...\033[0m") s = "off" return s else: print("\033[1;32mCheck the new version, updating, please wait\033[0m\033[5;32m!!!...\033[0m") s = "on" print(s) return s# check start running status // 检查启动运行状态def running_stated(sname): os.system("docker ps -a | grep %s | awk '{print $NF}' > ./status.txt" % (sname)) f1 = open("./status.txt") status1 = f1.readline() # print("这是状态:%s" % (status1)) if 'snwit' in status1: os.system("docker logs %s | grep -i 'error' > ./out.txt || echo 'on' > ./out.txt" % (sname)) f2 = open("./out.txt") logout = f2.readline() # print(logout) if 'on' in logout: print("\033[1;33m %s server is running success\033[0m\033[5;32m!!!...\033[0m" % (sname)) s = "on" return s else: print("\033[1;31m %s server is running fail\033[0m\033[5;32m!!!...\033[0m" % (sname)) s = "off" return s else: print("\033[1;31m%s server is stop\033[0m\033[5;32m!!!...\033[0m") s = "no" return s# start server // 启动服务def start_server(sname): while True: os.system("docker ps -a |grep %s | awk '{print $NF}' > ./status.txt" % (sname)) f = open("./status.txt") status = f.readline() if sname in status: print("\033[1;32m%s server is running...\nstopping, please wait!\033[0m\033[5;32m...\033[0m" % (sname)) stop_server(sname) os.system("/data/scripts/runserver %s %s" % (sname, obtain_new_version(sname))) time.sleep(3) s = running_stated(sname) if 'on' in s: return s elif 'no' in s: return s else: os.system("/data/scripts/runserver %s %s" % (sname, obtain_new_version(sname))) time.sleep(3) s = running_stated(sname) if 'on' in s: return s elif 'no' in s: return s# stop server // 停止服务def stop_server(sname): print("\033[1;32m%s server is stopping\033[0m\033[5;32m...\033[0m" % (sname)) while True: os.system("docker stop %s" % (sname)) time.sleep(3) os.system("docker rm %s" % (sname)) time.sleep(3) os.system("docker ps -a | grep %s | awk '{print $NF}' > ./stop.txt" % (sname)) f = open("./stop.txt") stop_out = f.readline() if sname in stop_out: print("\033[1;31m %s server is running !!! please wait\033[0m\033[5;32m...\033[0m" % (sname)) time.sleep(2) # sys.exit(2) else: print("\033[1;32m%s server is stop\033[0m\033[5;32m...\033[0m" % (sname)) time.sleep(2) s = "stop" return s # sys.exit()# update failed version rollback // 更新失败时版本回滚def rollback_server(sname): print("\033[1;33m%s update fail, %s server is rollback !!!\033[0m\033[5;32m...\033[0m" % (sname, sname)) f = open("./version.txt") vold = f.readline() while True: stop_server(sname) os.system("/data/scripts/runserver %s %s" % (sname, vold)) time.sleep(3) s = running_stated(sname) if 'on' in s: sys.exit()if __name__ == "__main__": if len(sys.argv) < 2: h = used_Usge() print(h) else: sname = sys.argv[1] obtain_new_version(sname) l = checkup(sname) if 'on' in l: l1 = start_server(sname) if 'no' in l1: while True: rollback_server(sname)
转载地址:http://qhqwi.baihongyu.com/