工作流程文件错误,未提供密码

时间:2020-04-28 05:58:47

标签: ruby-on-rails github github-actions

我已经设置了一个Github Action来运行我的Rails应用程序的测试,但是我一直收到此错误:

Run bundle exec rails db:prepare
rails aborted!
PG::ConnectionBad: fe_sendauth: no password supplied

这是工作流程yml文件:

name: CI
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    services:
      db:
        image: postgres:11
        env:
          POSTGRES_USER: postgres
          POSTGRES_DB: bb_test
          POSTGRES_PASSWORD: postgres
        ports: ['5432:5432']
      redis:
        image: redis
        ports: ['6379:6379']
        options: --entrypoint redis-server

    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install missing libs
        run: sudo apt-get -yqq install libpq-dev
      - name: Setup Ruby
        uses: actions/setup-ruby@v1
        with:
          ruby-version: 2.6.x
      - name: Install gems
        run: |
          bundle config path vendor/bundle
          bundle install --jobs 4 --retry 3
      - name: Setup Node
        uses: actions/setup-node@v1
        with:
          node-version: 10.13.0
      - uses: borales/actions-yarn@v2.0.0
        with:
          cmd: install
      - name: Setup test database and run tests
        env:
          DATABASE_URL: postgres://postgres:@localhost:5432/bb_test
          REDIS_URL: redis://localhost:6379/0
          RAILS_ENV: test
          RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
        run: |
          bundle exec rails db:prepare
          bundle exec rails test

虽然问题似乎很明显,但似乎我已经提供了密码。 那我的yml文件出了什么问题?

1 个答案:

答案 0 :(得分:2)

正如我们在评论讨论中所发现的,这是由于database.yml没有提交给存储库,因此使rails无法理解要使用哪个数据库以及使用什么凭据。 / p>

我在此处发布此答案的原因是,分享我们如何将database.yml提交到生产中,同时仍保持必要的安全准则“不将秘密提交给源代码控制”。

由于所有Rails配置文件都支持ERB,因此您可以使用它来使用环境变量来定义机密。例如:

password: <%= ENV['POSTGRES_PASSWORD'] %>

为完整起见,这是我们的database.yml-您可以使用单个DATABASE_URL变量简单地定义生产凭证,或者将环境变量保留为空,并且仍然具有合理的默认开发和测试条件环境:

# config/database.yml
<%
  host = 'localhost'
  username = 'appname_user'
  password = 'dev_password_123'
  database = nil

  if ENV['DATABASE_URL']
    matches = ENV['DATABASE_URL'].match(/:\/\/(?<username>.+):(?<password>.+)@(?<host>.+)\/(?<database>.+)$/)
    if matches
      host     = matches[:host]
      username = matches[:username]
      password = matches[:password]
      database = matches[:database]
    end
  end
%>

pg: &default
  adapter: postgresql
  encoding: unicode
  host: <%= host %>
  pool: 5
  username: <%= username %>
  password: <%= password %>

development:
  <<: *default
  database: <%= database || 'appname_dev' %>

test: &test
  <<: *default
  database: <%= database || 'appname_test' %>

production:
  <<: *default
  database: <%= database || 'appname' %>