2.0 プロジェクトのチュートリアル
このチュートリアルのデモ アプリケーションでは、バックエンド用に Python と Flask を使用し、 データベース用に PostgreSQL を使用します。 データベース用に PostgreSQL を使用します。
以下の各セクションでは、デモ アプリケーション用にジョブとステップを設定する方法、CircleCI 環境で Selenium と Chrome を使用して単体テストおよびインテグレーション テストを実行する方法、デモ アプリケーションを Heroku にデプロイする方法について詳しく説明します。
デモ アプリケーションのソースは、GitHub の https://github.com/CircleCI-Public/circleci-demo-python-flask で入手できます。 また、このサンプル アプリケーションは、 https://circleci-demo-python-flask.herokuapp.com/ で入手できます。
基本的なセットアップ
通常、 .circleci/config.yml
ファイルは、複数の ジョブ
で構成されます。 この例では、build
という名前のジョブが 1 つ含まれています。 1 つのジョブは複数の steps
で構成されます。steps とは、ファイル内の最初の image:
キーで定義されたコンテナ内で実行されるコマンドです。 この最初のイメージは、プライマリコンテナとも呼ばれます。
以下は、CircleCI デモプロジェクトの最もシンプルな例です。すべての設定が build
ジョブの下にネストされています。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: pip install -r requirements/dev.txt
注: .circleci/config.yml
内で ワークフローを使用しない場合、以下を含む build
という名前のジョブを記述している必要があります。
- 上記の例では
docker
として定義されています。 - イメージは Docker イメージです。 上記の例では、CircleCI によって提供される Debian Stretch 上の Python 3.6.2 を含み、テストをサポートするためにブラウザーがインストールされています。
- 必須の
checkout
ステップで始まり、その後run:
キーが続く steps。 プライマリ コンテナ上でコマンドが順次実行されます。
サービス コンテナ
ジョブでデータベースなどのサービスが必要な場合は、docker:
スタンザに image:
をリストすることで、追加コンテナとしてサービスを実行できます。
Docker イメージは通常、環境変数を使用して設定されています。必要であれば、コンテナに渡す環境変数のセットも利用できます。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://root@localhost/circle_test?sslmode=disable
- image: cimg/postgres:14.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: testuser
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
プライマリ コンテナの環境変数は、Flask フレームワークに固有の設定ファイルを設定し、circleci/postgres:9.6.5-alpine-ram
サービス コンテナで実行されるデータベースを参照するデータベース URL も設定します。 localhost
では PostgreSQL データベースが使用可能です。
circleci/postgres:9.6.5-alpine-ram
サービス コンテナが、パスワードが空の root
という名前のユーザー、および circle_test
という名前のデータベースで設定されています。
依存関係のインストール
次に、ジョブは pip install
を実行することにより、Python の依存関係をプライマリ コンテナにインストールします。 依存関係は、以下のシェル コマンドを実行する通常の steps を実行することにより、プライマリ コンテナにインストールされます。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable
- image: cimg/postgres:14.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: testuser
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
steps:
- checkout
- run:
name: Install Python deps in a venv
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements/dev.txt
たとえば以下のように、run:
キーで定義した環境変数は、イメージレベルの変数よりも優先されます。
- run:
command: echo ${FLASK_CONFIG}
environment:
FLASK_CONFIG: staging
依存関係のキャッシュ
ジョブを高速化するために、デモの設定では、Python virtualenv を CircleCI キャッシュに置き、pip install
を実行する前にそのキャッシュを復元します。 先に virtualenv をキャッシュに置いておけば、依存関係が既に存在するため、pip install
コマンドは依存関係を virtualenv にダウンロードする必要がありません。 virtualenv をキャッシュに保存するには、pip install
コマンドの後に実行される save_cache
ステップを使用して実行します。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable
- image: cimg/postgres:9.6.5
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: ubuntu
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
steps:
- checkout
- restore_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
- run:
name: Install Python deps in a venv
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements/dev.txt
- save_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
paths:
- "venv"
以下で、追加のキー変数について詳しく説明します。
-
restore_cache:
ステップでは、キー テンプレートに一致するキーを持つキャッシュを検索します。 キー テンプレートはdeps1-
で始まり、{{ .Branch }}
を使用して現在のブランチ名が埋め込まれています。requirements.txt
ファイルのチェックサムも、{{ checksum "requirements/dev.txt" }}
を使用してキー テンプレートに埋め込まれています。 CircleCI は、テンプレートに一致する最新のキャッシュを復元します。 このとき、キャッシュが保存されたブランチ、およびキャッシュされた virtualenv の作成に使用されたrequirements/dev.txt
ファイルのチェックサムが一致する必要があります。 -
Python deps を venv にインストール
という名前のrun:
ステップは、前述のとおり、Python の依存関係をインストールする仮想環境を作成してアクティブ化します。 -
save_cache:
ステップは、指定されたパス (この例ではvenv
) からキャッシュを作成します。 キャッシュキーは、key:
で指定したテンプレートから作成されます。 このとき、CircleCI で保存されたキャッシュがrestore_cache:
ステップで検出できるように、必ずrestore_cache:
ステップと同じテンプレートを使用してください。 キャッシュを保存する前に、CircleCI はテンプレートからキャッシュ キーを生成します。 生成されたキーに一致するキャッシュが既に存在する場合、CircleCI は新しいキャッシュを保存しません。 テンプレートにはブランチ名とrequirements/dev.txt
のチェックサムが含まれるため、ジョブが別のブランチで実行されるか、requirements/dev.txt
のチェックサムが変化すると、CircleCI は新しいキャッシュを作成します。
キャッシュの詳細については、 こちらのドキュメントをご覧ください。
Selenium のインストールと実行によるブラウザーテストの自動化
デモ アプリケーションには、Chrome、Selenium、および WebDriver を使用して Web ブラウザー内でアプリケーションのテストを自動化する tests/test_selenium.py
ファイルが含まれています。 プライマリイメージには、動作が安定した最新バージョンの Chrome がプリインストールされています (-browsers
サフィックスで指定されています)。 Selenium はプライマリイメージに含まれていないため、インストールして実行する必要があります。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable
- image: cimg/postgres:9.6.5
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: ubuntu
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
steps:
- checkout
- run: mkdir test-reports
- run:
name: Download Selenium
command: |
curl -O http://selenium-release.storage.googleapis.com/3.5/selenium-server-standalone-3.5.3.jar
- run:
name: Start Selenium
command: |
java -jar selenium-server-standalone-3.5.3.jar -log test-reports/selenium.log
background: true
テストの実行
このデモ アプリケーションでは、仮想の Python 環境が準備されており、unittest を使用してテストが実行されます。 テスト結果を XML ファイルとして保存するために、unittest-xml-reporting
を使用します。 レポートと結果は store_artifacts
ステップと store_test_results
ステップで保存されます。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable
- image: cimg/postgres:9.6.5
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: ubuntu
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
steps:
- checkout
- run: mkdir test-reports
- run:
name: Download Selenium
command: |
curl -O http://selenium-release.storage.googleapis.com/3.5/selenium-server-standalone-3.5.3.jar
- run:
name: Start Selenium
command: |
java -jar selenium-server-standalone-3.5.3.jar -log test-reports/selenium.log
background: true
- restore_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
- run:
name: Install Python deps in a venv
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements/dev.txt
- save_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
paths:
- "venv"
- run:
command: |
. venv/bin/activate
python manage.py test
- store_artifacts:
path: test-reports/
destination: tr1
- store_test_results:
path: test-reports/
追加されたキーに関するメモ
- 各コマンドは新しいシェルで実行されます。 したがって、依存関係のインストール ステップでアクティブ化された仮想環境は、この最終
run:
キーの. venv/bin/activate
で再度アクティブ化されます。 store_artifacts
ステップは特別なステップです。path:
は、ファイルが格納されるディレクトリをプロジェクトのroot
ディレクトリからの相対ディレクトリで指定します。destination:
は、ジョブ内の別のステップで同じ名前のディレクトリにアーティファクトが生成される場合に、一意性を確保するために選択されるプレフィックスを指定します。 CircleCI は、アーティファクトを収集し、S3 にアップロードして格納します。- ジョブが完了すると、アーティファクトは CircleCI の [Artifacts (アーティファクト)] タブに表示されます。
- 結果ファイルのパスは、プロジェクトの
root
ディレクトリからの相対パスです。 デモ アプリケーションでは、アーティファクトの格納に使用されたものと同じディレクトリを使用していますが、別のディレクトリも使用できます。 ジョブが完了すると、CircleCI でテスト タイミングが分析され、[Test Summary (テスト サマリー)] タブに概要が表示されます。
詳しくは、「 ビルド アーティファクトの保存および「 テスト メタデータの収集」を参照してください。
Heroku へのデプロイ
このデモの .circleci/config.yml
には、master
ブランチを Heroku にデプロイする deploy
ジョブが含まれています。 deploy
ジョブは、1 つの checkout
ステップと 1 つの command
で構成されています。 command
は、以下が準備されていることを前提としています。
- Heroku アカウントが作成されている
- Heroku アプリケーションが作成されている
HEROKU_APP_NAME
とHEROKU_API_KEY
の環境変数が設定されている
上記のいずれか 1 つでも完了していない場合は、 ドキュメントの手順に従って下さい。
メモ: このデモ プロジェクトをフォークする場合は、Heroku プロジェクトの名前を変更すると、このチュートリアルで使用する名前空間と干渉しないように Heroku をデプロイできます。
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable
- image: cimg/postgres:9.6.5
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: ubuntu
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
steps:
- checkout
- restore_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
- run:
name: Install Python deps in a venv
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements/dev.txt
- save_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
paths:
- "venv"
- run:
command: |
. venv/bin/activate
python manage.py test
- store_artifacts:
path: test-reports/
destination: tr1
- store_test_results:
path: test-reports/
deploy:
steps:
- checkout
- run:
name: Deploy Master to Heroku
command: |
git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git master
< https://circleci.com/gh/CircleCI-Public/circleci-demo-python-flask/23> でデモ アプリケーションをビルドしてデプロイするまでのプロセスを確認できます。
Heroku に関するその他の設定
デモ アプリケーションは、config.py
と manage.py
の設定内容に基づき、Heroku 上で実行されるように設定されています。 この 2 つのファイルはアプリケーションに対して、本番設定を使用し、PostgreSQL データベースを移行し、Heroku 上で SSL を使用するように指示します。
Heroku ではその他に以下のファイルが必要です。
Procfile
: Heroku にデモ アプリケーションの実行方法を指示します。runtime.txt
: Heroku に、デフォルト (Python 2.7.13) の代わりに Python 3.6.0 を使用するように指示します。requirements.txt
: このファイルが存在する場合、Heroku は Python の依存関係を自動的にインストールします。
Heroku の環境用にアプリケーションを設定するには、 Heroku のドキュメントを参照してください。
実際にデプロイする前に、以下のコマンドを使用して Heroku 上にこのデモ アプリケーションを手動でビルドできます。
heroku create circleci-demo-python-flask # これを一意の名前に置き換えます
heroku addons:create heroku-postgresql:hobby-dev
heroku config:set FLASK_CONFIG=heroku
git push heroku master
heroku run python manage.py deploy
heroku restart
ワークフローを使用したデプロイの自動化
master
のビルドが成功した後、Heroku に自動的に master
をデプロイするには、workflows
セクションを追加して build
ジョブと deploy
ジョブをリンクさせます。
workflows:
version: 2
build-deploy:
jobs:
- build
- deploy:
requires:
- build
filters:
branches:
only: master
version: 2
jobs:
build:
docker:
- image: cimg/python:3.6.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
FLASK_CONFIG: testing
TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable
- image: cimg/postgres:9.6.5
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: ubuntu
POSTGRES_DB: circle_test
POSTGRES_PASSWORD: ""
steps:
- checkout
- restore_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
- run:
name: Install Python deps in a venv
command: |
python3 -m venv venv
. venv/bin/activate
pip install -r requirements/dev.txt
- save_cache:
key: deps1-{{ .Branch }}-{{ checksum "requirements/dev.txt" }}
paths:
- "venv"
- run:
command: |
. venv/bin/activate
python manage.py test
- store_artifacts:
path: test-reports/
destination: tr1
- store_test_results:
path: test-reports/
deploy:
steps:
- checkout
- run:
name: Deploy Master to Heroku
command: |
git push https://heroku:$HEROKU_API_KEY@git.heroku.com/$HEROKU_APP_NAME.git master
関連項目
ワークフローの詳細については、「 ワークフローを使用したジョブのスケジュール」を参照してください。
ドキュメントの改善にご協力ください
このガイドは、CircleCI の他のドキュメントと同様にオープンソースであり、 GitHub でご利用いただけます。 ご協力いただき、ありがとうございます。
- このページの編集をご提案ください (最初に「コントリビューションガイド」をご覧ください)。
- ドキュメントの問題点を報告する、またはフィードバックやコメントを送信するには、GitHub で issue を作成してください。
- CircleCI は、ユーザーの皆様の弊社プラットフォームにおけるエクスペリエンスを向上させる方法を常に模索しています。 フィードバックをお寄せいただける場合は、リサーチコミュニティにご参加ください。
サポートが必要ですか
CircleCI のサポートエンジニアによる、サービスに関する問題、請求およびアカウントについての質問への対応、設定の構築に関する問題解決のサポートを行っています。 サポートチケットを送信して、CircleCI のサポートエンジニアにお問い合わせください。日本語でお問い合わせいただけます。
または、 サポートサイト から、サポート記事やコミュニティフォーラム、トレーニングリソースをご覧いただけます。
CircleCI Documentation by CircleCI is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.