Python3,仅仅2段代码,就实现项目代码自动上传及部署,再也不需要Jenkins了。

简介: Python3,仅仅2段代码,就实现项目代码自动上传及部署,再也不需要Jenkins了。

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博客专家

- 51Testing认证讲师

关注我,带你学习更多更有趣的Python知识。

目录
相关文章
|
24天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
32 6
|
17天前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
60 8
|
25天前
|
API Python
【Azure Developer】分享一段Python代码调用Graph API创建用户的示例
分享一段Python代码调用Graph API创建用户的示例
48 11
|
26天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
37 11
|
22天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
23天前
|
程序员 测试技术 数据安全/隐私保护
深入理解Python装饰器:提升代码重用与可读性
本文旨在为中高级Python开发者提供一份关于装饰器的深度解析。通过探讨装饰器的基本原理、类型以及在实际项目中的应用案例,帮助读者更好地理解并运用这一强大的语言特性。不同于常规摘要,本文将以一个实际的软件开发场景引入,逐步揭示装饰器如何优化代码结构,提高开发效率和代码质量。
46 6
|
25天前
|
运维 jenkins Java
Jenkins 自动化局域网管控软件构建与部署流程
在企业局域网管理中,Jenkins 作为自动化工具,通过配置源码管理、构建及部署步骤,实现了高效、稳定的软件开发与部署流程,显著提升局域网管控软件的开发与运维效率。
40 5
|
27天前
|
Python
如何提高Python代码的可读性?
如何提高Python代码的可读性?
39 4
|
27天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
1月前
|
存储 设计模式 缓存
Python中的装饰器:代码的魔法增强剂####
本文将深入探讨Python语言中一个强大而灵活的特性——装饰器。不同于传统的函数调用,装饰器提供了一种优雅的方式来扩展或修改函数行为,无需直接修改原函数代码。我们将通过实例分析,揭示装饰器的定义、工作原理及其在实际项目中的应用价值,旨在帮助开发者更好地理解和利用这一高级功能,提升代码的可读性与维护性。 ####