最近在部署前端项目时,需要通过堡垒机将前端项目压缩包上传到应用服务器的/tmp目录下,然后进入应用服务器,使用mv命令将压缩文件移动到Nginx项目设置目录,最后使用unzip命令解压文件,完成项目的部署。仔细分析。大多数操作都是重复动作。手动完成这些操作会大大降低工作效率。本文将介绍如何使用Python监控文件夹,协助完成服务的部署动作1.准备工作这里介绍一个Python依赖库“watchdog”,可以用来监控某个文件目录下的文件变化,包括:删除,修改,添加等。每个操作都会回调一个事件函数,我们可以在内部编写自定义逻辑来满足我们的需求#安装依赖包pip3installwatchdog2。在实践中首先,我们需要创建监听文件夹目录的监听器fromwatchdog.observersimportObserver...#创建监听文件夹目录的监听器observer=Observer()...然后,创建2个事件处理对象PS:该对象继承自“FileSystemEventHandler”类,分别用于监听“/tmp”目录、“/home/project/frontend”目录,假设事件对象命名为obj1,obj2obj1负责监听/tmp目录,重写“newormodify”事件方法,完成压缩文件的移动fromwatchdog.eventsimport*importntpathimportshutilimportzipfiledefget_filename(filepath):"""根据文件夹目录,获取文件名(待后缀):参数文件路径::返回:“”“返回ntpath.basename(文件路径)类FileMoveHandler(FileSystemEventHandler):def__init__(self):FileSystemEventHandler.__init__(self)...#创建文件defon_created(self,event):#创建一个新文件夹ifevent.is_directory:#print("directorycreated:{0}".format(event.src_path))pass#创建一个新文件else:#print("filecreated:{0}".format(event.src_path))filename=get_filename(event.src_path)#如果属于前端4项目压缩包,则开始文件夹操作iffilenameinwatch_tags:self.start(文件名)。..defon_modified(self,event):ifevent.is_directory:#print("目录修改:{0}".format(event.src_path))passelse:#print("文件修改:{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#目标projectfolder(targetproject)target_project_path=target_folder+filename_without_suffix#1.复制文件到目标文件夹print(f"copysourcedirectory{source_file_path},targetfolder:{target_folder}")#删除目标文件夹压缩文件ifos.path.exists(target_file_path):os.remove(target_file_path)#将文件移动到目标文件夹shutil.move(source_file_path,target_folder)#2.清空目标文件夹中的所有文件夹(如果存在)#如果不存在存在,如果os.path.exists(target_project_path)创建一个新文件夹:shutil.rmtree(target_project_path,ignore_errors=True)print(f"Theproject{filename_without_suffix}movesuccessfully!")exceptExceptionase:print("deploymentfailed,errorreason:",str(e.args))obj2负责监控/home/project/frontend目录,同时重写了"newormodified"事件方法,完成compressed的解压动作files...defstart(self,filename):#不带后缀的文件名filename_without_suffix=filename.split(".")[0]#目标文件路径(压缩包文件)target_file_path=target_folder+filename#目标项目文件夹(targetproject)target_project_path=target_folder+filename_without_suffixr=zipfile.is_zipfile(target_file_path)如果r:fz=zipfile.ZipFile(target_file_path,'r')forfileinfz.namelist():fz.extract(file,target_folder)else:print('thisNotanormalziparchive!')...然后,通过listenerimporttime启动以上两个事件的监听任务...if__name__=="__main__":#需要监听的文件夹目录watch_folder="/tmp/"#项目目标文件夹目录target_folder="/home/project/frontend/"#监视文件夹r名称,即:项目压缩包名称watch_tags=['proj1.zip','proj2.zip','proj3.zip','proj4.zip']#创建监听器监听文件夹目录observer=Observer()#创建两个事件处理对象move_handler=FileMoveHandler()unzip_handler=FileUnzipHandler()#启动监听任务#参数为:observer,监听目录,是否监听子目录observer.schedule(move_handler,watch_folder,True)observer.schedule(unzip_handler,target_folder,True)observer.start()try:whileTrue:time.sleep(1)exceptKeyboardInterrupt:observer.stop()observer.join()...最后,我们通过“nohup”命令,让文件监控程序在后台运行#后台运行#项目文件:watch_folder.py#日志文件:watch_folder.lognohuppython3-uwatch_folder.py>watch_folder.log2>&1#查看日志:catwatch_folder.日志3。总结通过以上操作,我每次通过堡垒机上传前端zip压缩的项目文件到应用服务器的/tmp目录下,程序会自动执行如下操作,自动完成应用部署。Python学习资料,包括初学者电子书、教程、源码等,免费分享给大家!想上“Python编程学习圈”,发“J”免费领取
