データベースの設定例
このドキュメントでは、PostgreSQL/Rails および MySQL/Ruby を使用したデータベースの config.yml ファイルの設定例を紹介します。
structure.sql を使用した Rails アプリケーション用の CircleCI 設定例
structure.sql
ファイルを使用して設定した Rails アプリケーションを移行する場合は、psql
が PATH の場所にインストールされ、適切な権限が設定されていることを確認してください。これは、cimg/ruby:3.0-node イメージには psql がデフォルトでインストールされておらず、pg
gem を使用してデータベースにアクセスするためです。
version: 2
jobs:
build:
working_directory: ~/circleci-demo-ruby-rails
# Primary container image where all commands run
docker:
- image: cimg/ruby:2.6-node
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
RAILS_ENV: test
PGHOST: 127.0.0.1
PGUSER: root
# Service container image available at `host: localhost`
- image: cimg/postgres:14.0
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: testuser
POSTGRES_DB: circle-test_test
steps:
- checkout
# Restore bundle cache
- restore_cache:
keys:
- rails-demo-{{ checksum "Gemfile.lock" }}
- rails-demo-
# Bundle install dependencies
- run:
name: Install dependencies
command: bundle check --path=vendor/bundle || bundle install --path=vendor/bundle --jobs 4 --retry 3
- run: sudo apt install -y postgresql-client || true
# Store bundle cache
- save_cache:
key: rails-demo-{{ checksum "Gemfile.lock" }}
paths:
- vendor/bundle
- run:
name: Database Setup
command: |
bundle exec rake db:create
bundle exec rake db:structure:load
- run:
name: Parallel RSpec
command: bin/rails test
# Save artifacts
- store_test_results:
path: /tmp/test-results
注: 現在のイメージを拡張して独自のイメージをビルドする方法もあります。その場合には必要なパッケージをインストールし、コミットしてから、Docker ハブなどのレジストリにプッシュしてください。
環境のセットアップ例
複数のビルド済みイメージやカスタム イメージが使用されることがあるため、データベースの設定は明示的に宣言する必要があります。 たとえば、Rails は以下の順序でデータベース URL の使用を試みます。
- DATABASE_URL 環境変数 (設定されている場合)
config.yml
ファイル内の該当する環境の test セクションの設定 (通常、テスト スイートではtest
)。
この順序の具体例を以下に示します。ここでは、イメージの environment
設定を組み合わせると共に、シェル コマンドに environment
設定を追加してデータベース接続を有効にしています。
version: 2
jobs:
build:
working_directory: ~/appName
docker:
- image: cimg/ruby:2.6
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
PG_HOST: localhost
PG_USER: ubuntu
RAILS_ENV: test
RACK_ENV: test
# The following example uses the official postgres 9.6 image, you may also use cimg/postgres:9.6
# which includes a few enhancements and modifications. どちらのイメージも使用できます。
- image: cimg/postgres:14.0
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: ubuntu
POSTGRES_DB: db_name
steps:
- checkout
- run:
name: Install Ruby Dependencies
command: bundle install
- run:
name: Set up DB
command: |
bundle exec rake db:create db:schema:load --trace
bundle exec rake db:migrate
environment:
DATABASE_URL: "postgres://ubuntu@localhost:5432/db_name"
この例では、PostgreSQL 9.6のデフォルトユーザーとポートとして、 $DATABASE_URL
を指定しています。 バージョン 9.5では、デフォルトのポートが 5432 ではなく 5433 になっています。 他のポートを指定するには、$DATABASE_URL
と psql
の呼び出し箇所をすべて変更します。
Go アプリケーションと PostgreSQL の設定例
以下の設定例に関する詳しい説明や、アプリケーションのパブリックコードリポジトリについては、 Go 言語ガイドを参照してください。
version: 2
jobs:
build:
docker:
# CircleCI Go images available at: https://circleci.com/developer/images/image/cimg/go
- image: cimg/go:1.12
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
# CircleCI PostgreSQL images available at: https://circleci.com/developer/images/image/cimg/postgres
- image: cimg/postgres:14.0
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
environment:
POSTGRES_USER: circleci-demo-go
POSTGRES_DB: circle_test
environment:
TEST_RESULTS: /tmp/test-results
steps:
- checkout
- run: mkdir -p $TEST_RESULTS
- restore_cache:
keys:
- go-mod-v1-{{ checksum "go.sum" }}
- run:
name: Get dependencies
command: |
go get -v
- run:
name: Get go-junit-report for setting up test timings on CircleCI
command: |
go get github.com/jstemmer/go-junit-report
# Remove go-junit-report from go.mod
go mod tidy
# Wait for Postgres to be ready before proceeding
- run:
name: Waiting for Postgres to be ready
command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run:
name: Run unit tests
environment: # environment variables for the database url and path to migration files
CONTACTS_DB_URL: "postgres://circleci-demo-go@localhost:5432/circle_test?sslmode=disable"
CONTACTS_DB_MIGRATIONS: /home/circleci/project/db/migrations
command: |
trap "go-junit-report <${TEST_RESULTS}/go-test.out > ${TEST_RESULTS}/go-test-report.xml" EXIT
make test | tee ${TEST_RESULTS}/go-test.out
- run: make
- save_cache:
key: go-mod-v1-{{ checksum "go.sum" }}
paths:
- "/go/pkg/mod"
- run:
name: Start service
environment:
CONTACTS_DB_URL: "postgres://circleci-demo-go@localhost:5432/circle_test?sslmode=disable"
CONTACTS_DB_MIGRATIONS: /home/circleci/project/db/migrations
command: ./workdir/contacts
background: true
- run:
name: Validate service is working
command: |
sleep 5
curl --retry 10 --retry-delay 1 -X POST --header "Content-Type: application/json" -d '{"email":"test@example.com","name":"Test User"}' http://localhost:8080/contacts
- store_artifacts:
path: /tmp/test-results
destination: raw-test-output
- store_test_results:
path: /tmp/test-results
MYSQL プロジェクトの例
以下の例では、PHP コンテナと共に、MYSQL をセカンダリコンテナとしてセットアップしています。
MySQL をプライマリかつ唯一のコンテナにすることもできますが、この例ではそのようにしていません。 より実践的なユース ケースとして、この例では PHP Docker イメージをプライマリ コンテナとして使用し、MySQL が起動してから、データベースに関連する run
コマンドを実行しています。
データベースが起動したら、mysql
クライアントをプライマリ コンテナにインストールします。これで、プロジェクトのルートにあるとしたダミー データ sql-data/dummy.sql
に接続してインポートするコマンドを実行できます。 このダミー データには、例として一連の SQL コマンドが格納されています。
DROP TABLE IF EXISTS `Persons`;
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
INSERT INTO Persons
VALUES (
1,
"Foo",
"Baz",
"123 Bar Street",
"FooBazBar City"
);
関連項目
サービスイメージやデータベースのテストステップの使用に関するひと通りの知識を、 データベースの設定で紹介しています。