>  기사  >  백엔드 개발  >  좋습니다. Python을 사용하여 서비스 배포를 자동화하세요!

좋습니다. Python을 사용하여 서비스 배포를 자동화하세요!

王林
王林앞으로
2023-04-14 13:49:032074검색

좋습니다. Python을 사용하여 서비스 배포를 자동화하세요!

최근 프론트엔드 프로젝트를 배포할 때 먼저 프론트엔드 프로젝트 압축 패키지를 배스천 머신을 통해 애플리케이션 서버의 /tmp 디렉터리에 업로드한 다음 애플리케이션 서버에 들어가서 mv 명령을 사용하여 이동해야 합니다. 압축된 파일을 Nginx 프로젝트 설정 디렉터리에 복사하고 마지막으로 unzip 명령을 사용하여 파일의 압축을 풀어 프로젝트 배포를 완료합니다.

주의깊은 분석에 따르면 대부분의 작업은 반복적인 작업이며 이러한 작업을 수동으로 완료하면 작업 효율성이 크게 저하됩니다.

이 기사에서는 Python을 사용하여 폴더를 모니터링하여 서비스 배포를 완료하는 방법을 소개합니다.

1. 준비

여기서 Python 종속 라이브러리 "watchdog"을 소개합니다.

삭제, 수정, 추가 등을 포함하여 특정 파일 디렉터리의 파일 변경 사항을 모니터링하는 데 사용할 수 있습니다. 이벤트 함수를 다시 호출하면 필요에 맞게 내부적으로 사용자 정의 로직을 작성할 수 있습니다.

R
# 安装依赖包
pip3 install watchdog
rePROJECT 주소 :


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 디렉터리를 모니터링하고 "새로 만들기 또는 수정" 이벤트 메서드를 다시 작성하여 압축 해제 작업을 완료합니다. 압축 파일 수:

...
 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 디렉터리에 업로드할 때마다 프로그램이 자동으로 후속 작업을 수행하고 자동으로 애플리케이션 배포를 완료합니다.


기사에 있는 소스코드를 백엔드에 올렸고, "watchdog"이라는 키워드로 답장을 보내면 완전한 소스코드를 얻을 수 있습니다.


글이 좋다고 생각되시면 좋아요와 공유 부탁드립니다. 이것이 제가 계속해서 더 좋은 글을 만들 수 있는 가장 큰 원동력이 될 것이기 때문입니다!

위 내용은 좋습니다. Python을 사용하여 서비스 배포를 자동화하세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제