
本文屬于 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ù)器上的整個部署過程。
- 遠(yuǎn)程連接服務(wù)器。
- 進(jìn)入項(xiàng)目根目錄,從遠(yuǎn)程倉庫拉取最新的代碼。
- 如果項(xiàng)目引入了新的依賴,需要執(zhí)行
pip install -r requirement.txt安裝最新依賴。 - 如果修改或新增了項(xiàng)目靜態(tài)文件,需要執(zhí)行
python manage.py collectstatic收集靜態(tài)文件。 - 如果數(shù)據(jù)庫發(fā)生了變化,需要執(zhí)行
python manage.py migrate遷移數(shù)據(jù)庫。 - 重啟 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í)行了兩條命令,不同命令間用 && 符號連接:
- cd 命令進(jìn)入到需要部署的項(xiàng)目根目錄
- 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。
如果遇到問題,請通過下面的方式尋求幫助。
- 在 使用 Fabric 自動化部署 的評論區(qū)留言。
- -將問題的詳細(xì)描述發(fā)布到 Python 中文社區(qū),我會在 24 小時內(nèi)為你解答。
更多Django 教程,請?jiān)L問 追夢人物的博客。