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 教程,請訪問 追夢人物的博客

相關文章
相關標籤/搜索