DjangoのCircleCIの設定ファイル(circle.yml)を作成する

Djangoで開発しているシステムをGitHubで管理してるんですが、自動テストするために「CircleCI」とサービス連携させてみました。

CircleCIの基本的な利用方法としては「circle.yml」という設定ファイルにビルド・テストに関する設定を記述して、その設定に基づいてビルドが実行されるというものになります。

circle.ymlという設定ファイルが存在していない場合は、CircleCI側が自動でプロジェクトをビルドしてくれるのですが、自分のDjangoのシステムでは、デフォルトのビルドだと失敗してしまいます・・・。

設定ファイルに何書けば良いかもあまり情報がなかったので、Djangoでのcircle.ymlの設定例をまとめておきます。

とりあえず、環境構築〜テスト実行・カバレッジレポート出力まで実行できるようになると思います。

設定ファイル(circle.yml)記載例

Pythonのバージョン指定

自分の好きなPythonのバージョンが使用したい場合は、バージョンを指定する必要があります。

machine:
  python:
    version: 3.5.2

タイムゾーン設定

タイムゾーンも設定必要ならば指定します。

machine:
  timezone: Asia/Tokyo

っていうか、日本語環境ならほぼ必須の設定じゃないかと・・・。

データベース設定

CircleCIではデフォルトでMySQLPostgreSQLが利用できるので、Djangoのシステム側で指定したデータベースをそのまま使えます。

データベース設定の流れとしては、「設定ファイルを上書き・差し替え」→「マイグレーションファイル作成」→「マイグレーション実行」→「差し替えファイルを元に戻す」という流れになります。

database:
  override:
#    設定ファイルを上書き
    - mv row/settings.ci.py row/settings.py
#    urls.py差し替え
    - mv sample/urls.py sample/urls.py.org
    - mv sample/urls.ci.py sample/urls.py

#    マイグレーションファイル作成
    - python ./manage.py makemigrations accounts
#    マイグレーションファイルをDBへ反映する
    - python ./manage.py migrate

#    差し替えていたurls.pyを元に戻す
    - mv sample/urls.py.org sample/urls.py

ここで大事なのは、

#    設定ファイルを上書き
    - mv sample/settings.ci.py sample/settings.py

と、

#    urls.py差し替え
    - mv sample/urls.py sample/urls.py.org
    - mv sample/urls.ci.py sample/urls.py

(省略)

#    差し替えていたurls.pyを元に戻す
    - mv sample/urls.py.org sample/urls.py

の部分です。

CircleCIではデータベースへ接続する際のユーザ名とデータベース名が決まっているので、開発に利用しているデータベースの接続情報だと接続できないので、CircleCI用の設定ファイルを作成しておいて、設定ファイルの差し替えを行います。これでCircleCI用の設定ファイルが読み込まれます。

あと、urls.pyもファイルの差し替えを行なっています。manage.pymakemigrationsコマンド実行時になぜかurls.pyのファイルを読み込んで、forms.pyのファイルまで参照してモデルが利用されているところで「テーブルが存在しません」っていうエラーが出ちゃうので、対処療法的に差し替えてます。

makemigrationsする前なんだから、テーブルが存在しないのは当たり前のような気がするんですけどね・・・。

テスト設定

Djangoのテストコード実行にCoverage.pyを利用しているので、テスト設定を上書きします。

test:
  override:
    - coverage run --source=accounts manage.py test accounts
    - coverage html
  post:
    - mv cover $CIRCLE_ARTIFACTS

テストを実行してカバレッジをHTMLで出力しています。

    - mv cover $CIRCLE_ARTIFACTS

カバレッジレポートを格納しているディレクトリを$CIRCLE_ARTIFACTSというCircleCIの環境変数のパスに移動させることでビルド画面からもカバレッジレポートが参照できるようになります。

設定ファイル(circle.yml)

設定ファイルの全体像載せておきます。コピペで使い回しできると思います。

machine:
  python:
    version: 3.5.2
  timezone: Asia/Tokyo

database:
  override:
#    設定ファイルを上書き
    - mv sample/settings.ci.py sample/settings.py
#    urls.py差し替え
    - mv sample/urls.py sample/urls.py.org
    - mv sample/urls.ci.py sample/urls.py

#    マイグレーションファイル作成
    - python ./manage.py makemigrations accounts
#    マイグレーションファイルをDBへ反映する
    - python ./manage.py migrate

#    差し替えていたurls.pyを元に戻す
    - mv sample/urls.py.org sample/urls.py
test:
  override:
    - coverage run --source=accounts manage.py test accounts
    - coverage html
  post:
    - mv cover $CIRCLE_ARTIFACTS

最後に

これで、DjangoCircleCIが使えるようになりました。ただ、これは最低限の設定なので、カスタマイズすることでいろいろできるようになると思います。

もっと詳しい情報が必要であればこちらが参考になると思います。

CircleCIを有効活用することでテスト〜デプロイまでを自動化していきたいですね。