天天看点

Django 博客开发教程 15 - 使用 Fabric 自动化部署

使用 fabric 可以在服务器中自动执行命令。因为整个代码部署过程都是相同的,只要我们用 fabric 写好部署脚本,以后就可以通过运行脚本自动完成部署了。

fabric 目前仅支持 python2,如果你的系统中只有 python3 版本,请先安装一个 python2 的版本,推荐安装 python 2.7。python3 和 python2 可以共存于一个系统,所以不用担心同时安装两个版本的 python 会发生冲突。

接下就可以简单地通过 pip 命令安装 fabric 了。注意要使用 python2 环境下的 pip,这样才能把 fabric 安装到 python2 环境下。

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

远程连接服务器。

进入项目根目录,从远程仓库拉取最新的代码。

如果项目引入了新的依赖,需要执行 <code>pip install -r requirement.txt</code> 安装最新依赖。

如果修改或新增了项目静态文件,需要执行 <code>python manage.py collectstatic</code> 收集静态文件。

如果数据库发生了变化,需要执行 <code>python manage.py migrate</code> 迁移数据库。

重启 nginx 和 gunicorn 使改动生效。

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

fabric 脚本通常位于 fabfile.py 文件里,因此先在项目根目录下建一个 fabfile.py 文件。

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

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

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

env.user:用于登录服务器的用户名

env.password:用户名对应的密码

env.hosts:服务器的 ip 地址,也可以是解析到这个 ip 的域名

env.port:ssh 远程服务器的端口号

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

④ 通过 <code>run</code> 方法在服务器上执行命令,传入的参数为需要执行的命令,用字符串包裹。这里执行了两条命令,不同命令间用 <code>&amp;&amp;</code> 符号连接:

cd 命令进入到需要部署的项目根目录

git pull 拉取远程仓库的最新代码

⑤ 对应上述部署过程中 3-5 的几条命令。因为启用了虚拟环境,所以运行的是虚拟环境 <code>../env/bin/</code> 下的 pip 和 python

⑥ 重启 gunicorn 和 nginx,由于这两条命令要在超级权限下运行,所以使用了 <code>sudo</code> 方法而不是 <code>run</code> 方法。

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

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

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

比如我的是 windows 环境,python2 安装在 c:python27 下,那么运行:

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

done. disconnecting from zmrenwu.com... done.

说明脚本运行成功。

而如果看到

aborting.

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

如果遇到问题,请通过下面的方式寻求帮助。

将问题的详细描述通过邮件发送到 [email protected],一般会在 24 小时内回复。