Как настроить Travis Rspec для тестирования реплик чтения, доступных в приложении Rails - PullRequest
0 голосов
/ 22 марта 2019

У меня есть приложение rails, которое обращается к двум базам данных: реплика чтения и его собственная база данных, настроенная через стандартный файл database.yml.

Существуют определенные модели, которые обращаются к реплике чтения, и я использую establish_connection для динамического переключения на реплику:

class MyReadReplicaDbBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection READ_REPLICA_DB
end

class User < MyReadReplicaDbBase
end

Реальные среды хорошо работают с этой настройкой, но при тестировании на travis мне нужно настроить две базы данных, используя такой подход:

language: ruby

cache: bundler

rvm:
  - 2.5.1

services:
  - docker
  - redis-server

env:
  global:
    - DB_URL=postgres://postgres@localhost/travis_ci_test
    - READ_REPLICA_DB_URL=postgres://postgres@localhost/travis_ci_read_replica_test


# https://github.com/travis-ci/travis-ci/issues/9624#issuecomment-389537036
before_install:
  - sudo sed -i -e '/local.*peer/s/postgres/all/' -e 's/peer\|md5/trust/g' /etc/postgresql/*/main/pg_hba.conf
  - sudo service postgresql restart
  - sleep 1
  - gem update --system
  - gem install bundler

sudo: required
dist: xenial
addons:
  postgresql: "10"
  apt:
    packages:
      - postgresql-10
      - postgresql-client-10
  env:
    global:
      - PGPORT=5433

before_script:
  - cp config/database.yml.travis config/database.yml
  - psql -c 'create database travis_ci_test;' -U postgres
  - psql -c 'create database travis_ci_read_replica_test' -U postgres


script:
  - bundle exec rails db:migrate RAILS_ENV=test
  - bundle exec rspec -f d

Существует ли стандартный подход для загрузки схемы в базу данных реплики для тестирования?Могу ли я выполнить что-то вроде следующего?

rake:db:schema:load --database read_replica_db

Я понимаю, что это не сработает, потому что для настройки этой базы данных будет использоваться среда по умолчанию.

1 Ответ

0 голосов
/ 22 марта 2019

Итак, я заработал, используя токен личного доступа и скопировав схему, используя этот скрипт

#load_read_replica_schema.rb
#!/home/travis/.rvm/rubies/ruby-2.5.1/bin/ruby

def install_gems()
  system('gem install pg')
  system('gem install activerecord -v=5.2.2')
end

def get_read_replica_schema_file
  require 'active_record'
  require 'active_record/tasks/database_tasks'
  require 'active_record/tasks/postgresql_database_tasks'

  curl_command = "curl -s https://#{ENV['PERSONAL_ACCESS_TOKEN']}@raw.githubusercontent.com/<owner>/<repo>/master/db/schema.rb -o read_replica_schema.rb"
  system(curl_command)


   ActiveRecord::Tasks::DatabaseTasks.load_schema('postgres://postgres:@localhost/travis_ci_read_replica_test', :ruby, 'read_replica_schema.rb', :test)
end


install_gems()
get_read_replica_schema_file()

Аналогичным образом обновил скрипт для запуска на скрипте travis.yaml со скриптом

before_script:
  - cp config/database.yml.travis config/database.yml
  - psql -c 'create database travis_ci_test;' -U postgres
  - psql -c 'create database travis_ci_read_replica_test' -U postgres

script:
  - ./load_read_replica_api_schema.rb
  - bundle exec rails db:migrate RAILS_ENV=test
  - bundle exec rspec -f d
...