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 腳本之前,我們先來回顧一下當我們在本地開發環境下更新了代碼後,在服務器上的整個部署過程。
- 遠程連接服務器。
- 進入項目根目錄,從遠程倉庫拉取最新的代碼。
- 如果項目引入了新的依賴,需要執行
pip install -r requirement.txt
安裝最新依賴。 - 如果修改或新增了項目靜態文件,需要執行
python manage.py collectstatic
收集靜態文件。 - 如果數據庫發生了變化,需要執行
python manage.py migrate
遷移數據庫。 - 重啟 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
方法在服務器上執行命令,傳入的參數為需要執行的命令,用字符串包裹。這裏執行了兩條命令,不同命令間用 &&
符號連接:
- cd 命令進入到需要部署的項目根目錄
- 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 教程,請訪問 追夢人物的博客 和 Python 中文社區。
最後更新:2017-06-01 21:02:21