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(">>>>>>>>>> 项目自动部署成功 <<<<<<<<<<")
相关推荐
Lsir10110_20 分钟前
【Linux】进程信号(下半)
linux·运维·服务器
skywalk816337 分钟前
unbound dns解析出现问题,寻求解决之道
运维·服务器·dns·unbound
酉鬼女又兒38 分钟前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面40 分钟前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
skywalk816342 分钟前
走近科学:unbound dns域名服务器自己本地解析出现问题,寻求解决之道
运维·服务器·dns·unbound
袁煦丞 cpolar内网穿透实验室1 小时前
远程调试内网 Kafka 不再求运维!cpolar 内网穿透实验室第 791 个成功挑战
运维·分布式·kafka·远程工作·内网穿透·cpolar
wqq63108551 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Q_Q19632884751 小时前
python大学生爱心校园互助代购网站_nyvlx_django Flask vue pycharm项目
python·django·flask
AZ996ZA1 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php
神梦流2 小时前
GE 引擎的非标准数据流处理:稀疏张量与自定义算子在图优化中的语义保持
linux·运维·服务器