1、引言
小鱼:你在手动打包,要先rm - rf ,再 go away ??
小屌丝:鱼哥,你在说啥嘞, 我可是正经人…
小鱼:那你干啥,手动打包,没有Jenkins吗,没有自动打包工具吗?
小屌丝:如果能Jenkins自动发布,我还干啥费劲的执行手动打包。
小鱼:不能Jenkins?跨域了? 不能安装? 还是不会自动打包?
小屌丝:一来是跨域,其次,无法在目标服务器部署Jenkins,所以,只能手动打包上传…
小鱼:这样啊, 那你你应该庆幸,你遇到我了。。。。
小屌丝:鱼哥,那你的意思,你有好的方法了!
小鱼:必须的,今天分享一个,不用Jenkins,只用区区2段代码,就完成项目自动上传和部署。
小屌丝:鱼哥, v5 ~ ~
2、代码实战
在实际的工作中,遇到小屌丝的那种情况,也是很常见的。
发版的时候,需要部署到客户的服务器,但是,客户的服务器,对安装软件有着非常严格的要求,这个时候,
大部分的同学,都是手动打包,上传,部署。
为了解放同学的双手,小鱼,今天就来搞一个自动上传部署,而且还带监控的功能。
2.1 模块安装我们需要依赖python的第三方库就是:watchdog
老规矩,pip 安装
pip install watchdog
其它安装方式,直接看这两篇:
2.2 实现思路
在撸码前, 常规操作是,思考+规划 = 实现思路:
- 创建监听器;
- 创建事件处理对象;
- 执行监听器,监听事件处理对象;
- 在服务器执行脚本;
有了明确的思路,我们就来事撸码。
2.3 代码示例
2.3.1 创建监听器
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-09-09 # @Author : Carl_DJ import os from watchdog.observers import Observer #创建一个监听器,用于监听文件夹目录 observer = Observer() #创建2个事件处理对象 '分别用来监听 [/tmp]目录 、[/opt/project/projectName]目录'
2.3.2 创建事件处理对象
代码示例一:对/tmp文件进行监听
# -*- coding:utf-8 -*- # @Time : 2022-09-09 # @Author : Carl_DJ from watchdog.events import * import ntpath import shutil import zipfile ''' 实现功能: 1、负责 监听 /tmp 目录, 2、事件方法:新建&修改 3、执行压缩文件移动 ''' 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_tmp(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))
代码示例二:对//opt/project/projectName文件进行监听
# -*- coding:utf-8 -*- # @Time : 2022-09-09 # @Author : Carl_DJ ... def start_opt(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('压缩包出现问题,无法进行解压操作!')
2.3.3 启动事件监听
代码示例
# -*- coding:utf-8 -*- # @Time : 2022-09-09 # @Author : Carl_DJ import time if __name__ == "__main__": # 待监听的文件夹目录 watch_folder = "/tmp/" # 项目目标文件夹目录 target_folder = "/opt/project/projectName/" # 监听文件夹名称,即:项目压缩包名称 watch_tags = ['project1.zip', 'project2.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()
2.4 启动运行
最后,我们就在目标服务器,启动运行脚本。
文件命名:
- 脚本文件:watchdog_folder.py
- 日志文件:watchdog_floder.log
nohup python3 -u watchdog_folder.py > watchdog_floder.log 2>&1 &
3、总结
看到这里,今天的分享差不多就结束了。
回顾一下,今天的的内容,大体思路:
先创建监听器→再创建事件处理对象→启动监听器,对事件进行监听处理→最后在服务器上启动命令执行。
一套行云流水的动作,就完成了项目代码自动上传,监控,部署等动作,
妈妈再也不用担心我打包部署花费时间了。
最后,再唠叨一句:
我是小鱼:
- CSDN博客专家;
关注我,带你学习更多更有趣的Python知识。