node项目启动为例,传递部署参数则进行部署,判断是否今日第一次上线。如果第一次上线,则进行备份,如果不是第一次上线则不备份。传递回滚参数将今日第一次上线时备份项目覆盖到项目目录,重启项目,回滚完成。
python script.py deploy 部署
python script.py rollback 回滚
script.py
#!/usr/bin/env python3
#-*- coding:utf-8 -*-
#author:tangyl
import os
import sys
import time
import shutil
import tarfile
class Go_Online(object):
def __init__(self):
self.package_name="project_name" #项目名称变量
self.upload_path="/opt/uploadwar/" #传输中继目录(Jenkins讲项目打包传送到到这个目录)
self.deploy_path = "project_path" #项目路径(项目执行时候路径)
self.back_path = "back_path" #备份路径(上线前将项目备份的目录)
self.date = time.strftime('%Y-%m-%d',time.localtime(time.time()))
self.bak_date = self.back_path+str(self.date)
def Bak(self):
# 判断今日备份目录是否存在,如果不存在就创建目录,并且进行备份
if os.path.exists(self.bak_date):
# shutil.move(deploy_path,bak_date)
print("再次部署!")
else:
print("今日首次上线,进行备份!")
os.mkdir(self.bak_date)
shutil.move(self.deploy_path+self.package_name,self.bak_date)
def Deploy(self):
self.Bak()
# 部署代码
try:
t = tarfile.open(self.upload_path+self.package_name+".tar.gz","r:gz")
file_name = os.path.dirname(self.deploy_path+self.package_name+"/")
# os.chdir(deploy_path)
t.extractall(path=file_name)
except Exception as e:
print("项目部署失败!")
else:
self.Start_Project()
def Rollback(self):
# 回滚操作
try:
shutil.rmtree(self.deploy_path+self.package_name)
shutil.copytree(self.bak_date+"/"+self.package_name,self.deploy_path+self.package_name)
print("进行回滚")
except Exception as e:
print("回滚失败")
else:
self.Start_Project()
def Start_Project(self):
# 启动项目
n_env="serApiTest"
os.system("cd {0} && export NODE_ENV={1} && pm2 start ./bin/www --name={2} && pm2 restart ./bin/www --name={3}".format(self.deploy_path+self.package_name,n_env,self.package_name,self.package_name))
os.system("pm2 list")
os.system("pm2 save")
if __name__ == "__main__":
start_Go_Online = Go_Online()
v1 = sys.argv
if v1[1].strip() == "deploy":
start_Go_Online.Deploy()
else:
start_Go_Online.Rollback()