閱讀364 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Django 博客開發教程 15 - 使用 Fabric 自動化部署

使用 Nginx 和 Gunicorn 部署 Django 博客 中,我們通過手工方式將代碼部署到了服務器。整個過程涉及到十幾條命令,輸了 N 個字符。一旦我們本地的代碼有更新,整個過程又得重複來一遍,這將變得非常繁瑣。

使用 Fabric 可以在服務器中自動執行命令。因為整個代碼部署過程都是相同的,隻要我們用 Fabric 寫好部署腳本,以後就可以通過運行腳本自動完成部署了。

安裝 Fabric

Fabric 目前僅支持 Python2,如果你的係統中隻有 Python3 版本,請先安裝一個 Python2 的版本,推薦安裝 Python 2.7。Python3 和 Python2 可以共存於一個係統,所以不用擔心同時安裝兩個版本的 Python 會發生衝突。

接下就可以簡單地通過 pip 命令安裝 Fabric 了。**注意要使用 Python2 環境下的 pip,這樣才能把 Fabric 安裝到 Python2 環境下。**

pip install fabric

部署過程回顧

在寫 Fabric 腳本之前,我們先來回顧一下當我們在本地開發環境下更新了代碼後,在服務器上的整個部署過程。

  1. 遠程連接服務器。
  2. 進入項目根目錄,從遠程倉庫拉取最新的代碼。
  3. 如果項目引入了新的依賴,需要執行 pip install -r requirement.txt 安裝最新依賴。
  4. 如果修改或新增了項目靜態文件,需要執行 python manage.py collectstatic 收集靜態文件。
  5. 如果數據庫發生了變化,需要執行 python manage.py migrate 遷移數據庫。
  6. 重啟 Nginx 和 Gunicorn 使改動生效。

整個過程就是這樣,把每一步操作翻譯成 Fabric 對應的腳本代碼,這樣一個自動化部署腳本就完成了。

編寫 Fabric 腳本

Fabric 腳本通常位於 fabfile.py 文件裏,因此先在**項目根目錄**下建一個 fabfile.py 文件。

根據上述過程編寫的腳本代碼如下:

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')

① 你的代碼托管倉庫地址。

② 配置一些服務器的地址信息和賬戶信息,各參數的含義分別為:

  • 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

如果遇到問題,請通過下麵的方式尋求幫助。

更多Django 教程,請訪問 追夢人物的博客Python 中文社區

最後更新:2017-06-01 21:02:21

  上一篇:go  阿裏巴巴 Java 開發手冊之工程規約(四)-------我的經驗(逐步完善中)
  下一篇:go  Django 博客開發教程 14 - 使用 Nginx 和 Gunicorn 部署 Django 博客