简体   繁体   English

GitHub Actions:如何在 GithHub Actions 中连接到 Postgres

[英]GitHub Actions: How to connect to Postgres in GithHub Actions

I am trying GitHub Actions for CI with a Ruby on Rails application.我正在使用 Ruby on Rails 应用程序尝试 GitHub Actions for CI。

My setup is with VM, not running the Ruby build in a container.我的设置是使用 VM,而不是在容器中运行 Ruby 构建。

This is my workflow yml.这是我的工作流程 yml。 It runs all the way without errors until the step "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

I am able to install ruby, node, the images, Postgres as a service, etc, and run Rubocop and Brakeman.我能够安装 ruby​​、节点、图像、Postgres 作为服务等,并运行 Rubocop 和 Brakeman。 But when I try to set up the DB before running Rspec it says it cannot connect to the DB.但是当我在运行 Rspec 之前尝试设置数据库时,它说它无法连接到数据库。

As far as I've been able to ascertain, the host is localhost when running the VM configuration as opposed to a container configuration.据我所知,在运行 VM 配置而不是容器配置时,主机是 localhost。

This is the database.yml.ci that the "Setup Database" step copies to the database.yml to be used by Rails.这是 database.yml.ci,“Setup Database”步骤复制到 database.yml 以供 Rails 使用。

test:
  adapter: postgresql
  encoding: unicode
  database: db_test
  pool: 5
  username: <%= ENV['POSTGRES_USER'] %>
  password: <%= ENV['POSTGRES_PASSWORD'] %>
  host: <%= ENV['POSTGRES_HOST'] %>

I expected Postgres to be correctly set up and bundle exec rails db:create to create the database.我希望 Postgres 能够正确设置并bundle exec rails db:create来创建数据库。 However, it throws the following error:但是,它会引发以下错误:

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?

I've tried all sorts of different configurations, but unfortunately, Actions is sort of knew and there doesn't seem to be a lot of material available online.我尝试了各种不同的配置,但不幸的是,Actions 有点了解,而且网上似乎没有很多可用的材料。

Any ideas on how to fix this?有想法该怎么解决这个吗?

=========================== ============================

EDIT:编辑:

So I was able to sort this out through trial and error.所以我能够通过反复试验来解决这个问题。 I ended up using a docker image with a ruby and node container.我最终使用了带有 ruby​​ 和 node 容器的 docker 镜像。 This is the working configuration:这是工作配置:

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

And the CI DB configuration database.yml.ci和 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

I have a slightly different setup but this was the most relevant question when I encountered the same error so wanted to post here in case it can help.我的设置略有不同,但是当我遇到相同的错误时,这是​​最相关的问题,因此想在此处发布以防万一。 The two things that were critical for me were: 1) Set the DB_HOST=localhost 2) Set the --network="host" argument when you start the docker container with your rails app对我来说至关重要的两件事是:1) 设置DB_HOST=localhost 2) 在使用 Rails 应用程序启动--network="host"容器时设置--network="host"参数

name: Master Build

on: [push]

env:
  registry: my_registry_name
  # Not sure these are actually being passed down to rails, set them as the default in database.yml
  DB_HOST: localhost
  DB_USERNAME: postgres
  DB_PASSWORD: postgres

jobs:
  my_image_test:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:latest
        env:
          POSTGRES_DB: postgres        
          POSTGRES_PASSWORD: postgres
          POSTGRES_USER: postgres
        ports:
          - 5432:5432
        # Set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - name: Check out repository
        uses: actions/checkout@v2
      - name: Build my_image docker image
        uses: whoan/docker-build-with-cache-action@v5
        with:
          username: "${{secrets.aws_ecr_access_key_id}}"
          password: "${{secrets.aws_ecr_secret_access_key}}"
          registry: "${{env.registry}}"
          image_name: my_image
          context: my_image
      - name: Lint rubocop
        working-directory: ./my_image
        run: docker run $registry/my_image bundle exec rubocop
      - name: Run rails tests
        working-directory: ./my_image
        run: docker run --network="host" $registry/my_image bash -c "RAILS_ENV=test rails db:create && RAILS_ENV=test rails db:migrate && rails test"

Your problem appears to be that Postgres is not exposed on port 5432. Try to replace the port number with ${{ job.services.postgres.ports[5432] }} .您的问题似乎是 Postgres 未在端口${{ job.services.postgres.ports[5432] }}上公开。尝试将端口号替换为${{ job.services.postgres.ports[5432] }}

There are examples here: https://github.com/actions/example-services/blob/master/.github/workflows/postgres-service.yml这里有例子: https : //github.com/actions/example-services/blob/master/.github/workflows/postgres-service.yml

I had this challenger when trying to set up GitHub actions for a Rails Application.我在尝试为 Rails 应用程序设置 GitHub 操作时遇到了这个挑战者。

Here's what worked for me :这是对我有用的

name: Ruby

on:
  push:
    branches:
    - main
  pull_request:
    branches:
    - main

jobs:
  test:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        ruby-version:
        - '2.7.2'
        node-version:
        - '12.22'
        database-name:
        - my-app
        database-password:
        - postgres
        database-user:
        - postgres
        database-host:
        - 127.0.0.1
        database-port:
        - 5432

    services:
      postgres:
        image: postgres:latest
        env:
          POSTGRES_DB: ${{ matrix.database-name }}
          POSTGRES_USER: ${{ matrix.database-user }}
          POSTGRES_PASSWORD: ${{ matrix.database-password }}
        ports:
          - 5432:5432
        # Set health checks to wait until postgres has started
        options:
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
    - name: Check out Git Repository
      uses: actions/checkout@v2

    - name: Set up Ruby, Bundler and Rails
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby-version }}
        bundler-cache: true # runs 'bundle install' and caches installed gems automatically

    - name: Set up Node
      uses: actions/setup-node@v1
      with:
        node-version: ${{ matrix.node-version }}

    - name: Install packages
      run: |
        yarn install --check-files

    - name: Setup test database
      env:
        RAILS_ENV: test
        DATABASE_NAME_TEST: ${{ matrix.database-name }}
        DATABASE_USER: ${{ matrix.database-user }}
        DATABASE_PASSWORD: ${{ matrix.database-password }}
        DATABASE_HOST: ${{ matrix.database-host }}
        DATABASE_PORT: ${{ matrix.database-port }}
        POSTGRES_DB: ${{ matrix.database-name }}
      run: |
        bundle exec rails db:migrate
        bundle exec rails db:seed

Note :注意

  1. Replace my-app with the name of your app.my-app替换为您的应用程序名称。
  2. You can leave the database-password and database-user as postgres您可以将database-passworddatabase-user保留为postgres

That's all.就这样。

I hope this helps我希望这有帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM