ホームページ  >  記事  >  バックエンド開発  >  実践的な戦闘: Python を使用してフォルダーを自動的に監視し、サービスのデプロイメントを完了する方法

実践的な戦闘: Python を使用してフォルダーを自動的に監視し、サービスのデプロイメントを完了する方法

王林
王林転載
2023-05-09 10:46:071482ブラウズ

实战 | 如何用 Python 自动化监控文件夹完成服务部署!

皆さんこんにちは、私はペンタオです!

最近フロントエンド プロジェクトをデプロイする場合は、まずフロントエンド プロジェクトの圧縮パッケージを要塞マシン経由でアプリケーション サーバーの /tmp ディレクトリにアップロードし、次にアプリケーション サーバーに入り、mv コマンドを使用する必要があります。圧縮ファイルを Nginx プロジェクトに移動します。 ディレクトリを設定し、最後に unzip コマンドを使用してファイルを解凍し、プロジェクトのデプロイを完了します。

注意深く分析すると、ほとんどの操作は繰り返しの操作であり、これらの操作を手動で完了すると作業効率が大幅に低下することがわかります。

この記事では、Python を使用してフォルダーを監視し、サービスのデプロイメントの完了を支援する方法を紹介します。

1. 準備

ここでは、Python 依存ライブラリ「watchdog」を紹介します

これは、特定のファイル ディレクトリ内のファイルの変更 (削除、削除など) を監視するために使用できます。変更、新しい待機操作が追加されました。各操作はイベント関数をコールバックします。ニーズを満たすために内部でカスタム ロジックを作成できます。

# 安装依赖包
pip3 install watchdog

プロジェクトアドレス:

https://www.php.cn/link/690e6de4e3e2c0916b6160d9959d156b

2. やってみましょう実際には

まず、フォルダー ディレクトリをリッスンするためのリスナーを作成する必要があります。

from watchdog.observers import Observer
...
# 创建一个监听器,用来监听文件夹目录
observer = Observer()
...

次に、2 つのイベント処理オブジェクトを作成します。

PS: このオブジェクトは「FileSystemEventHandler」クラスを継承します。

これらは、それぞれ "/tmp" ディレクトリと "/home/project/frontend" ディレクトリを監視するために使用されます。イベント オブジェクトの名前は obj1 で、obj2

obj1 が担当するとします。 /tmp ディレクトリを監視します。圧縮ファイルの移動操作を完了するには、「New or Modified」イベント メソッドを書き直します:

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 ディレクトリの監視を担当します。 「New または Modified」イベント メソッドを書き換えて、圧縮ファイルの解凍を完了します。アクション:

...
 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压缩包!')
...

次に、リスナーを通じて上記 2 つのイベントのリスニング タスクを開始します

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 を使用してフォルダーを自動的に監視し、サービスのデプロイメントを完了する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。