aoishiの備忘録

備忘録

CircleCI 2.0でDjangoの自動テスト環境を構築する

はじめに

Djangoで作成したWebアプリケーションをCircle CI2.0で自動テストできるようにしてみました。#

環境

また、事前に下記が済んでいることを前提とします。

方法

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

Djangosettings.pyの分割と構造化については下記を参考にしています。

tokibito.hatenablog.com

基本的な設定は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が用意しているイメージ以外も利用可能なようです。

# 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の内容が実行時間とともに一覧で表示されます。

f:id:akihisa_oishi:20171112183819p:plain

また、各ステップの箇所の実行結果が確認できます。下記はrun testsの実行結果になります。 まだテストを書いていないので何も表示されていません。

f:id:akihisa_oishi:20171112215205p:plain

まとめ

CircleCI 2.0でDjangoの自動テスト環境を構築してみました。

下記は課題として追加調査して内容更新します。

  • CircleCIで自動テストが実行されるブランチを指定・制限する。