結論から
最初に完成版を先に提示するとこうなりました。
name: Verify
# This workflow is triggered on pushes to the repository.
on: [push]
jobs:
build:
# Job name is Greeting
name: verify
# This job runs on Linux
runs-on: ubuntu-latest
services:
postgres:
image: postgres:12
ports:
- 5432:5432
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: test
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
container:
image: ruby:2.5.3
env:
RAILS_ENV: test
POSTGRES_HOST: postgres
RAILS_DATABASE_USER: postgres
RAILS_DATABASE_PASSWORD: password
steps:
- name: checkout
uses: actions/checkout@v2
- name: bundler set up
run: |
gem install bundler
bundle install
- name: install node
uses: actions/setup-node@v1
with:
node-version: '12'
- name: db migrate
run: |
bundle exec rails db:migrate
- name: verify
run: |
bundle exec rubocop
bundle exec rspec
postgresの構築
処理順番として先にpostgresを立てて、その後にrailsが駆動するようにしています。
service:
postgres:
image: postgres:12
ports:
- 5432:5432
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: test
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
ここのoptionでヘルスチェックをして問題なければ、railsの構築処理に進むようになっています。
postgresのイメージを使っているのですが、パスワードの未指定or空文字列を受け付けてないので必ず指定しましょう。
rails の環境構築
- bundlerをインストール
- bundlerでgemをインストール
- DBをmigration
- テスト、lintを実行
上記の順序で作業が行われます。
ただrailsを環境構築する場合、ruby と jsを実行、解析できる環境が必要になるので、
- name: install node
uses: actions/setup-node@v1
with:
node-version: '12'
の部分でnodeを導入しています。
postgres連携
container:
image: ruby:2.5.3
env:
RAILS_ENV: test
POSTGRES_HOST: postgres
RAILS_DATABASE_USER: postgres
RAILS_DATABASE_PASSWORD: password
DBmigrationのために環境変数をrailsに対して色々設定しています。
名前解決
POSTGRES_HOST: postgres
は接続するpostgresのホストを名前解決しています。
この右側のpostgres
と言う文字列は、postgresの構築で出てきた、
service直下のやつを指定しています。
こんな感じでservice名を指定することで名前解決をできたりします。
左のPOSTGRES_HOST
はrailsのdatabase.ymlの使用したい環境のhostでどの環境変数が使われているかを確認して、
変えるようにしましょう。
環境指定
RAILS_ENVを指定することで、railsをどの環境で動かすかを指定します。
今回はテストを動かしたいため、testと指定しています。
その他の環境変数
当たり前ですが、 env:以下に環境変数を色々追加できるので、
実行時に必要となる環境変数を書きましょう。
ただし、外部へのAPIキーなど機密性が高いものに関しては secretを活用しましょう。
終わりに
railsを初めて触ったのですが、DB - Railsの名前解決にやたらと時間がかかりました。
また、やっつけ仕事で作ったのでキャッシュなどはまだやってないので時間が開けば追加したいと思います。