使用 Fabric 自動化部署 Django

DjangoBlog.jpg

本文屬于 Django 博客開發(fā)教程系列文章,全套教程的目錄索引請?jiān)?Django 博客開發(fā)教程目錄索引(全 26 篇) 中獲取。

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

使用 Fabric 可以在服務(wù)器中自動執(zhí)行命令。因?yàn)檎麄€代碼部署過程都是相同的,只要我們用 Fabric 寫好部署腳本,以后就可以通過運(yùn)行腳本自動完成部署了。

安裝 Fabric

Fabric 目前僅支持 Python2,如果你的系統(tǒng)中只有 Python3 版本,請先安裝一個 Python2 的版本,推薦安裝 Python 2.7。Python3 和 Python2 可以共存于一個系統(tǒng),所以不用擔(dān)心同時安裝兩個版本的 Python 會發(fā)生沖突。

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

pip install fabric

部署過程回顧

在寫 Fabric 腳本之前,我們先來回顧一下當(dāng)我們在本地開發(fā)環(huán)境下更新了代碼后,在服務(wù)器上的整個部署過程。

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

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

編寫 Fabric 腳本

Fabric 腳本通常位于 fabfile.py 文件里,因此先在項(xiàng)目根目錄下建一個 fabfile.py 文件。

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

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'

# 填寫你自己的主機(jī)對應(yīng)的域名
env.hosts = ['demo.zmrenwu.com']

# 一般情況下為 22 端口,如果非 22 端口請查看你的主機(jī)服務(wù)提供商提供的信息
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')

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

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

  • env.user:用于登錄服務(wù)器的用戶名
  • env.password:用戶名對應(yīng)的密碼
  • env.hosts:服務(wù)器的 IP 地址,也可以是解析到這個 IP 的域名
  • env.port:SSH 遠(yuǎn)程服務(wù)器的端口號

③ 需要部署的項(xiàng)目根目錄在服務(wù)器上的位置。

④ 通過 run 方法在服務(wù)器上執(zhí)行命令,傳入的參數(shù)為需要執(zhí)行的命令,用字符串包裹。這里執(zhí)行了兩條命令,不同命令間用 && 符號連接:

  1. cd 命令進(jìn)入到需要部署的項(xiàng)目根目錄
  2. git pull 拉取遠(yuǎn)程倉庫的最新代碼

⑤ 對應(yīng)上述部署過程中 3-5 的幾條命令。因?yàn)閱⒂昧颂摂M環(huán)境,所以運(yùn)行的是虛擬環(huán)境 ../env/bin/ 下的 pip 和 python

⑥ 重啟 Gunicorn 和 Nginx,由于這兩條命令要在超級權(quán)限下運(yùn)行,所以使用了 sudo 方法而不是 run 方法。

注意全部的腳本代碼要放在 deploy 函數(shù)里,F(xiàn)abric 會自動檢測 fabfile.py 腳本中的 deploy 函數(shù)并運(yùn)行。

由于腳本中有登錄服務(wù)器的用戶名和密碼等敏感信息,不要把 fabfile.py 文件也上傳到公開的代碼托管倉庫。

執(zhí)行 Fabric 自動部署腳本

進(jìn)入 fabfile.py 文件所在的目錄,在 Python2 的環(huán)境下用 fab 命令運(yùn)行這個腳本文件。

比如我的是 Windows 環(huán)境,Python2 安裝在 C:\Python27\ 下,那么運(yùn)行:

C:\Python27\Scripts\fab deploy

這時 Fabric 會自動檢測到 fabfile.py 腳本中的 deploy 函數(shù)并運(yùn)行,你會看到命令行輸出了一系列字符串,如果在最后看到

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

說明腳本運(yùn)行成功。

而如果看到

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

說明腳本運(yùn)行中出錯,檢查一下命令行輸入的錯誤信息,修復(fù)問題后重新運(yùn)行腳本即可。以后當(dāng)你在本地開發(fā)完相關(guān)功能后,只需要執(zhí)行這一個腳本文件,就可以自動把最新代碼部署到服務(wù)器了。

總結(jié)

本章節(jié)的代碼位于:Step15: deploy automatically using fabric。

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

更多Django 教程,請?jiān)L問 追夢人物的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 本節(jié)內(nèi)容 Python介紹 發(fā)展史 Python 2 or 3? 安裝 Hello World程序 變量 用戶輸入...
    小小不懂11閱讀 3,548評論 2 30
  • 22年12月更新:個人網(wǎng)站關(guān)停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,437評論 22 257
  • App開發(fā)規(guī)范 一.項(xiàng)目結(jié)構(gòu) 隨著MVP設(shè)計(jì)模式的流行,就默認(rèn)采用下面兩種項(xiàng)目結(jié)構(gòu). 適合小項(xiàng)目 app——App...
    會理發(fā)的店小二閱讀 1,770評論 2 10
  • 1早上在清邁見到了兩位來自西藏的喇嘛師父,很慈悲。約好下午去寺院放生。于是趁中午空閑時臨摹了這幅樹屋。大概不到一小...
    語靜然閱讀 596評論 3 1

友情鏈接更多精彩內(nèi)容