avatarLin Po-An

总结

本文介绍了如何在Django项目中集成Travis CI进行自动化测试,以确保代码质量并防止不合格的代码合并到主分支。

摘要

文章作者在因为合并了导致单元测试失败的PR后,决定为GitHub仓库配置CI(持续集成)工具,以便在代码合并前自动运行测试。作者选择了Travis CI,并详细描述了配置过程。Travis CI对开源项目是免费的,但对私有仓库需要付费,不过学生可以申请免费教育方案。

配置Travis CI的关键步骤包括在Travis CI网站和GitHub上进行认证和权限设置,以及编写.travis.yml配置文件。作者通过多次尝试和参考他人配置,最终创建了一个适用于他们项目的配置文件。该配置文件指定了Python版本、使用PostgreSQL数据库服务、环境变量、安装依赖、运行代码格式和质量检查(如pep8和flake8),以及执行Django测试。

作者还强调了在配置Travis CI时需要注意的几点,包括正确设置数据库以及创建专门的travis_settings.py文件来配置Django的数据库设置,以便在CI环境中使用。

经过多次尝试和错误,作者成功地配置了Travis CI,并修复了历史代码中的问题。尽管这个过程有些复杂,但作者认为自动化测试能够提高代码质量,并计划将来配合自动部署,以便代码合并后能够自

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: python
python:
  - "2.7"
services:
  - postgresql
env:
  global:
    DJANGO_SETTINGS_MODULE="<your_travis_settings>"
  matrix:
    - DJANGO=1.9 DB=postgres
install:
  - pip install -q Django==$DJANGO
  - pip install pep8
  - pip install flake8
  - pip install -q -r requirement.txt
before_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 postgres
script:
  - 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:
  - postgresql
env:
  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_testpostgres 需要跟 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 要寫好就是了 ><,現在的覆蓋率感覺還是挺不足的,嘆。

Travis Ci
Github
Django
Recommended from ReadMedium