CircleCI 2.0でDjangoの自動テスト環境を構築する
はじめに
Djangoで作成したWebアプリケーションをCircle CI2.0で自動テストできるようにしてみました。#
環境
- Django 1.11.5
- CircleCI 2.0
- Python 3.6.1 (circleci/python:3.6.1 DockerImage利用)
- MySQL 5.7 (circleci/mysql:5.7 DockerImage利用)
また、事前に下記が済んでいることを前提とします。
方法
CI環境用のDjango設定ファイル作成
CircleCI環境用のDjangoの設定ファイルを作成します。
ここでは、mysite/settings/ci.py
にCircleCI環境用の設定を作成し、 下記のように設定ファイルを切り替えてDjangoの管理コマンドを実行できるようにします。
python manage.py makemigrations --settings mysite.settings.ci python manage.py migrate --settings mysite.settings.ci python manage.py test --settings mysite.settings.ci python manage.py runserver --settings mysite.settings.ci
Djangoのsettings.py
の分割と構造化については下記を参考にしています。
基本的な設定はmysite/settings/base.py
に記載しておき、下記のようにmysite/settings/ci.py
内でimportしてDATABASES
など環境依存な箇所の設定を書き換えます。
from mysite.settings.base import * # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True WSGI_APPLICATION = 'mysite.wsgi.develop.application' ALLOWED_HOSTS = ['*'] # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'circle_test', 'USER': 'root', 'PASSWORD': '', 'HOST': '127.0.0.1', 'PORT': 3306, 'OPTIONS': { 'charset': 'utf8mb4', }, } }
CircleCIの設定ファイル作成
.circleci/config.yml
に下記の内容でファイルを作成します。
設定ファイルの記載方法や、コンテナイメージについては下記を参考にします。
CircleCIが用意しているイメージ以外も利用可能なようです。
- Language Guide: Python - CircleCI
- Using Pre-Built CircleCI Docker Images - CircleCI
- Configuring Databases - CircleCI
# CircleCI 2.0 を利用する version: 2 jobs: build: # Dockerコンテナを利用する docker: # 後続に記載するstepsを実行するメインとなるDockerコンテナを指定する - image: circleci/python:3.6.1 # 上記のメインとなるDockerコンテナが依存するDockerコンテナを指定する(Databaseなど) - image: circleci/mysql:5.7 command: | mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci environment: MYSQL_DATABASE: circle_test MYSQL_USER: root MYSQL_ROOT_HOST: "%" MYSQL_ALLOW_EMPTY_PASSWORD: yes working_directory: ~/repo steps: # リポジトリのコードを working_directory にチェックアウト - checkout # requirements.txtに変更がなければ、以前作成したPython仮想環境を復元 - restore_cache: keys: - v1-dependencies-{{ checksum "requirements.txt" }} # fallback to using the latest cache if no exact match is found - v1-dependencies- # 現在のrequirements.txtに基づきPython仮想環境を作成または更新 - run: name: install dependencies command: | python3 -m venv venv . venv/bin/activate pip install -r requirements.txt # Python仮想環境を保管 - save_cache: paths: - ./venv key: v1-dependencies-{{ checksum "requirements.txt" }} # dockerizeのインストール - run: name: install dockerize command: | [ ! -f /usr/local/bin/dockerize ] && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz true environment: DOCKERIZE_VERSION: v0.5.0 # mysqlコンテナの起動待機 - run: name: Wait for db command: dockerize -wait tcp://localhost:3306 -timeout 1m # データベースのテーブルの作成などの初期化(データベースはコンテナ初期化時に作成される) - run: name: initialize db command: | . venv/bin/activate python manage.py makemigrations --settings mysite.settings.ci python manage.py migrate --settings mysite.settings.ci # テストの実行 - run: name: run tests command: | . venv/bin/activate python manage.py test --settings mysite.settings.ci # テスト結果の報告 - store_artifacts: path: test-reports destination: test-reports
リポジトリへpushして自動テスト実行
上記の内容をGithubのリポジトリにpushすることで、CircleCIがフックされ.circleci/config.yml
に応じたテストが自動実行されます。
下記のように、steps
の内容が実行時間とともに一覧で表示されます。
また、各ステップの箇所の実行結果が確認できます。下記はrun tests
の実行結果になります。
まだテストを書いていないので何も表示されていません。
まとめ
CircleCI 2.0でDjangoの自動テスト環境を構築してみました。
下記は課題として追加調査して内容更新します。
- CircleCIで自動テストが実行されるブランチを指定・制限する。