web-dev-qa-db-ja.com

GitHub ActionsのPostgresへの接続方法

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
_
23
Rui Freitas

あなたの問題はPostgresがポート5432に公開されていないということです。ポート番号を${{ job.services.postgres.ports[5432] }}に置き換えるようにしてください。

ここに例があります。 https://github.com/actions/example-services/blob/master/.github/workflows/postgres-service.yml

0
Sigurd Ljødal