首頁 > 軟體

利用Python實現自動化監控資料夾完成服務部署

2022-07-04 18:03:11

大家好,我是安果!

最近在部署前端專案的時候,需要先將前端專案壓縮包通過堡壘機上傳到應用伺服器的 /tmp 目錄下,然後進入應用伺服器中,使用 mv 命令將壓縮檔案移動到 Nginx 專案設定目錄,最後使用 unzip 命令解壓檔案,以此完成專案的部署

仔細分析,大部分操作都是重複性的動作,人工去完成這些操作會大大降低工作效率

本篇文章將介紹如何利用 Python 監控資料夾,以此輔助完成服務的部署動作

1. 準備

這裡要介紹一個 Python 依賴庫「 watchdog 」

它可用於監控某個檔案目錄下的檔案變化,包含:刪除、修改、新增等操,每一個操作都會回撥一個事件函數,我們可以在內部編寫自定義的邏輯,以此滿足我們的需求

# 安裝依賴包
pip3 install watchdog

專案地址

2. 實戰一下

首先,我們需要建立一個監聽器,用於監聽資料夾目錄

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

3. 總結

通過上面的操作,每次我通過堡壘機將前端 zip 壓縮專案檔案上傳到應用伺服器的 /tmp 目錄下,程式會自動進行後面的操作,自動完成應用部署

到此這篇關於利用Python實現自動化監控資料夾完成服務部署的文章就介紹到這了,更多相關Python監控資料夾內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com