oldmoe / litestack

MIT License
1.02k stars 56 forks source link

CI Error: when running with litesearch enabled due DB instance missing #116

Closed 3zcurdia closed 3 months ago

3zcurdia commented 3 months ago

While running the tests on GitHub the following error appears in a rails application

vendor/bundle/ruby/3.3.0/gems/litestack-0.4.4/lib/litestack/litesearch/model.rb:68:in `litesearch': undefined method `search_index' for an instance of SQLite3::Database (NoMethodError)

      idx = get_connection.search_index(index_name) do |schema|
                          ^^^^^^^^^^^^^
    from /home/runner/work/wedding/wedding/app/models/guest.rb:17:in `<class:Guest>'
    from /home/runner/work/wedding/wedding/app/models/guest.rb:5:in `<main>'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `block (2 levels) in replace_require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/kernel.rb:26:in `require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/helpers.rb:148:in `const_get'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/helpers.rb:148:in `cget'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:175:in `block in actual_eager_load_dir'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/helpers.rb:42:in `block in ls'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/helpers.rb:25:in `each'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/helpers.rb:25:in `ls'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:170:in `actual_eager_load_dir'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:17:in `block (2 levels) in eager_load'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:16:in `each'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:16:in `block in eager_load'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:10:in `synchronize'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader/eager_load.rb:10:in `eager_load'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader.rb:413:in `block in eager_load_all'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader.rb:411:in `each'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/loader.rb:411:in `eager_load_all'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/application/finisher.rb:80:in `block in <module:Finisher>'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/initializable.rb:32:in `instance_exec'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/initializable.rb:32:in `run'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/initializable.rb:61:in `block in run_initializers'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:231:in `block in tsort_each'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:353:in `block (2 levels) in each_strongly_connected_component'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:434:in `each_strongly_connected_component_from'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:352:in `block in each_strongly_connected_component'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:350:in `each'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:350:in `call'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:350:in `each_strongly_connected_component'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:229:in `tsort_each'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/tsort.rb:208:in `tsort_each'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/initializable.rb:60:in `run_initializers'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/application.rb:426:in `initialize!'
    from /home/runner/work/wedding/wedding/config/environment.rb:7:in `<main>'
    from /home/runner/work/wedding/wedding/test/test_helper.rb:4:in `require_relative'
    from /home/runner/work/wedding/wedding/test/test_helper.rb:4:in `<main>'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `block (2 levels) in replace_require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/kernel.rb:34:in `require'
    from /home/runner/work/wedding/wedding/test/channels/application_cable/connection_test.rb:3:in `<main>'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `block (2 levels) in replace_require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/zeitwerk-2.6.15/lib/zeitwerk/kernel.rb:34:in `require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/test_unit/runner.rb:51:in `block in load_tests'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/test_unit/runner.rb:51:in `each'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/test_unit/runner.rb:51:in `load_tests'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/test_unit/runner.rb:43:in `run'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/commands/test/test_command.rb:33:in `perform'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/thor-1.3.1/lib/thor/command.rb:28:in `run'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/thor-1.3.1/lib/thor/invocation.rb:127:in `invoke_command'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/command/base.rb:178:in `invoke_command'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/thor-1.3.1/lib/thor.rb:527:in `dispatch'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/command/base.rb:73:in `perform'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/command.rb:71:in `block in invoke'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/command.rb:149:in `with_argv'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/command.rb:69:in `invoke'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/railties-7.1.3.3/lib/rails/commands.rb:18:in `<main>'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `require'
    from /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/bundled_gems.rb:74:in `block (2 levels) in replace_require'
    from /home/runner/work/wedding/wedding/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
    from bin/rails:4:in `<main>'

it seems to be related to a missing SQLite file missing on the CI here is my GitHub Actions file

# run tests and linters.
name: "Ruby CI"
on: [push]
jobs:
  test:
    runs-on: ubuntu-latest
    env:
      RAILS_ENV: test
      RACK_ENV: test
    steps:
      - uses: actions/checkout@v4
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
          ruby-version: 3.3.1
      - name: Prepare database CI configuration
        run: cp config/database.ci.yml config/database.yml
      - name: Set up database
        run: bin/rails db:create db:schema:load
      - name: Run tests
        run: bin/rails test
3zcurdia commented 3 months ago

If I change in the CI config file it to rails db:setup the error is as follow

Run bin/rails db:setup
/home/runner/work/app/app/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /opt/hostedtoolcache/Ruby/3.3.1/x64/lib/ruby/3.3.0/csv.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.4.0. Add csv to your Gemfile or gemspec.
Created database 'db/test.sqlite3'
bin/rails aborted!
NoMethodError: undefined method `search_index' for an instance of SQLite3::Database (NoMethodError)
3zcurdia commented 3 months ago

Duh my database.ci.yml had the wrong config

test:
  adapter: litedb
  database: <%= Litesupport.root("test").join("data.sqlite3") %>
  pool: 5
  timeout: 5000

That fix it 🤡

bcasci commented 4 weeks ago

I'm having this same issue. My database.yml test stanza is just like yours too. I've not been able to resolve this yet.

bcasci commented 4 weeks ago

So, I've figured out the source of my problem. my github action yml file had this environment variable in it:

DATABASE_URL: "sqlite3:db/test/data.sqlite3"

That was causing ActiveRecord to have a native SQLite database connection instead of a Litedb connection. Rails will always give preference to DATABASE_URL for establishing a database connection. So removing allowed the test db settings in database.yml to b e applied.