隨著手上的 django 專案越來越大,就會遇到改了 A 功能以後 B 功能爛掉的情況。這時候測試的重要性就顯露出來了。
雖然 django 自己有 Unit Test 功能,但是要每個人在 commit 前都手動跑一次測試有點太勉強,總是可能會有忘記測試,結果 commit 爛掉的 code 上去的機會。所以把測試的工作丟給 gitlab-ci,讓每次 push 的時候 gitlab 都能自動跑 django 的 Unit test,並把測試結果吐到 Slack 上面會是比較方便的作法。
要使用 gitlab-ci 自動測試,需要完成以下步驟:
- 編寫 django 的 Unit test
- 安裝/註冊一台或多台 gitlab-ci-runner,用來執行測試
- 編輯專案根目錄的
.gitlab-ci.yml
設定檔
編寫 django 的 Unit test
可參考 django 關於測試的文件
安裝/註冊 gitlab-ci-runner
- 先到 gitlab 專案頁面,點選右上角的齒輪圖示,選取「Runners」。會在這個頁面看到 gitlab 提供給 runner 註冊的 URL 以及 token
- 我用來跑 runner 的機器是 Ubuntu,可參考這份文件安裝 gitlab-ci-runner
- 裝好後執行 gitlab-ci-runner,會提示您輸入剛剛看到的 URL 和 token
- 然後根據您需要設定其他項目,在這邊我選用 docker 環境來執行測試。gitlab-ci 會在 runner 上跑一個 docker 環境,把您的 django 專案丟到這個環境內測試。所以也會需要在 runner 上安裝好 docker。
安裝/註冊成功後,會在 gitlab 的 Runners 頁面看到剛剛註冊的 runner:
編輯 .gitlab-ci.yml
再來編輯 .gitlab-ci.yml 設定檔,這個設定檔定義了 gitlab-ci 要幫你做什麼,範例如下:
# 使用 python 3.4 的 docker image 來建立 docker 環境 image: python:3.4 # 定義 unit test unit_test: script: # 執行 ./shell/install.sh 設定系統環境 - sh ./shell/install.sh # 指定 django 設定檔,並執行 django unit test - export DJANGO_SETTINGS_MODULE=official_web.settings.test && python3 manage.py test -k when: on_success
./shell/install.sh
的內容如下,我在這個檔案定義了 runner 在啟動 docker 之後、執行 django unit test 之前需要做些什麼:
#!/usr/bin/env bash echo "********************************************" echo "***************** Install ******************" echo "********************************************" # 先更新系統 apt-get -y update echo "********************************************" echo "************** Run apt-get *****************" echo "********************************************" # 用 apt-get 安裝必要的套件 apt-get -y install ca-certificates python3-dev libssl-dev netcat libmysqlclient-dev python3-pip mysql-client echo "********************************************" echo "************* Run pip install **************" echo "********************************************" # 根據專案目錄下的 requirements.txt 安裝 python 套件 pip install -r requirements.txt
這樣設定好之後,push 上 gitlab 就會在專案的「Pipelines」→「Builds」看到測試的狀況,如果測試成功就會在這個 Build 及 Pipeline 看到 passed 的標誌:
如果另外還有在 gitlab 設定和 Slack 的整合,Build 的結果也會一起吐到 Slack 上面。