passenger icon indicating copy to clipboard operation
passenger copied to clipboard

`passenger_preload_bundler` does not work correctly with `passenger_env_var RUBYOPT`

Open Tietew opened this issue 2 years ago • 4 comments

Issue report

Question 1: What is the problem?

passenger_preload_bundler on; does not work correctly with passenger_env_var RUBYOPT something.

  • What is the expected behavior? Our Rack application works normally.

  • What is the actual behavior? Passenger fails to start the Rack application with following error:

Error: The application encountered the following error: You have already activated strscan 3.0.1,
but your Gemfile requires strscan 3.0.3. Since strscan is a default gem,
you can either remove your dependency on it or try updating to a newer version of bundler
that supports strscan as a default gem. (Gem::LoadError)
  • How can we reproduce it?
  1. Create a simple Rack app

Gemfile

source 'https://rubygems.org'
gem 'rack'
gem 'strscan' # Ruby 3.1's default gem is 3.0.1, current latest is 3.0.3

config.ru

#!/usr/bin/env ruby
require 'bundler/setup'
Bundler.require
run lambda { |env| [200, {'Content-Type'=>'text/plain'}, ["strscan=#{StringScanner::Version}\n"]] }
  1. Install
$ bundle
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Using bundler 2.3.13
Fetching rack 2.2.3
Fetching strscan 3.0.3
Installing strscan 3.0.3 with native extensions
Installing rack 2.2.3
Bundle complete! 2 Gemfile dependencies, 3 gems now installed.
Bundled gems are installed into `./vendor/bundle`
  1. Set up an Nginx config including passenger_env_var RUBYOPT.
server {
    listen 80;
    server_name myapp.example.com;
    root /var/www/test2/public;
    location / {
        passenger_enabled on;
        passenger_app_env production;
        passenger_app_root /var/www/test2;
        passenger_preload_bundler on;
        passenger_env_var RUBYOPT -W0; # just supress warnings
    }
}
  1. Access http://myapp.example.com

Question 2: Passenger version and integration mode: Nginx 1.21.6 Passenger 6.0.14 (open source)

Question 3: OS or Linux distro, platform (including version): Ubuntu 18.04 (bionic) x86_64

Question 4: Passenger installation method: RubyGems, no Gemfile (Passenger is installed globally with no Gemfile)

Question 5: Your app's programming language (including any version managers) and framework (including versions): Ruby 3.1.2

Question 6: Are you using a PaaS and/or containerization? If so which one? Amazon EC2

Question 7: Anything else about your setup that we should know? Ruby is installed via rbenv globally. nginx.conf includes following:

    passenger_root /usr/local/rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/passenger-6.0.14;
    passenger_ruby /usr/local/rbenv/shims/ruby;

When Gemfile includes gem 'strscan'

passenger_preload_bundler off; passenger_preload_bundler on;
No passenger_env_var error (intended) strscan=3.0.3
passenger_env_var RUBYOPT error (intended) ERROR (this issue)

When Gemfile DOES NOT include gem 'strscan'

passenger_preload_bundler off; passenger_preload_bundler on;
No passenger_env_var strscan=3.0.1 strscan=3.0.1
passenger_env_var RUBYOPT strscan=3.0.1 strscan=3.0.1

Tietew avatar May 23 '22 06:05 Tietew

Update: YJIT is unrelated. Defining RUBYOPT will trigger this issue.

Tietew avatar May 23 '22 06:05 Tietew

Workaround: Following settings works correctly:

passenger_env_var RUBYOPT "-W0 -rbundler/setup";

Tietew avatar May 23 '22 06:05 Tietew

Working on this for next release.

CamJN avatar Jul 23 '22 00:07 CamJN

6.0.15 works fine. Thank you.

Tietew avatar Sep 30 '22 10:09 Tietew