繁体   English   中英

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

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

我正在使用 Ruby on Rails 应用程序尝试 GitHub Actions for CI。

我的设置是使用 VM,而不是在容器中运行 Ruby 构建。

这是我的工作流程 yml。 它一直运行而没有错误,直到步骤“设置数据库”。

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​​、节点、图像、Postgres 作为服务等,并运行 Rubocop 和 Brakeman。 但是当我在运行 Rspec 之前尝试设置数据库时,它说它无法连接到数据库。

据我所知,在运行 VM 配置而不是容器配置时,主机是 localhost。

这是 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'] %>

我希望 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?

我尝试了各种不同的配置,但不幸的是,Actions 有点了解,而且网上似乎没有很多可用的材料。

有想法该怎么解决这个吗?

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

编辑:

所以我能够通过反复试验来解决这个问题。 我最终使用了带有 ruby​​ 和 node 容器的 docker 镜像。 这是工作配置:

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

我的设置略有不同,但是当我遇到相同的错误时,这是​​最相关的问题,因此想在此处发布以防万一。 对我来说至关重要的两件事是: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"

您的问题似乎是 Postgres 未在端口${{ job.services.postgres.ports[5432] }}上公开。尝试将端口号替换为${{ job.services.postgres.ports[5432] }}

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

我在尝试为 Rails 应用程序设置 GitHub 操作时遇到了这个挑战者。

这是对我有用的

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

注意

  1. my-app替换为您的应用程序名称。
  2. 您可以将database-passworddatabase-user保留为postgres

就这样。

我希望这有帮助

暂无
暂无

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

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