RubyアプリケーションでRailsを使ってCIのためのGithubアクションを試しています。
私のセットアップは、コンテナ内のRubyビルドを実行していないVMであります。
これは私のワークフローのYMLです。ステップ "Setup Database"までエラーなしでずっと動作します。
_name: Rails CI
on:
Push:
branches:
- master
pull_request:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:10.10
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: db_test
ports:
- 5432/tcp
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
redis:
image: redis:latest
ports:
- 6379/tcp
steps:
- uses: actions/checkout@v1
- name: Set up Ruby 2.5
uses: actions/setup-Ruby@v1
with:
Ruby-version: 2.5.5
- name: Set up node 8.14
uses: actions/setup-node@v1
with:
node-version: '8.14'
- name: Setup system dependencies
run: Sudo apt-get install libpq-dev
- name: Setup App Dependencies
run: |
gem install bundler -v 1.17.3 --no-document
bundle install --jobs 4 --retry 3
npm install
npm install -g yarn
- name: Run rubocop
run: bundle exec rubocop
- name: Run brakeman
run: bundle exec brakeman
- name: Setup Database
env:
Rails_ENV: test
POSTGRES_Host: localhost
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
run: |
cp config/database.yml.ci config/database.yml
bundle exec Rails db:create
bundle exec Rails db:schema:load
- name: Run rspec
env:
Rails_ENV: test
REDIS_Host: redis
REDIS_PORT: ${{ job.services.redis.ports[6379] }}
POSTGRES_Host: localhost
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
run: bundle exec rspec --tag ~type:system
_
私はRuby、Node、画像、Postgresをサービスなどとしてインストールすることができ、RubocopとBrakemanを実行することができます。しかし、RSPECを実行する前にDBを設定しようとすると、DBに接続できないと表示されます。
私が確認できた限り、コンテナ構成とは対照的に、VM構成を実行するときにホストはlocalhostです。
これはdatabase.yml.ciです。 "データベース"ステップ "ステップ" step "ステップはRailsによって使用されるdatabase.ymlにコピーされます。
_test:
adapter: postgresql
encoding: unicode
database: db_test
pool: 5
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
Host: <%= ENV['POSTGRES_Host'] %>
_
Postgresが正しく設定され、データベースを作成するための_bundle exec Rails db:create
_ただし、次のエラーが発生します。
_Rails aborted!
PG::ConnectionBad: could not connect to server: Connection refused
Is the server running on Host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5432?
_
私はあらゆる種類のさまざまな構成を試しましたが、残念ながら、アクションはそのような知っていて、オンラインで利用可能なものがたくさんありません。
これを修正する方法についてのアイデアは?
===================:
編集:
だから私はこれを試行錯誤を通して並べ替えることができました。 Rubyとノードコンテナのドッカーイメージを使用して終了しました。これが機能構成です。
_on:
Push:
branches:
- master
pull_request:
branches:
- master
- development
- release
jobs:
build:
runs-on: ubuntu-latest
container:
image: timbru31/Ruby-node:latest
services:
postgres:
image: postgres:11
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ci_db_test
ports:
- 5432:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
chrome:
image: Selenium/standalone-chrome:latest
ports:
- 4444:4444
steps:
- uses: actions/checkout@v1
- name: Setup app dependencies
run: |
gem install bundler -v 1.17.3 --no-document
bundle install --jobs 4 --retry 3
npm install
npm install -g yarn
- name: Run rubocop
run: bundle exec rubocop
- name: Run brakeman
run: bundle exec brakeman
- name: Setup database
env:
Rails_ENV: test
POSTGRES_Host: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ci_db_test
POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
run: |
cp config/database.yml.ci config/database.yml
bundle exec Rails db:create
bundle exec Rails db:schema:load
- name: Run rspec
env:
Rails_ENV: test
POSTGRES_Host: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ci_db_test
POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }}
Selenium_URL: 'http://chrome:4444/wd/hub'
run: bundle exec rspec
_
そしてCI DB構成DATABASE.YML.CI
_default: &default
adapter: postgresql
encoding: unicode
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
Host: <%= ENV['POSTGRES_Host'] %>
pool: 5
database: <%= ENV['POSTGRES_DB'] %>
test:
<<: *default
_
あなたの問題はPostgresがポート5432に公開されていないということです。ポート番号を${{ job.services.postgres.ports[5432] }}
に置き換えるようにしてください。
ここに例があります。 https://github.com/actions/example-services/blob/master/.github/workflows/postgres-service.yml