当前位置: 首页 > news >正文

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

代码自动上传及部署

  • 1、引言
  • 2、代码实战
  • 2.1 模块安装
    • 2.2 实现思路
    • 2.3 代码示例
      • 2.3.1 创建监听器
      • 2.3.2 创建事件处理对象
      • 2.3.3 启动事件监听
    • 2.4 启动运行
  • 3、总结

1、引言

小鱼:你在手动打包,要先rm - rf ,再 go away ??
小屌丝:鱼哥,你在说啥嘞, 我可是正经人…
小鱼:那你干啥,手动打包,没有Jenkins吗,没有自动打包工具吗?
小屌丝:如果能Jenkins自动发布,我还干啥费劲的执行手动打包。
小鱼:不能Jenkins?跨域了? 不能安装? 还是不会自动打包?
小屌丝:一来是跨域,其次,无法在目标服务器部署Jenkins,所以,只能手动打包上传…
小鱼:这样啊, 那你你应该庆幸,你遇到我了。。。。
小屌丝:鱼哥,那你的意思,你有好的方法了!
小鱼:必须的,今天分享一个,不用Jenkins,只用区区2段代码,就完成项目自动上传和部署。
小屌丝:鱼哥, v5 ~ ~
在这里插入图片描述

2、代码实战

在实际的工作中,遇到小屌丝的那种情况,也是很常见的。
发版的时候,需要部署到客户的服务器,但是,客户的服务器,对安装软件有着非常严格的要求,这个时候,
大部分的同学,都是手动打包,上传,部署。

为了解放同学的双手,小鱼,今天就来搞一个自动上传部署,而且还带监控的功能。
在这里插入图片描述

2.1 模块安装

我们需要依赖python的第三方库就是:watchdog

老规矩,pip 安装

pip install watchdog

其它安装方式,直接看这两篇:

  • Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
  • Python3:我低调的只用一行代码,就导入Python所有库!

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知识。

相关文章:

  • 贪心c++(结合LeetCode例题)
  • MATLAB-多项式曲线回归拟合
  • 第五章-Python数据处理工具--Pandas
  • Redis02-分布式session、缓存查询及缓存问题的解决
  • JavaWeb——AjaxJson
  • Spring-Cloud-Feign-03
  • 【深入Javascript闭包】
  • 词典
  • Spring Bean的生命周期
  • 秋招-致谢
  • 「实用工具—LICEcap」写博必备|动图制作|一键生成gif(GIF)
  • 3D目标检测(一)
  • 秋招面试- - -Java体系最新面试题(8)
  • 前端工程师面试题详解(四)
  • app端专项测试
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Github访问慢解决办法
  • GraphQL学习过程应该是这样的
  • happypack两次报错的问题
  • JAVA SE 6 GC调优笔记
  • js面向对象
  • spring boot 整合mybatis 无法输出sql的问题
  • vue中实现单选
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 构建二叉树进行数值数组的去重及优化
  • 官方解决所有 npm 全局安装权限问题
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • NLPIR智能语义技术让大数据挖掘更简单
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (已解决)什么是vue导航守卫
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET delegate 委托 、 Event 事件
  • .net 反编译_.net反编译的相关问题
  • .NET 中的轻量级线程安全
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET开发人员必知的八个网站
  • .net专家(高海东的专栏)
  • /etc/motd and /etc/issue
  • @font-face 用字体画图标
  • @SuppressWarnings注解
  • []T 还是 []*T, 这是一个问题
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [Angular 基础] - 数据绑定(databinding)
  • [c]统计数字
  • [CLR via C#]11. 事件
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [FC][常见Mapper IRQ研究]
  • [LeetCode]—Simplify Path 简化路径表达式