天天看點

Django 部落格開發教程 15 - 使用 Fabric 自動化部署

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

fabric 目前僅支援 python2,如果你的系統中隻有 python3 版本,請先安裝一個 python2 的版本,推薦安裝 python 2.7。python3 和 python2 可以共存于一個系統,是以不用擔心同時安裝兩個版本的 python 會發生沖突。

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

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

遠端連接配接伺服器。

進入項目根目錄,從遠端倉庫拉取最新的代碼。

如果項目引入了新的依賴,需要執行 <code>pip install -r requirement.txt</code> 安裝最新依賴。

如果修改或新增了項目靜态檔案,需要執行 <code>python manage.py collectstatic</code> 收集靜态檔案。

如果資料庫發生了變化,需要執行 <code>python manage.py migrate</code> 遷移資料庫。

重新開機 nginx 和 gunicorn 使改動生效。

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

fabric 腳本通常位于 fabfile.py 檔案裡,是以先在項目根目錄下建一個 fabfile.py 檔案。

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

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

② 配置一些伺服器的位址資訊和賬戶資訊,各參數的含義分别為:

env.user:用于登入伺服器的使用者名

env.password:使用者名對應的密碼

env.hosts:伺服器的 ip 位址,也可以是解析到這個 ip 的域名

env.port:ssh 遠端伺服器的端口号

③ 需要部署的項目根目錄在伺服器上的位置。

④ 通過 <code>run</code> 方法在伺服器上執行指令,傳入的參數為需要執行的指令,用字元串包裹。這裡執行了兩條指令,不同指令間用 <code>&amp;&amp;</code> 符号連接配接:

cd 指令進入到需要部署的項目根目錄

git pull 拉取遠端倉庫的最新代碼

⑤ 對應上述部署過程中 3-5 的幾條指令。因為啟用了虛拟環境,是以運作的是虛拟環境 <code>../env/bin/</code> 下的 pip 和 python

⑥ 重新開機 gunicorn 和 nginx,由于這兩條指令要在超級權限下運作,是以使用了 <code>sudo</code> 方法而不是 <code>run</code> 方法。

注意全部的腳本代碼要放在 deploy 函數裡,fabric 會自動檢測 fabfile.py 腳本中的 deploy 函數并運作。

由于腳本中有登入伺服器的使用者名和密碼等敏感資訊,不要把 fabfile.py 檔案也上傳到公開的代碼托管倉庫。

進入 fabfile.py 檔案所在的目錄,在 python2 的環境下用 fab 指令運作這個腳本檔案。

比如我的是 windows 環境,python2 安裝在 c:python27 下,那麼運作:

這時 fabric 會自動檢測到 fabfile.py 腳本中的 deploy 函數并運作,你會看到指令行輸出了一系列字元串,如果在最後看到

done. disconnecting from zmrenwu.com... done.

說明腳本運作成功。

而如果看到

aborting.

說明腳本運作中出錯,檢查一下指令行輸入的錯誤資訊,修複問題後重新運作腳本即可。以後當你在本地開發完相關功能後,隻需要執行這一個腳本檔案,就可以自動把最新代碼部署到伺服器了。

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

将問題的較長的描述通過郵件發送到 [email protected],一般會在 24 小時内回複。