CircleCI での Python アプリケーションの構成

ここでは、Python で記述されたサンプル アプリケーションを参考に、CircleCI を構成する方法について説明します。

概要

このガイドでは、Django サンプル アプリケーションを使用しながら、CircleCI 上で Python アプリケーションをビルドする場合の構成のベスト プラクティスについて説明します。 このアプリケーションは GitHub 上でホスティングされ、CircleCI 上でビルドされます。

このガイドに沿って、リポジトリをフォークし、設定ファイルを記述してみることをお勧めします。

設定ファイルの詳細

すべての CircleCI プロジェクトには、.circleci/config.yml という設定ファイルが必要です。 以下の手順に従って、完全な config.yml ファイルを作成してください。

バージョンの指定

config.yml は必ず version キーから始めます。 このキーは、互換性を損なう変更に関する警告を表示するために使用します。

version: 2

ビルド ジョブの作成

実行処理は 1 つ以上のジョブで構成されます。 この実行では ワークフローを使用しないため、build ジョブを記述する必要があります。

working_directory キーを使用して、ジョブの steps を実行する場所を指定します。 working_directory のデフォルトの値は ~/project です (project は文字列リテラル)。

version: 2
jobs:
  build:  # ワークフローを使用しない実行に必要です
    working_directory: ~/circleci-demo-python-django

Executor タイプの選択

ジョブの各ステップは Executor という仮想環境で実行されます。

この例では docker Executor を使用して、カスタム Docker イメージを指定しています。 最初に記述したイメージが、ジョブのプライマリ コンテナになります。 ジョブのすべてのコマンドがこのコンテナで実行されます。

version: 2
jobs:
  build:
    working_directory: ~/circleci-demo-python-django
    docker:
      - image: circleci/python:3.6.4  # ビルド ジョブのプライマリ コンテナ

メモ: circleci/python:3.6.4 は、CircleCI が提供するコンビニエンス イメージです。 これらのイメージは正式な Docker イメージの拡張版で、CI/CD 環境にとって便利なツールが含まれます。

他サービスの追加と環境変数の設定

データベースなどのサービス用の追加コンテナを指定します。 environment キーを使用して、コンテナ内のすべてのコマンドで使用される環境変数を設定します。

version: 2
jobs:
  build:
    working_directory: ~/circleci-demo-python-django
    docker:
      - image: circleci/python:3.6.4 # 各ジョブで Docker Executor のイメージを定義する必要があり、後続のジョブでは別のイメージを定義できます
        environment:
          PIPENV_VENV_IN_PROJECT: true
          DATABASE_URL: postgresql://root@localhost/circle_test?sslmode=disable
      - image: circleci/postgres:9.6.2 # サービス コンテナの指定方法を示す例
        environment:
          POSTGRES_USER: root
          POSTGRES_DB: circle_test

依存関係のインストール

ジョブのコンテナを選択したら、いくつかのコマンドを実行する steps を作成します。

checkout ステップを使用して、ソース コードをチェックアウトします。 デフォルトでは、working_directory で指定されたパスにソース コードがチェックアウトされます。

run ステップを使用して、bash コマンドを実行します。 この例では、Pipenv を使用して仮想環境を作成し、Python パッケージをインストールします。

version: 2
jobs:
  build:
    # ...
    steps:
      - checkout  # ソース コードを作業ディレクトリにチェックアウトします
      - run:
          command: |  # Pipenv を使用して依存関係をインストールします
            sudo pip install pipenv
            pipenv install

依存関係のキャッシュ

実行の間隔を短縮するには、依存関係またはソース コードのキャッシュを検討してください。

save_cache ステップを使用して、いくつかのファイルまたはディレクトリをキャッシュします。 この例では、仮想環境とインストールされたパッケージがキャッシュされます。

restore_cache ステップを使用して、キャッシュされたファイルまたはディレクトリを復元します。

version: 2
jobs:
  build:
    # ...
    steps:
      - checkout
      - run: sudo chown -R circleci:circleci /usr/local/bin
      - run: sudo chown -R circleci:circleci /usr/local/lib/python3.6/site-packages
      - restore_cache:  # このステップは依存関係をインストールする*前*に実行します
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
      - run:
          command: |
            sudo pip install pipenv
            pipenv install
      - save_cache:
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
          paths:
            - ".venv"
            - "/usr/local/bin"
            - "/usr/local/lib/python3.6/site-packages"

メモ: chown コマンドを使用して、依存関係の場所へのアクセスを CircleCI に許可します。

テストの実行

run ステップを使用して、テスト スイートを実行します。

version: 2
jobs:
  build:
    # ...
    steps:
      # ...
      - run:
        command: |
          pipenv run python manage.py test

テスト結果のアップロードおよび保存

store_test_results ステップを使用して、テスト結果を CircleCI にアップロードします。 この結果は、CircleCI アプリケーションのテスト サマリーセクションに表示されます。

store_artifacts ステップを使用して、テスト結果をアーティファクトとして保存します。

version: 2
jobs:
  build:
    # ...
    steps:
      # ...
      - store_test_results:
          path: test-results
      - store_artifacts:
          path: test-results
          destination: tr1

アプリケーションのデプロイ

この Django アプリケーションはどこにもデプロイされません。 デプロイの例については、Flask を使用したプロジェクトのチュートリアルまたはデプロイに関するドキュメントを参照してください。

設定ファイルの全文

version: 2 # CircleCI 2.0 を使用します
jobs: # 1 回の実行の基本作業単位
  build: # ワークフローを使用しない実行では、エントリポイントとして `build` ジョブが必要です
    # ステップが実行されるディレクトリ
    working_directory: ~/circleci-demo-python-django
    docker: # Docker でステップを実行します
      # CircleCI Python イメージは https://hub.docker.com/r/circleci/python/ で入手できます
      - image: circleci/python:3.6.4
        environment: # プライマリ コンテナの環境変数
          PIPENV_VENV_IN_PROJECT: true
          DATABASE_URL: postgresql://root@localhost/circle_test?sslmode=disable
      # CircleCI PostgreSQL イメージは https://hub.docker.com/r/circleci/postgres/ で入手できます
      - image: circleci/postgres:9.6.2
        environment: # Postgres コンテナのための環境変数
          POSTGRES_USER: root
          POSTGRES_DB: circle_test
    steps: # `build` ジョブを構成するステップ
      - checkout # ソース コードを作業ディレクトリにチェック アウトします
      - run: sudo chown -R circleci:circleci /usr/local/bin
      - run: sudo chown -R circleci:circleci /usr/local/lib/python3.6/site-packages
      - restore_cache:
      # 依存関係キャッシュについては https://circleci.com/ja/docs/2.0/caching/ をお読みください
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
      - run:
          command: |
            sudo pip install pipenv
            pipenv install
      - save_cache: # Pipfile のチェックサムをキャッシュ キーとして使用して、Python の依存関係をキャッシュします
          key: deps9-{{ .Branch }}-{{ checksum "Pipfile.lock" }}
          paths:
            - ".venv"
            - "/usr/local/bin"
            - "/usr/local/lib/python3.6/site-packages"
      - run:
          command: |
            pipenv run python manage.py test
      - store_test_results: # テスト サマリー (https://circleci.com/ja/docs/2.0/collect-test-data/) に表示するテスト結果をアップロードします
          path: test-results
      - store_artifacts: # アーティファクト (https://circleci.com/ja/docs/2.0/artifacts/) に表示するテスト サマリーをアップロードします
          path: test-results
          destination: tr1

関連項目