🚨 The Problem

Everything worked fine locally, but CI kept failing.

I was working on a Rails application that used two databases:

  • A primary database (fully controlled by the app)
  • A secondary database (owned by a different application)

The catch was this: 👉 The secondary database was read-only from my app’s perspective.

Locally, this was not a problem because the database already existed and had the expected schema.

But in CI:

  • The secondary database didn’t exist
  • Rails tried to interact with it like a normal DB
  • Tests failed with missing tables and connection errors

🔍 Root Cause

The issue was pretty simple:

👉 Rails CI setup assumes it can create and migrate all databases.

That assumption breaks when:

  • A database is managed externally
  • Your app does not have write/migration access
  • Schema must be imported, not generated

So while this worked:

rails db:create:all
rails db:migrate:all

It failed for my setup because:

  • The secondary DB could not be migrated
  • Required tables were never created
  • Tests relying on that DB failed immediately

🛠️ The Solution

The fix was to treat each database based on who owns it and what access level it has.

Step 1: Handle Primary DB Normally

The primary database is fully controlled by the app, so standard setup works:

RAILS_ENV=test bundle exec rails db:create
RAILS_ENV=test bundle exec rails db:migrate

Step 2: Restore Secondary DB from Dump

Since the secondary DB is:

  • Managed by another app
  • Read-only in this context

👉 The only reliable solution was to restore it from a dump file I stored a dump inside the project:

db/backups/secondary_test_dump.sql

Then restored it during CI setup:

psql -U postgres -d secondary_test_db < db/backups/secondary_test_dump.sql

Step 3: Wire It into CI

Here’s what the CI setup looked like:

- name: Setup Primary DB
  run: |
    bundle exec rails db:create
    bundle exec rails db:migrate

- name: Restore Secondary DB
  run: |
    psql -U postgres -d secondary_test_db < db/backups/secondary_test_dump.sql

- name: Run Tests
  run: bundle exec rspec

📈 Results

After applying this approach:
✅ CI became stable.
✅ No more missing table errors.
✅ Tests behaved exactly like local.
✅ Clear separation of responsibilities between DBs.

🧩 Key Takeaways

  • Not all databases in a Rails app are equal
  • If a DB is externally managed, don’t try to migrate it
  • Use dumps for read-only or shared databases
  • CI setup should reflect real-world constraints, not assumptions

🚀 Final Thoughts

This issue was not really about Rails. It was about understanding the system boundaries.

Once I stopped treating both databases the same way and respected their roles:

  • One writable
  • One external and read-only

…the solution became straightforward.

…the solution became pretty straightforward.

If your CI is failing in a multi-database setup, don’t just look at Rails config.
👉 Look at who owns the database and how it’s supposed to be used.