ホームページ >バックエンド開発 >Python チュートリアル >素晴らしいですね。Python を使用してサービスのデプロイメントを自動化します。

素晴らしいですね。Python を使用してサービスのデプロイメントを自動化します。

王林
王林転載
2023-04-14 13:49:032097ブラウズ

素晴らしいですね。Python を使用してサービスのデプロイメントを自動化します。

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

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


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


1. 準備


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


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

# 安装依赖包
pip3 install watchdog

プロジェクトアドレス:


https://www.php.cn/link/47841cc9e552bd5c40164db7073b817b

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 ディレクトリを監視します。 、また、「New or 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 ディレクトリにアップロードするたびに、プログラムは自動的に続行されます。次の操作により、アプリケーションのデプロイメントが自動的に完了します。

記事内のソース コードをバックエンドにアップロードし、キーワード「watchdog」を使用して返信して完全なソース コードを取得します。

記事が良いと思ったら、「いいね」とシェアをお願いします。これが、より質の高い記事を出力し続けるための最大のモチベーションになります。

以上が素晴らしいですね。Python を使用してサービスのデプロイメントを自動化します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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