在 使用 Nginx 和 Gunicorn 部署 Django 博客 中,咱們經過手工方式將代碼部署到了服務器。整個過程涉及到十幾條命令,輸了 N 個字符。一旦咱們本地的代碼有更新,整個過程又得重複來一遍,這將變得很是繁瑣。javascript
使用 Fabric 能夠在服務器中自動執行命令。由於整個代碼部署過程都是相同的,只要咱們用 Fabric 寫好部署腳本,之後就能夠經過運行腳本自動完成部署了。java
Fabric 目前僅支持 Python2,若是你的系統中只有 Python3 版本,請先安裝一個 Python2 的版本,推薦安裝 Python 2.7。Python3 和 Python2 能夠共存於一個系統,因此不用擔憂同時安裝兩個版本的 Python 會發生衝突。python
接下就能夠簡單地經過 pip 命令安裝 Fabric 了。注意要使用 Python2 環境下的 pip,這樣才能把 Fabric 安裝到 Python2 環境下。nginx
pip install fabric複製代碼
在寫 Fabric 腳本以前,咱們先來回顧一下當咱們在本地開發環境下更新了代碼後,在服務器上的整個部署過程。git
pip install -r requirement.txt
安裝最新依賴。python manage.py collectstatic
收集靜態文件。python manage.py migrate
遷移數據庫。整個過程就是這樣,把每一步操做翻譯成 Fabric 對應的腳本代碼,這樣一個自動化部署腳本就完成了。github
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
② 配置一些服務器的地址信息和帳戶信息,各參數的含義分別爲:服務器
③ 須要部署的項目根目錄在服務器上的位置。
④ 經過 run
方法在服務器上執行命令,傳入的參數爲須要執行的命令,用字符串包裹。這裏執行了兩條命令,不一樣命令間用 &&
符號鏈接:
⑤ 對應上述部署過程當中 3-5 的幾條命令。由於啓用了虛擬環境,因此運行的是虛擬環境 ../env/bin/
下的 pip 和 python
⑥ 重啓 Gunicorn 和 Nginx,因爲這兩條命令要在超級權限下運行,因此使用了 sudo
方法而不是 run
方法。
注意所有的腳本代碼要放在 deploy 函數裏,Fabric 會自動檢測 fabfile.py 腳本中的 deploy 函數並運行。
因爲腳本中有登陸服務器的用戶名和密碼等敏感信息,不要把 fabfile.py 文件也上傳到公開的代碼託管倉庫。
進入 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。
若是遇到問題,請經過下面的方式尋求幫助。
更多Django 教程,請訪問 追夢人物的博客。