mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Preserve Bundle configuration during app generation (#34755)
When generating a new rails application (rails new) using a custom template that includes gems from an authenticated source, the user has to provide credentials to bundler. One way to do this is by exporting environment variables, for example: export BUNDLE_GITHUB__COM=user:pass: provides credentials for bundler to fetch gems from github.com. The problem this PR addresses is that we are currently scrubs all /BUNDLE_.*/ environment variables by wrapping our system calls in Bundler.with_clean_env. We do this because we don't want our commands executed against the generated project to use the generator's bundler environment (e.g. our gems): the generated project should use it's own configuration. The problem with Bundler.with_clean_env is that, on top of restoring environment variables to their original state, it also scrubs any /BUNDLE_.*/ variables, which is harmful for authenticated gem sources. This PR replaces Bundler.with_clean_env with Bundler.with_original_env, which only restores environment variables to their initial state, without additional scrubbing.
This commit is contained in:
parent
80c7038bbc
commit
d79366b4c9
3 changed files with 33 additions and 9 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
* Use original `bundler` environment variables during the process of generating a new rails project.
|
||||||
|
|
||||||
|
*Marco Costa*
|
||||||
|
|
||||||
* Send Active Storage analysis and purge jobs to dedicated queues by default.
|
* Send Active Storage analysis and purge jobs to dedicated queues by default.
|
||||||
|
|
||||||
Analysis jobs now use the `:active_storage_analysis` queue, and purge jobs
|
Analysis jobs now use the `:active_storage_analysis` queue, and purge jobs
|
||||||
|
|
|
@ -388,19 +388,21 @@ module Rails
|
||||||
# its own vendored Thor, which could be a different version. Running both
|
# its own vendored Thor, which could be a different version. Running both
|
||||||
# things in the same process is a recipe for a night with paracetamol.
|
# things in the same process is a recipe for a night with paracetamol.
|
||||||
#
|
#
|
||||||
# We unset temporary bundler variables to load proper bundler and Gemfile.
|
|
||||||
#
|
|
||||||
# Thanks to James Tucker for the Gem tricks involved in this call.
|
# Thanks to James Tucker for the Gem tricks involved in this call.
|
||||||
_bundle_command = Gem.bin_path("bundler", "bundle")
|
_bundle_command = Gem.bin_path("bundler", "bundle")
|
||||||
|
|
||||||
require "bundler"
|
require "bundler"
|
||||||
Bundler.with_clean_env do
|
Bundler.with_original_env do
|
||||||
full_command = %Q["#{Gem.ruby}" "#{_bundle_command}" #{command}]
|
exec_bundle_command(_bundle_command, command, env)
|
||||||
if options[:quiet]
|
end
|
||||||
system(env, full_command, out: File::NULL)
|
end
|
||||||
else
|
|
||||||
system(env, full_command)
|
def exec_bundle_command(bundle_command, command, env)
|
||||||
end
|
full_command = %Q["#{Gem.ruby}" "#{bundle_command}" #{command}]
|
||||||
|
if options[:quiet]
|
||||||
|
system(env, full_command, out: File::NULL)
|
||||||
|
else
|
||||||
|
system(env, full_command)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -773,6 +773,24 @@ class AppGeneratorTest < Rails::Generators::TestCase
|
||||||
assert_bundler_command_called("install")
|
assert_bundler_command_called("install")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_generation_use_original_bundle_environment
|
||||||
|
generator([destination_root], skip_webpack_install: true)
|
||||||
|
|
||||||
|
mock_original_env = -> do
|
||||||
|
{ "BUNDLE_RUBYONRAILS__ORG" => "user:pass" }
|
||||||
|
end
|
||||||
|
|
||||||
|
ensure_environment_is_set = -> *_args do
|
||||||
|
assert_equal "user:pass", ENV["BUNDLE_RUBYONRAILS__ORG"]
|
||||||
|
end
|
||||||
|
|
||||||
|
Bundler.stub :original_env, mock_original_env do
|
||||||
|
generator.stub :exec_bundle_command, ensure_environment_is_set do
|
||||||
|
quietly { generator.invoke_all }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def test_dev_option
|
def test_dev_option
|
||||||
generator([destination_root], dev: true, skip_webpack_install: true)
|
generator([destination_root], dev: true, skip_webpack_install: true)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue