大家好,我是彭涛!最近在部署前端项目时,需要通过堡垒机将前端项目压缩包上传到应用服务器的/tmp目录下,然后进入应用服务器,使用mv命令将压缩文件移动到Nginx项目设置目录,最后使用unzip命令解压文件,完成项目的部署。仔细分析,大部分操作都是重复动作,人工完成这些操作会大大降低工作效率。本文将介绍如何使用Python监控文件夹,辅助部署服务。1.准备这里我们要介绍一个Python依赖库“watchdog”,它可以用来监控某个文件目录下的文件变化,包括:删除、修改、添加等,每个操作都会回调一个事件函数,我们可以在内部编写自定义逻辑来满足我们的需求。#安装依赖包pip3installwatchdog项目地址:https://pypi.org/project/watchdog/二、实战首先我们需要创建一个监听器,用于监听fromwatchdog.observersimportObserver..文件夹目录。.#创建监听器监听文件夹目录observer=Observer()...然后,创建2个事件处理对象。PS:该对象继承自“FileSystemEventHandler”类。它们分别用于监控“/tmp”目录和“/home/project/frontend”目录。假设事件对象名为obj1,obj2obj1负责监控/tmp目录,重写“newormodify”事件方法完成压缩文件Move操作:fromwatchdog.eventsimport*importntpathimportshutilimportzipfiledefget_filename(filepath):"""根据文件夹目录,获取文件名(需加后缀):paramfilepath::return:"""returnntpath.basename(filepath)classFileMoveHandler(FileSystemEventHandler):def__init__(self):FileSystemEventHandler.__init__(self)...#创建文件defon_created(self,event):#新建文件夹ifevent.is_directory:#print("directorycreated:{0}".format(event.src_path))pass#创建一个新文件夹fileelse:#print("filecreated:{0}".format(event.src_path))filename=get_filename(event.src_path)#如果属于前端4项目压缩包,则开始文件夹操作iffilenameinwatch_tags:self.start(filename)...defon_modified(self,event):ifevent.is_directory:#打印("目录修改:{0}".format(event.src_path))passelse:#print("filemodified:{0}".format(event.src_path))filename=get_filename(event.src_path)iffilenameinwatch_tags:self.start(filename)...defstart(self,filename):"""文件处理逻辑:paramfilename::return:"""try:#不带后缀的文件名filename_without_suffix=filename.split(".")[0]#源文件路径(压缩包文件)source_file_path=watch_folder+filename#目标文件路径(压缩包文件)target_file_path=target_folder+filename#目标项目文件夹(targetproject)target_project_path=target_folder+filename_without_suffix#1.复制文件到目标文件夹print(f"Copythesourcedirectory{source_file_path},targetfolder:{target_folder}")#删除目标文件夹下的压缩文件ifos.path.exists(target_file_path):os.remove(target_file_path)#移动文件到目标文件夹shutil.move(source_file_path,目标文件夹)#2.清除目标文件夹中的所有文件夹(如果存在)#如果不存在,则创建一个新文件夹ifos.path.exists(target_project_path):shutil.rmtree(target_project_path,ignore_errors=True)print(f"Project{filename_without_suffix}movedsuccessfully!")exceptExceptionase:print("Deploymentfailed,errorreason:",str(e.args))obj2负责监控/home/project/frontend目录,同时重写"新增或修改"事件方法,完成压缩文件的解压动作:...defstart(self,filename):#不带后缀的文件名filename_without_suffix=filename.split(".")[0]#目标文件路径(压缩后packagefile)target_file_path=target_folder+filename#目标项目文件夹(targetproject)target_project_path=target_folder+filename_without_suffixr=zipfile.is_zipfile(target_file_path)ifr:fz=zipfile.ZipFile(target_file_path,'r')forfileinfz.namelist():fz.extract(file,target_folder)else:print('这不是一个normalziparchive!')...然后,通过listenerimporttime启动上述两个事件的监听任务...if__name__=="__main__":#需要监听的文件夹目录watch_folder="/tmp/"#项目目标文件夹目录target_folder="/home/project/frontend/"#监控文件夹名称,即:项目压缩包名称watch_tags=['proj1.zip','proj2.zip','proj3.zip','proj4.zip']#创建监听器监听文件夹目录observer=Observer()#创建两个事件处理对象move_handler=FileMoveHandler()unzip_handler=FileUnzipHandler()#启动监听任务#参数为:observer,监控目录,是否监控子目录stop()observer.join()...最后我们可以在服务器上通过“nohup”命令在后台运行文件监控程序#后台运行#项目文件:watch_folder.py#日志文件:watch_folder.lognohuppython3-uwatch_folder.py>watch_folder.log2>&1查看日志:catwatch_文件夹.log3。总结通过上面的操作,我每次将前端zip压缩后的项目文件上传到应用服务器的/tmp目录下,程序会自动执行如下操作,自动完成应用部署
