fabric构建自动部署服务

1. fabric简介

fabric 是python 的一个第三方库,同时它也是一个命令行工具。它提供了丰富的同 SSH 交互的接口,可以用来在本地或远程机器上自动化、流水化地执行 shell 命令。使用 fabric 提供的命令行工具,可以很方便地执行应用部署和系统管理等操作。因此它非常适合用来做应用的远程部署及系统维护。

2. 安装及使用

安装命令:pip install fabric

使用参考官网: fabric英文官网fabric中文官网

3. 构建脚本

python 复制代码
import datetime
from fabric import task

@task
def startBuild(c, env="dev", force="0"):
    """
    构建项目自动部署
    :param c: 上下文content
    :param env: 环境变量,开发环境or生产环境
    :param force: 强制构建,"1" 强制构建
    """
    current_day = datetime.datetime.now().strftime("%Y%m%d")

    if env == "dev":
        code_branch = "develop"
        to_virtual_env_cmd = "workon user_predict"
    else:
        code_branch = "master"
        to_virtual_env_cmd = "source /export/venvs/user_predict/bin/activate"

    logger.info(">>>>>>>>>> 开始备份代码 <<<<<<<<<<")
    with c.cd("/export/services/"):
        c.run(f"zip -q -r /tmp/predict_bak/predict_code/user_predict_{current_day}.zip user_predict")
        c.run(f"cp -ra user_predict user_predict_old_{current_day}")

    logger.info(">>>>>>>>>> 开始准备从远程拉取代码 <<<<<<<<<<")
    with c.cd("/export/services/user_predict/"):
        c.run("git remote -v update")
        c.run(f"git checkout {code_branch}")
        local_commit_id = c.run("git rev-parse @{0}").stdout.strip()
        remote_commit_id = c.run("git rev-parse @{u}").stdout.strip()
        if local_commit_id == remote_commit_id and force == "0":
            logger.warning(f">>>>>>>>>> 远程{code_branch}分支最近未提交代码,本次不用构建 <<<<<<<<<<")
            return
        c.run("git pull")

    with c.prefix("source ~/.bashrc"), c.prefix(to_virtual_env_cmd):
        try:
            logging.info(">>>>>>>>>> 前端开始打包并收集静态文件 <<<<<<<<<<")
            c.run(f"cd /export/service/user_predict/frontend/; npm run build")
            c.run(f"cd /export/service/user_predict/; python manage.py collectstatic --noinput")
        except Exception as e:
            logger.error(f">>>>>>>>>> 收集静态文件失败,详细报错为{e} <<<<<<<<<<")
            return

        try:
            logging.info(">>>>>>>>>> 重启uwsgi拉起的pid进程文件 <<<<<<<<<<")
            c.run("cd /export/services/user_predict/; export DJANGO_SETTINGS_MODULE=predict.settings; uwsgi --reload /export/services/user_predict/predict.pid")
            logging.info(">>>>>>>>>> 重启被supervisor监护的进程 <<<<<<<<<<")
            c.run("supervisorctl status | grep 'user_predict_' | awk '{print $1}' | xargs supervisorctl restart")
        except Exception as e:
            logger.error(f">>>>>>>>>> uwsgi或supervisor重启失败,详细报错为{e} <<<<<<<<<<")
            return

    logger.info(">>>>>>>>>> 项目自动部署成功 <<<<<<<<<<")
相关推荐
SelectDB19 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉6 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造