概述

前端打包完成之后需要上传到服务器,怎么上传呢?可以先上传到 github,然后在远程服务器上面拉取,最后打包上线。但是这样很麻烦,使用 fabric 可以很简单的一键部署。我根据自己的使用经验,把 fabric 的部署过程记录下来,供以后开发时参考,相信对其他人也有用。

注意:我使用的是 fabric3

参考文件:

fabric 文档

fabric operations

fabric 介绍

fabric3 的安装略,请自己 google。

fabric3 我们主要使用这三个模块:业务(Operation)上下文管理器装饰器 以及 实用工具

业务(Operation)模块

业务模块中有我们需要在 fabric 里面运行的各种函数,比如 run()/sudo() 等。

我们使用下面的方式引入业务模块中的函数(local, put, run等):

from fabric.operations import local, put, run

下面我们来简要介绍一下业务模块中的函数,如果想要了解具体使用方法,请查看文档

  1. get(): 从远程主机下载一个或多个文件
  2. local(): 在本地 bash 里面运行一个命令
  3. run(): 在远程主机上执行 shell 命令
  4. sudo(): 在远程主机上使用超级用户权限执行 shell 命令
  5. put(): 上传文件到远程主机上面
  6. open_shell(): Invoke a fully interactive shell on the remote end.
  7. prompt(): Prompt user with text and return the input
  8. reboot(): Reboot the remote system.
  9. require(): Check for given keys in the shared environment dict and abort if not found.

注意,如果 run() 加了 quiet=True 则表示隐藏全部输出,示例如下:

run('mkdir deploy', quiet=True)

上下文管理器

上下文管理器模块中有我们切换上下文所需要的各种函数,比如 cd()/prefix() 等。

我们使用下面的方式引入上下文管理器模块中的函数(cd等):

from fabric.context_managers import cd

下面我们来简要介绍一下上下文管理器模块中常用的函数,如果想要了解具体使用方法,请查看文档

  1. cd(): 切换远程主机上的路径,所有在 cd() 函数里面的 run, sudo, get, or put 都会被自动加上 "cd <path> && " 前缀。
  2. lcd(): 类似 cd(),只不过 cd() 适用于远程主机;lcd() 适用于本地。
  3. prefix(): Prefix all wrapped run/sudo commands with given command plus &&

示例如下:

with cd('/path/to/app'):
with prefix('workon myvenv'):
run('./manage.py syncdb')
run('./manage.py loaddata myfixture')

相当于:

$ cd /path/to/app && workon myvenv && ./manage.py syncdb
$ cd /path/to/app && workon myvenv && ./manage.py loaddata myfixture

装饰器模块

装饰器模块中有我们可以使用的各种装饰器,比如 hosts() 等。

我们使用下面的方式引入装饰器模块中的函数(hosts等):

from fabric.api import hosts

下面我们来简要介绍一下装饰器模块中的常用函数,如果想要了解具体使用方法,请查看文档

  1. hosts(): 该装饰器用于指定被装饰的函数执行在那台主机或哪些主机列表上。

注意:如果不在控制台覆盖相关参数的话,将会在 host1、host2 以及 host3 上执行 my_func,并且在 host1 和 host3 上都指定了登录用户。示例如下:

@hosts('user1@host1', 'host2', 'user2@host3')
def my_func():
pass

实用工具

实用工具模块中有我们可以使用的各种工具函数,比如 abort() 等。

我们使用下面的方式引入实用工具模块中的函数(abort):

from fabric.api import abort

下面我们来简要介绍一下实用工具模块中的常用函数,如果想要了解具体使用方法,请查看文档

  1. abort(): 终止执行,向 stderr 输入错误信息 msg 并退出

示例如下:

from __future__ import with_statement
from fabric.api import local, settings, abort
from fabric.contrib.console import confirm def test():
with settings(warn_only=True):
result = local('./manage.py test my_app', capture=True)
if result.failed and not confirm("Tests failed. Continue anyway?"):
abort("Aborting at user request.")

fabric 文件示例

下面是 fabric 文件的示例:

# -*- coding: utf-8 -*-

from fabric.api import hosts
from fabric.context_managers import cd
from fabric.operations import run @hosts('xxxxxxxxxxxx')
def deploy():
project_dir = 'xxxxxxxxxxxx'
deploy_project_dir = 'xxxxxxxxxxxx'
with cd(project_dir):
run('git pull')
run('npm run build')
with cd(deploy_project_dir):
run(f'cp -r {project_dir}/dist dist_staging')
run('rm -rf dist_bak')
run('mv dist dist_bak')
run('rm -rf dist')
run('mv dist_staging dist') def fallback():
deploy_project_dir = 'xxxxxxxxxxxxxxxx'
with cd(deploy_project_dir):
run(f'cp -r dist_bak dist_staging')
run('rm -rf dist_bak')
run('mv dist dist_bak')
run('rm -rf dist')
run('mv dist_staging dist')

需要注意的是:

  1. 上面的代码对打包后的文件做了备份,然后可以通过使用备份来回退
  2. 上面的代码在远程主机进行打包的,也可以在本地打包然后用 put() 上传
  3. 可以在 run() 里面开启静默模式

然后直接在当前目录里面运行下列命令就可以使用啦:

fab deploy
fab fallback

fabric 的一个坑

fabric 读取环境变量的时候只会读 .bash_profile 里面的环境变量,所以如果在执行 fabric 的时候碰到 没有xxx命令 的情况,就把相关的环境变量写到 .bash_profile 里面去吧~~~

前端使用 fabric 进行部署的更多相关文章

  1. 使用 Fabric 自动化部署 Django 项目

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在上一篇教程中,我们通过手工方式将代码部署到了服务器.整个过程涉及到十几条命令,输了 ...

  2. Jenkins 实现前端自动打包,自动部署代码及邮件提醒功能

    在之前的公司,我们前端使用webpack构建项目,项目构建完成后,我们会使用ftp或linux的一些命令工具上传我们的文件到服务器上,这种方式虽然是可以,但是最近面试的时候,人家会问我前端如何部署项目 ...

  3. PyTorch专栏(六): 混合前端的seq2seq模型部署

    欢迎关注磐创博客资源汇总站: http://docs.panchuang.net/ 欢迎关注PyTorch官方中文教程站: http://pytorch.panchuang.net/ 专栏目录: 第一 ...

  4. 002_HyperLedger Fabric安装部署

    上一次我们把HyperLedger Fabric的环境全部搭建好了,下面开始正式的HyperLedger Fabric安装部署 首先需要安装编译工具gcc,用命令yum install -y gcc安 ...

  5. 在Service Fabric上部署Java应用,体验一把微服务的自动切换

    虽然Service Fabric的Java支持版本还没有正式发布,但是Service Fabric本身的服务管理.部署.升级等功能是非常好用的,那么Java的开发者可以如何利用上Service Fab ...

  6. fabric自动化部署django

    使用fabric部署django应用 使用fabric部署django应用 本文是我的网站易读中文网自动化部署的脚本实现,以下代码在ubuntu和debian中测试通过 由于网站使用的是python技 ...

  7. 前端工程之CDN部署

    之前发的一篇文章<变态的静态资源缓存与更新>中提到了静态资源和页面部署之间的时间间隙问题,这个问题会迫使前端静态资源发布必须采用非覆盖式. 那篇文章中没有详细解释为什么会产生不可忍受的时间 ...

  8. Jenkins结合shell脚本实现(gitLab/gitHub)前端项目自动打包部署服务器

    原始发布部署: 石器时代的我们,先是本地打包好项目,在去服务器上把原来的文件删了,然后回到本地copy到服务器: 这操看起来简单,实际部署的人就知道多烦了,假如来几个项目都要重新发布:那就爽了: 今天 ...

  9. fabric 自动化部署

    fabric 项目发布和运维的工作相当机械,频率还蛮高,导致时间浪费在敲大量重复的命令上. 修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A ...

随机推荐

  1. 十二,k8s集群访问控制之RBAC授权

    目录 角色访问控制RBAC (Role-Based Access Control) 常用的授权插件: RBAC控制: role 和 clusterrole rolebinding 和 clusterr ...

  2. Linux下计划任务:crontab 命令的权限说明

    Linux下的计划任务: 使用crontab命令来执行调度,在 Linux 下可以通过创建文件 /etc/cron.allow 或者 /etc/cron.deny 来控制权限,如果 /etc/cron ...

  3. linux基础—课堂随笔_03 SHELL脚本编程基础

    shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then条件为真的分 ...

  4. 牛客小白月赛12 D 月月给华华出题 (欧拉函数,数论,线筛)

    链接:https://ac.nowcoder.com/acm/contest/392/D 来源:牛客网 月月给华华出题 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K, ...

  5. java8学习之BiFunction函数式接口实例演示&Predicate函数式接口详解

    BiFunction函数式接口: 在上次中已经对BiFunction接口进行了初步的认识,这里对它进一步学习,这里打算新建一个Person实体,然后新建若干个Person的实例存放在集合中,最后再根据 ...

  6. linux下进程间通信的机制

    今天突然想起了nginx解决惊群的方法,就是在多个进程间利用锁来保证同一时刻只能有一个worker进程在自己的epoll中加入监听的句柄,那么进程间是怎么共享变量的呢,下面就介绍一下共享内存 共享内存 ...

  7. 页面初次渲染loading图

    当第一次进入页面时,可能由于网速或其他原因请求接口需要等待很长时间,这是页面一片空白,很难看,切交互性也不好,这是,我们常常放上一个loading等待图给用户以反馈 // 页面尚未加载时的loadin ...

  8. python面向对象基础(二)反射

    1.反射 前言 如何动态输入一个模块名,可以随时访问到导入模块中的方法或者变量? in= input(“请输入你想导入的模块名:”) CC = __import__(in) #這种方式就是通过输入字符 ...

  9. prop(name|properties|key,value|fn)

    prop(name|properties|key,value|fn) 概述 获取在匹配的元素集中的第一个元素的属性值.直线电机选型 随着一些内置属性的DOM元素或window对象,如果试图将删除该属性 ...

  10. Python 特点

    优点 简单 -- Python 是一种代表简单主义思想的语言.阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python 的这种伪代码本质是它最大的优点之一.它 ...