Travis CI with Django
因為近期開發的專案中,不小心 merge 到了一個造成 unit test 不會過的 PR,所以就下定決心幫我們的 Github repo 裝個 CI,讓我們的 test 可以被跑過才能 merge。Github 推薦的 CI 第一名就是 Travis CI,所以就看了一下怎麼用。
Travis CI 最大的好處就是免費了!但,只有對 open source 免費。很不幸的,那個專案剛好是 private 的 repo,還好後來發現有免費教育方案,趁自己還是學生的時候,就申請來看看(不然他一個月收費也是真的有夠貴的…)。
基本設定上還算蠻簡單的,就是在他們的網頁和 Github 上來回點一點,把各種權限打開,就開通了。主要的重點是要寫一個 .travis.yml 檔案,把你的 travis 設定寫上去。
昨天各種 trial and errors 之後,參考別人的設定檔再亂改之後,我弄出的 .travis.yml 大致上是長這樣:
language: pythonpython:
- "2.7"services:
- postgresqlenv:
global:
DJANGO_SETTINGS_MODULE="<your_travis_settings>"
matrix:
- DJANGO=1.9 DB=postgresinstall:
- pip install -q Django==$DJANGO
- pip install pep8
- pip install flake8
- pip install -q -r requirement.txtbefore_script:
# E123/E133, E226 and E241/E242 are default ignores
# E402: module level import not at top of file
# E501: max length > 79
# W503: ignore operators after line break until pep8 is upgraded - "pep8 --exclude=migrations --ignore=E123,E133,E226,E241,E242,E402,E501,W503 ./"
- "flake8 --exclude=migrations --ignore=E123,E133,E226,E241,E242,E402,E501,W503 ./"
- psql -c 'create database travis_ci_test;' -U postgresscript:
- cd PointServer/ && python manage.py test我只針對我們現上機的環境做模擬,所以基本上就是 django 1.9 + postgres db + python 2.7。除了跑 manage.py test 以外,還讓他們先做些語法檢查,跑了 pep8 跟 flake8(順帶一提,昨天才知道有 flake8 這種好東西,發現原本的 code 裡有各種白痴錯誤或瑕痴都沒被發現)。
這邊大概是第一次跑語法檢查的慘況:

雖然平常 sublime 已經有裝了 pep8 的 linter 了,還是有很多不符格式的地方。在 flake8 之下更慘,抓到一堆沒用到的 import 和 local variable。
設定過程中,在 DB 那邊錯了好幾次。查了一下發現,要讓 db 可以用,需要以下設定:
services:
- postgresqlenv:
global:
DJANGO_SETTINGS_MODULE="<your_travis_settings>"before_script:
- psql -c 'create database travis_ci_test;' -U postgres- services: 這個要設定,travis 才會幫你開啟那個 DB 的 process。因為我們線上機是用 postgressql ,所以就是先設定他。
- env: 這邊是重點,也是在 travis 官網上比較沒找到的。因為 django 會去抓 setting 檔的 DB 設定,我們的習慣上有一個
production_settings.py在裡面設定我們線上機要用的 DB 。除此之外還有一個develop_settings.py供我們開發中使用。所以我的做法是,再創立一個travis_settings.py專門給 travis 使用。然後就是記得讓 travis 的去改環境變數DJANGO_SETTINGS_MODULE(原本的話,django 會在 manage.py 去調這個環境變數),讓他們去找到這個 file。 - before_script: 最後就是記得讓 travis 創立 DB,需要注意的是,這邊的
travis_ci_test跟postgres需要跟travis_settings.py裡面的設定一致,分別是 db 的 name 跟 user。
最後就是我們的 travis_settings.py :
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2','NAME': 'travis_ci_test',
'USER': 'postgres',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '',
},
}
昨天大概 trial & error 了十幾次才弄成功,呼。雖然沒有很麻煩但也是有一點複雜,尤其跟 django 整合的那一塊。除此之外,把歷史的爛 code 修復也是花了不少時間,而且果不其然,強迫 push 進 develop 之後,現有的 PR 全部爛成一片,苦。不過想想以後 code 都可以被自動測試過,心裡就比較踏實。之後也想再配合自動 deploy,最好是 PR 一被 merge 就可以自動被放上線。不過要達成這樣的話,就是 test 要寫好就是了 ><,現在的覆蓋率感覺還是挺不足的,嘆。




