我已经设置了一个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文件出了什么问题?
答案 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' %>