GitLab CI/CDを使ったPythonアプリケーションのテストとデプロイ
この例では、Pythonアプリケーションでテストを実行し、Herokuアプリケーションとして自動的にデプロイする方法を説明します。
また、サンプルの完全なソースを表示したり、フォークすることもできます。
プロジェクトの設定
このプロジェクトの.gitlab-ci.yml
ファイルはこんな感じです:
stages:
- test
- deploy
test:
stage: test
script:
# this configures Django application to use attached postgres database that is run on `postgres` host
- export DATABASE_URL=postgres://postgres:@postgres:5432/python-test-app
- apt-get update -qy
- apt-get install -y python-dev python-pip
- pip install -r requirements.txt
- python manage.py test
staging:
stage: deploy
script:
- apt-get update -qy
- apt-get install -y ruby-dev
- gem install dpl
- dpl --provider=heroku --app=gitlab-ci-python-test-staging --api-key=$HEROKU_STAGING_API_KEY
only:
- master
production:
stage: deploy
script:
- apt-get update -qy
- apt-get install -y ruby-dev
- gem install dpl
- dpl --provider=heroku --app=gitlab-ci-python-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
only:
- tags
このプロジェクトには3つのジョブがあります:
-
test
- Django アプリケーションのテストに使用します。 -
staging
-master
ブランチにプッシュするたびにステージング環境を自動的にデプロイするために使われます。 -
production
- タグが作成されるたびに本番環境を自動的にデプロイするために使用されます。
APIキーの保存
GitLabプロジェクトのSettings > CI/CD >Environment variablesで2つの変数を作成する必要があります:
-
HEROKU_STAGING_API_KEY
- ステージングアプリのデプロイに使用するHeroku APIキー。 -
HEROKU_PRODUCTION_API_KEY
- 本番アプリのデプロイに使用するHeroku APIキー。
アカウントの管理でHeroku APIキーを見つけてください。
Herokuアプリケーションの作成
環境ごとに、新しいHerokuアプリケーションを作成する必要があります。 これはダッシュボードから行うことができます。
ランナー作成
まずDocker Engineをインストールします。
このプロジェクトをビルドするには、GitLab Runnerも必要です。gitlab.com
で公開されているランナーを使うこともできますし、自分で登録することもできます:
cat > /tmp/test-config.template.toml << EOF
[[runners]]
[runners.docker]
[[runners.docker.services]]
name = "postgres:latest"
EOF
gitlab-runner register \
--non-interactive \
--url "https://gitlab.com/" \
--registration-token "PROJECT_REGISTRATION_TOKEN" \
--description "python-3.5" \
--executor "docker" \
--template-config /tmp/test-config.template.toml \
--docker-image python:3.5
上記のコマンドで、python:3.5
イメージを使用し、PostgreSQLデータベースを使用するランナーを作成します。
PostgreSQL データベースにアクセスするには、host: postgres
にユーザーpostgres
としてパスワードなしで接続します。