Ошибка в файле рабочего процесса, пароль не указан - PullRequest
0 голосов
/ 28 апреля 2020

Я настроил действие Github для запуска тестов моего приложения 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 Ответ

1 голос
/ 29 апреля 2020

Как мы выяснили в обсуждении комментариев, это было связано с тем, что database.yml не был привязан к хранилищу и поэтому оставлял рельсы без понимания, какую базу данных использовать и с какими учетными данными.

Причина, по которой я публикую этот ответ здесь, заключается в том, чтобы поделиться тем, как мы передаем 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' %>
...