15 - 使用 Fabric 自动化部署

使用 Nginx 和 Gunicorn 部署 Django 博客 中,咱们经过手工方式将代码部署到了服务器。整个过程涉及到十几条命令,输了 N 个字符。一旦咱们本地的代码有更新,整个过程又得重复来一遍,这将变得很是繁琐。javascript

使用 Fabric 能够在服务器中自动执行命令。由于整个代码部署过程都是相同的,只要咱们用 Fabric 写好部署脚本,之后就能够经过运行脚本自动完成部署了。java

安装 Fabric

Fabric 目前仅支持 Python2,若是你的系统中只有 Python3 版本,请先安装一个 Python2 的版本,推荐安装 Python 2.7。Python3 和 Python2 能够共存于一个系统,因此不用担忧同时安装两个版本的 Python 会发生冲突。python

接下就能够简单地经过 pip 命令安装 Fabric 了。注意要使用 Python2 环境下的 pip,这样才能把 Fabric 安装到 Python2 环境下。nginx

pip install fabric复制代码

部署过程回顾

在写 Fabric 脚本以前,咱们先来回顾一下当咱们在本地开发环境下更新了代码后,在服务器上的整个部署过程。git

  1. 远程链接服务器。
  2. 进入项目根目录,从远程仓库拉取最新的代码。
  3. 若是项目引入了新的依赖,须要执行 pip install -r requirement.txt 安装最新依赖。
  4. 若是修改或新增了项目静态文件,须要执行 python manage.py collectstatic 收集静态文件。
  5. 若是数据库发生了变化,须要执行 python manage.py migrate 迁移数据库。
  6. 重启 Nginx 和 Gunicorn 使改动生效。

整个过程就是这样,把每一步操做翻译成 Fabric 对应的脚本代码,这样一个自动化部署脚本就完成了。github

编写 Fabric 脚本

Fabric 脚本一般位于 fabfile.py 文件里,所以先在项目根目录下建一个 fabfile.py 文件。数据库

根据上述过程编写的脚本代码以下:django

blogproject/fabfile.py

from fabric.api import env, run
from fabric.operations import sudo

GIT_REPO = "you git repository" ① 

env.user = 'you host username' ②
env.password = 'you host password'

# 填写你本身的主机对应的域名
env.hosts = ['demo.zmrenwu.com']

# 通常状况下为 22 端口,若是非 22 端口请查看你的主机服务提供商提供的信息
env.port = '22'


def deploy():
    source_folder = '/home/yangxg/sites/zmrenwu.com/django-blog-tutorial' ③

    run('cd %s && git pull' % source_folder) ④
    run(""" cd {} && ../env/bin/pip install -r requirements.txt && ../env/bin/python3 manage.py collectstatic --noinput && ../env/bin/python3 manage.py migrate """.format(source_folder)) ⑤ 
    sudo('restart gunicorn-demo.zmrenwu.com') ⑥
    sudo('service nginx reload')复制代码

① 你的代码托管仓库地址。api

② 配置一些服务器的地址信息和帐户信息,各参数的含义分别为:服务器

  • env.user:用于登陆服务器的用户名
  • env.password:用户名对应的密码
  • env.hosts:服务器的 IP 地址,也能够是解析到这个 IP 的域名
  • env.port:SSH 远程服务器的端口号

③ 须要部署的项目根目录在服务器上的位置。

④ 经过 run 方法在服务器上执行命令,传入的参数为须要执行的命令,用字符串包裹。这里执行了两条命令,不一样命令间用 && 符号链接:

  1. cd 命令进入到须要部署的项目根目录
  2. git pull 拉取远程仓库的最新代码

⑤ 对应上述部署过程当中 3-5 的几条命令。由于启用了虚拟环境,因此运行的是虚拟环境 ../env/bin/ 下的 pip 和 python

⑥ 重启 Gunicorn 和 Nginx,因为这两条命令要在超级权限下运行,因此使用了 sudo 方法而不是 run 方法。

注意所有的脚本代码要放在 deploy 函数里,Fabric 会自动检测 fabfile.py 脚本中的 deploy 函数并运行。

因为脚本中有登陆服务器的用户名和密码等敏感信息,不要把 fabfile.py 文件也上传到公开的代码托管仓库。

执行 Fabric 自动部署脚本

进入 fabfile.py 文件所在的目录,在 Python2 的环境下用 fab 命令运行这个脚本文件。

好比个人是 Windows 环境,Python2 安装在 C:\Python27\ 下,那么运行:

C:\Python27\Scripts\fab deploy复制代码

这时 Fabric 会自动检测到 fabfile.py 脚本中的 deploy 函数并运行,你会看到命令行输出了一系列字符串,若是在最后看到

Done.
Disconnecting from zmrenwu.com... done.

说明脚本运行成功。

而若是看到

Aborting.
Disconnecting from zmrenwu.com... done.

说明脚本运行中出错,检查一下命令行输入的错误信息,修复问题后从新运行脚本便可。之后当你在本地开发完相关功能后,只须要执行这一个脚本文件,就能够自动把最新代码部署到服务器了。

总结

本章节的代码位于:Step15: deploy automatically using fabric

若是遇到问题,请经过下面的方式寻求帮助。

  • 使用 Fabric 自动化部署 的评论区留言。
  • 将问题的详细描述经过邮件发送到 djangostudyteam@163.com,通常会在 24 小时内回复。

更多Django 教程,请访问 追梦人物的博客

相关文章
相关标签/搜索