<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家好,我是安果!
最近在部署前端專案的時候,需要先將前端專案壓縮包通過堡壘機上傳到應用伺服器的 /tmp 目錄下,然後進入應用伺服器中,使用 mv 命令將壓縮檔案移動到 Nginx 專案設定目錄,最後使用 unzip 命令解壓檔案,以此完成專案的部署
仔細分析,大部分操作都是重複性的動作,人工去完成這些操作會大大降低工作效率
本篇文章將介紹如何利用 Python 監控資料夾,以此輔助完成服務的部署動作
這裡要介紹一個 Python 依賴庫「 watchdog 」
它可用於監控某個檔案目錄下的檔案變化,包含:刪除、修改、新增等操,每一個操作都會回撥一個事件函數,我們可以在內部編寫自定義的邏輯,以此滿足我們的需求
# 安裝依賴包 pip3 install watchdog
首先,我們需要建立一個監聽器,用於監聽資料夾目錄
from watchdog.observers import Observer ... # 建立一個監聽器,用來監聽資料夾目錄 observer = Observer() ...
然後,建立 2 個事件處理物件
PS:該物件繼承於「 FileSystemEventHandler 」類
它們分別用於監聽「 /tmp 」目錄、「 /home/project/frontend 」目錄,假設事件物件被命名為 obj1、obj2
obj1 負責監聽 /tmp 目錄,重寫「 新建或修改 」事件方法,完成壓縮檔案的移動操作
from watchdog.events import * import ntpath import shutil import zipfile def get_filename(filepath): """ 根據資料夾目錄,獲取檔名稱(待字尾) :param filepath: :return: """ return ntpath.basename(filepath) class FileMoveHandler(FileSystemEventHandler): def __init__(self): FileSystemEventHandler.__init__(self) ... # 檔案新建 def on_created(self, event): # 新建資料夾 if event.is_directory: # print("directory created:{0}".format(event.src_path)) pass # 新建檔案 else: # print("file created:{0}".format(event.src_path)) filename = get_filename(event.src_path) # 如果屬於前端的4個專案壓縮包,開始資料夾的操作 if filename in watch_tags: self.start(filename) ... def on_modified(self, event): if event.is_directory: # print("directory modified:{0}".format(event.src_path)) pass else: # print("file modified:{0}".format(event.src_path)) filename = get_filename(event.src_path) if filename in watch_tags: self.start(filename) ... def start(self, filename): """ 檔案處理邏輯 :param filename: :return: """ try: # 檔名不帶字尾 filename_without_suffix = filename.split(".")[0] # 原始檔路徑(壓縮包檔案) source_file_path = watch_folder + filename # 目標檔案路徑(壓縮包檔案) target_file_path = target_folder + filename # 目標專案資料夾(目標專案) target_project_path = target_folder + filename_without_suffix # 1、複製檔案到目標資料夾 print(f"拷貝源目錄{source_file_path},目標資料夾:{target_folder}") # 刪除目標資料夾下的壓縮檔案 if os.path.exists(target_file_path): os.remove(target_file_path) # 移動檔案到目標資料夾中 shutil.move(source_file_path, target_folder) # 2、清空目標資料夾中內的所有資料夾(如果存在) # 如果不存在,新建一個資料夾 if os.path.exists(target_project_path): shutil.rmtree(target_project_path, ignore_errors=True) print(f"專案{filename_without_suffix}移動成功!") except Exception as e: print("部署失敗,錯誤原因:", str(e.args))
obj2 負責監聽 /home/project/frontend 目錄,同樣重寫「 新建或修改 」事件方法,完成壓縮檔案的解壓動作
... def start(self, filename): # 檔名不帶字尾 filename_without_suffix = filename.split(".")[0] # 目標檔案路徑(壓縮包檔案) target_file_path = target_folder + filename # 目標專案資料夾(目標專案) target_project_path = target_folder + filename_without_suffix r = zipfile.is_zipfile(target_file_path) if r: fz = zipfile.ZipFile(target_file_path, 'r') for file in fz.namelist(): fz.extract(file, target_folder) else: print('這不是一個正常的zip壓縮包!') ...
接著,通過監聽器啟動上面兩個事件的監聽任務
import time ... 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.schedule(move_handler, watch_folder, True) observer.schedule(unzip_handler, target_folder, True) observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() ...
最後,我們在伺服器上通過「 nohup 」命令,讓檔案監聽程式在後臺執行即可
# 在後臺執行 # 專案檔案:watch_folder.py # 紀錄檔檔案:watch_folder.log nohup python3 -u watch_folder.py > watch_folder.log 2>&1 & # 檢視紀錄檔: cat watch_folder.log
通過上面的操作,每次我通過堡壘機將前端 zip 壓縮專案檔案上傳到應用伺服器的 /tmp 目錄下,程式會自動進行後面的操作,自動完成應用部署
到此這篇關於利用Python實現自動化監控資料夾完成服務部署的文章就介紹到這了,更多相關Python監控資料夾內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45