The Future of Bundled Bundler

Hiroshi SHIBATA
Hiroshi SHIBATAOSS programmer at GMO Pepabo, Inc.
The first step of package management integration
Hiroshi SHIBATA / GMO Pepabo, Inc.
2019.04.20 RubyKaigi 2019
The Future of Bundled Bundler
self.introduce
Hiroshi SHIBATA @hsbt
https://www.hsbt.org
Executive Officer VP of Engineering
Technical Director
at GMO Pepabo, Inc. @pepabo
self.introduce
=> {
name: “SHIBATA Hiroshi”,
nickname: “hsbt”,
organizations: [“ruby”, “rubygems”, “asakusarb”, “pepabo”, …],
commit_bits: [“ruby”, “rake”, “rubygems”, “bundler”, “rdoc”,
“psych”, “ruby-build”, “railsgirls”, “railsgirls-jp”, …],
sites: [“hsbt.org”, “ruby-lang.org”, “rubyci.org”, “railsgirls.com”,
“railsgirls.jp”],
}
Pepabo.engineers.select do |u|
u.include?(RubyKaigi.attendees)
end
self.introduce
=> ["hsbt", "udzura", "pyama", "kunit", "daiki", "sangun",
"yamoto", "akatsuura", "tokky", "hayapi", "kenken", "azuki",
"tosite", "tsumichan", "ryoma", "kymmt", "amacou", "kenchan",
"nishihata", "tanaken", "kurotaky", "shimoju", "tascript",
“ogidow”, “kaya”]
We supported to 25 people for attending the RubyKaigi in this
year.
The Future of Bundled Bundler
No.7
No.1
No.5
Agenda
•The Introduction of The Bundled Bundler
•What’s happened in Ruby 2.6?
•BugMash after releasing Ruby 2.6
•The Challenge for Bundler Integration
•RubyGems 4.0
•The Roadmap for Ruby 3.0
The Introduction
of
The Bundled Bundler
1.
3/40min
Why should we integrate bundler to
rubygems?
The Future of Bundled Bundler
RubyGems/Bundler integration in 2018
•We are working to integrate RubyGems and Bundler. But
it’s no progress in the last year.
•RubyGems 3 drop to support under the Ruby 2.2.
•I’m working merging bundler into ruby core because
Bundler 2 was released. Because Bundler 1.x still supports
Ruby 1.8 and 1.9.
Bundler Integration on rubygems.rb
• It disabled in Ruby
2.5 because
bundler is not part
of standard
library.
• You can enabled it
with only `gem
update --system`
if USE_BUNDLER_FOR_GEMDEPS
ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path)
require 'rubygems/user_interaction'
Gem::DefaultUserInteraction.use_ui(ui) do
require "bundler"
@gemdeps = Bundler.setup
Bundler.ui = nil
@gemdeps.requested_specs.map(&:to_spec).sort_by(&:name)
end
else
rs = Gem::RequestSet.new
@gemdeps = rs.load_gemdeps path
rs.resolve_current.map do |s|
s.full_spec.tap(&:activate)
end
end
Installer of RubyGems(not Ruby)
• It’s provided by update_rubygems, setup.rb, setup_command.rb
• Installer of RubyGems promote Bundler to default gems.
def install_default_bundler_gem
return unless Gem::USE_BUNDLER_FOR_GEMDEPS
specs_dir = Gem::Specification.default_specifications_dir
specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform?
mkdir_p specs_dir
(snip…)
bundler_bin_dir = bundler_spec.bin_dir
bundler_bin_dir = File.join(options[:destdir], bundler_bin_dir) unless Gem.win_platform?
mkdir_p bundler_bin_dir
bundler_spec.executables.each do |e|
cp File.join("bundler", bundler_spec.bindir, e), File.join(bundler_bin_dir, e)
end
The current behavior of the bundled bundler
•It integrates with default gems like
json, psych.
•The upstream is https://github.com/
bundler/bundler. I backport the
released/developed version to ruby
repository.
•Ruby 2.6 always enabled Bundler
gem_deps now(New!)
~ > gem list | rg default:
bigdecimal (1.4.3, default:
1.4.2)
bundler (default: 2.0.1, 1.17.3)
cmath (default: 1.0.0)
csv (3.0.6, default: 3.0.4)
(snip)
thwait (default: 0.1.0)
tracer (default: 0.1.0)
webrick (default: 1.4.2)
zlib (default: 1.0.0)
What’s happened in Ruby 2.6?
2.
8/40min
What’s new in RubyGems 3
•I released RubyGems 3 at 19 Dec 2018
•https://blog.rubygems.org/2018/12/19/3.0.0-released.html
•This version dropped to support the old Ruby versions like
1.8 and 1.9
•RubyGems 3 have a lot of features and bugfixes.
The Important Notification
Do protect your account of
RubyGems.org
Remove deprecated code
• RubyGems have a lot of workarounds for old Ruby. They are
branches like RUBY_VERSION, respond_to?, defined?
- if [].respond_to? :flat_map
- def pinned_requirement name # :nodoc:
- requirement = Gem::Dependency.new name
- specification = @set.sets.flat_map { |set|
- set.find_all(requirement)
- }.compact.first
+ def pinned_requirement name # :nodoc:
+ requirement = Gem::Dependency.new name
What’s new in Bundler 2?
•We disabled the incompatible features like renaming
`gems.rb` from `Gemfile`
•They no longer support under the Ruby 2.2.
•There is no incompatible feature from Bundler 1.17.x.
Only support Ruby 2.2+
• We can use Keywords
argument, Refinement, Other
cool features in RubyGems
and Bundler now.
• Finally, We got the simple
build matrix
Introduce `make test-bundler`
•I added `test-prepare-bundler` for preparing to invoke rspec on ruby core
repository. I put them into `.bundle` directory under the ruby repo and set it
to `GEM_HOME` when running `make test-bundler`
•Now, We can invoke bundler examples with miniruby each commits.
when "bundler"
`rm -rf lib/bundler* libexec/bundler libexec/bundle libexec/bundle_ruby 
spec/bundler man/bundle* man/gemfile*`
`cp -r ../../bundler/bundler/lib/bundler* ./lib`
`cp -r ../../bundler/bundler/exe/bundle* ./libexec`
`cp ../../bundler/bundler/bundler.gemspec ./lib/bundler`
`cp -r ../../bundler/bundler/spec spec/bundler`
`cp -r ../../bundler/bundler/man/*.{1,5,1.txt,5.txt,ronn} ./man`
`rm -rf spec/bundler/support/artifice/vcr_cassettes`
The issues of bundler test suite.
•The Bundler examples is hard way.
•The most of Bundler examples are integration test. Example for invoking
to `bundle exec` command and assert standard output.
•Finally, I added `ruby_core` filter into bundler examples. Because some of
examples expect that installed ruby interpreter like `/usr/local/bin/ruby`
Finished in 52 minutes 54 seconds (files took 1.7 seconds to load)
2626 examples, 0 failures, 8 pending
The location of execution wrapper
• Ruby core put executable script directly under the bin directory.
• We often faced conflict error when upgrading rdoc.
• When You put ‘y’, You completely lost original executable.
~ > gem update rdoc
Updating installed gems
Updating rdoc
Fetching: rdoc-6.0.4.gem (100%)
rdoc's executable "rdoc" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/rdoc
Overwrite the executable? [yN] y
rdoc's executable "ri" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/ri
Overwrite the executable? [yN] y
Successfully installed rdoc-6.0.4
Gems updated: rdoc
What’s happened?
• RubyGems generate wrapper script for executable script of gem
#!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'rdoc' is installed as part of a
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.re
if str =~ /A_(.*)_z/ and Gem::Version.correct?
version = $1
ARGV.shift
end
end
load Gem.bin_path('rdoc', 'rdoc', version)
#!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby
#
# RDoc: Documentation tool for source code
# (see lib/rdoc/rdoc.rb for more information
#
# Copyright (c) 2003 Dave Thomas
# Released under the same terms as Ruby
begin
gem 'rdoc'
rescue NameError => e # --disable-gems
raise unless e.name == :gem
rescue Gem::LoadError
end
require 'rdoc/rdoc'
begin
r = RDoc::RDoc.new
r.document ARGV
rescue Errno::ENOSPC
Gem wrapper Original executable
Update BundlerVersionFinder
•BundlerVersionFinder was
introduced at RubyGems 2.7
•It ability is the version detection
by RubyGems strictly. Ex. 1.17.3
matches only 1.17.3.
•We update the filter condition.
Now, 1.17.3 matches 1.x.y, 2.0.3
also matches 2.x.y.
def self.bundler_version_with_reason
if v = ENV["BUNDLER_VERSION"]
return [v, "`$BUNDLER_VERSION`"]
end
if v = bundle_update_bundler_version
return if v == true
return [v, "`bundle update --bundler`"]
end
v, lockfile = lockfile_version
if v
return [v, "your #{lockfile}"]
end
end
Merge Bundler into ruby src
•I fixed the all of failures of Bundler examples with ruby core head.
•At first, I did merge Bundler 2.0 to Ruby core because Bundler 2 dropped to
support the old versions of Ruby. But Bundler 2.0 causes the issues on
Heroku platform.
•Heroku only support Bundler 1 at that time.
•I backport the patches to Bundler 1.17 from 2.0 and merge Bundler 1.17
into ruby core.
BugMash
after releasing Ruby 2.6
3.
20/40min
The issues after releasing Ruby 2.6
•Path Injection problem about rubylibdir to LOAD_PATH.
•The installer generate invalid gemspec of Bundler.
•The version switcher on Heroku.
The path injection for LOAD_PATH issue
•https://bugs.ruby-lang.org/issues/15469
•After that, You can’t use the specified version of gems like json or psych.
It activates the versions of default gems provided by ruby core.
- “/Users/user-name/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bundler-1.17.2/lib"
- “/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash”
- "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.5.0/gems/json-1.8.6/lib"
- (snip)
- "/Users/user-name/.rbenv/versions/2.6.0/lib/ruby/2.6.0"
- "/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash"
- "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.6.0/gems/json-1.8.6/lib"
- (snip)
The invalid gemspec generation issue
•The installer of ruby core causes to generate invalid gemspec when you
install ruby core.
•https://bugs.ruby-lang.org/issues/15582
•Its file-list is the incomplete files by the bundled bundler. It activate the
unexpected version of bundler with loading library.
The bundler switcher issue of Heroku
•https://github.com/heroku/heroku-buildpack-ruby/pull/850
•Heroku platform only uses version 1 of Bundler like 1.17.x. But Bundler
version finder of RubyGems detects Bundler 1 or 2 from your Gemfile.lock.
@schneems fixes this issue on heroku.
•When You use Gemfile.lock updated by Bundler 2 with `bundle update --
bundler`, Heroku reject your app. Now you can use Ruby 2.6 and Bundler 2
on heroku.
BLESSED_BUNDLER_VERSIONS = {}
BLESSED_BUNDLER_VERSIONS["1"] = "1.15.2"
BLESSED_BUNDLER_VERSIONS["2"] = "2.0.1"
Ruby 2.6.3 is the best version ever
The Challenge for Bundler
Integration
4.
26/40min
Dependency Resolver incompatible
• RubyGems 2.x and 3.x uses Molinillo-0.5.7
• Bundler 1.x and 2.x also uses Molinillo-0.6.4
• These are different versions and behavior of dependency
resolver.
~/D/g/r/rubygems (master) > ls lib/rubygems/resolver/molinillo/lib/molinillo
delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb
dependency_graph errors.rb modules resolver.rb
~/D/g/b/bundler (master) > ls lib/bundler/vendor/molinillo/lib/molinillo
compatibility.rb dependency_graph errors.rb modules resolver.rb
delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb
RubyGems 3.1 with Molinillo-0.6.x
• I try to upgrade Molinillo-0.6.x on RubyGems.
https://github.com/rubygems/rubygems/pull/2026
~/D/g/r/rubygems (molinillo-0-6-3) > env GEMSRC_SKIP=true rake test
Gem::Indexer tests are being skipped. Install builder gem.
Run options: --seed 2600
# Running:
...........................................................................................................
....................................E..............................................E.......................
........E..................E....E......................F.........FF.F.FFFF....F...F.....F..................
...........................................................................................................
.....................................................................................................E.....
...................................................S.....................S.................................
...........................................................................................................
...........
Duplicates the certificates
• RubyGems and Bundler stored the duplicated certificates in your
box. I fixed this at r67539
~/D/g/r/rubygems (master) > fd . lib/rubygems/ssl_certs/
lib/rubygems/ssl_certs/index.rubygems.org
lib/rubygems/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem
lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net
lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem
lib/rubygems/ssl_certs/rubygems.org
lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem
~/D/g/r/rubygems (master) > fd . bundler/lib/bundler/ssl_certs/
bundler/lib/bundler/ssl_certs/index.rubygems.org
bundler/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem
bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net
bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem
bundler/lib/bundler/ssl_certs/rubygems.org
bundler/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem
Fixed
Activation issues about default gems
•You couldn’t use the specified version of default gems like json when
RubyGems/Bundler activated them.
•When rubygems uses json-2.1.0, You couldn’t use json 1.8.x. Because ruby
gems and rubygems.org never uses JSON format.
•We can resolve it with `vendoring` approach. But json, psych, and openssl
is C extension library.
Namespace?
•It may resolve with namespace feature with Ruby core.
•https://bugs.ruby-lang.org/issues/10320
•https://bugs.ruby-lang.org/issues/13847
•When rubygems used psych with shared library like libyaml-x.y.z, Ruby
can’t resolve this problem.
•Please pick me with discuss about this if you have a nice idea.
require 'libfile', into: :Lib
RubyGems 4.0
5.
30/40min
RubyGems 4
• It has non-compatible features.
• Make enable as default for conservative option: https://
github.com/rubygems/rubygems/pull/2233
• Behaviour changes with default gems installer: https://
github.com/rubygems/rubygems/pull/2166
• Make ruby gem install to user-install by default: https://
github.com/rubygems/rubygems/issues/1394
Make conservative option as default
• We got the installation time when already installed gems.
• To use conservative is ignore re-install action.
~ > gem i rails
clone http://rubyonrails.org -> /Users/hsbt/Documents/rubyonrails.org
git ls-remote http://rubyonrails.org
hg identify http://rubyonrails.org
svn info http://rubyonrails.org
error Could not find version control system: http://rubyonrails.org
exists /Users/hsbt/Documents/github.com/rails/rails
Successfully installed rails-5.2.0
1 gem installed
~ > gem i rails ——conservative
~ >
Change behavior of default option
• `gem install --default` put gemspec into default gem directory.
• But it is not put and build the library files like .rb and native
extensions.
• I hope to install completely library like csv-1.0.2 into the old
Ruby versions.
~ > gem i csv --default
Fetching: csv-1.0.2.gem (100%)
Successfully installed csv-1.0.2 as a default gem
1 gem installed
~ > ls ~/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/csv-1.0.2/
~ >
Make `--user-install` as default
• RubyGems 4 will install the all gems to `~/.gem` maybe.
• Pros: Ruby in linux distribution has many of FAQ for gem
installation for using `sudo`. This change resolve this issues.
• Cons: Ruby version manager like rbenv is not support it. And
RubyGems have a lot of issues related this.
RubyGems still have a lot of issues
• When you share GEM_HOME in your box, You faced…
• RubyGems always show the warnings for missing extension
with platform mismatch. You always get the warnings with
`jruby-lanucher`. (I fixed this in upstream)
• RubyGems will activate the different platform with same
version like nokogiri-1.10.1 and 1.10.1-java.
• RubyGems will remove gem that was failed to `gem pristine`
We always welcome your patch.
Roadmap for Ruby 3.0
6.
35/40min
The policy of RubyGems merging
•The RubyGems accepts SemVer like versioning Policy.
•Merge latest stable version into Ruby Core
•Ruby 2.6.0 bundled RubyGems 3.0
•Ruby 2.7.0 will bundle RubyGems 3.1 or 3.2(TBD)
•Ruby 3.0 will bundle RubyGems 4.0 or ?
Security release of RubyGems
•RubyGems have HackerOne.
•3 people handle vulnerability issues and will release
RubyGems by SemVer like policy like “2.7.7” from “2.7.6”
•On the other hand, The Ruby core team will back port only
vulnerability fixes by independent version like “2.6.5.1”,
not “2.7.7”
Support JRuby and TruffleRuby
•Surprisedly, RubyGems and Bundler never test JRuby and
TruffleRuby in CI.
•We try to add JRuby and TruffleRuby to Travis or other CI
environments.
•To JRuby and TruffleRuby tam: Please join us for this
support.
RubyGems/Bundler integration(1)
•Now, We put the bundler as
submodule in rubygems
repository.
•We will move the canonical
repository of bundler to
rubygems org or rubygems/
rubygems.
RubyGems/Bundler integration(2)
•We will merge into RubyGems 3.2 and Bundler 2.1 into
Ruby 2.7.0. After that, RubyGems 4.0 will be merge Ruby 3.
Ruby
Bundler
RubyGems
2.7.0 3.02.7-rcX
3.1
2.0
3.0
2.1
3.2
3.0?
4.0
?
RubyGems/Bundler integration(3)
•Unify the duplicated code and configuration like the
certificates.
•We have a plan to separate bundler-runtime and bundler-
cli. After that, We will merge bundler-runtime into
rubygems.
•I need to learn cargo and npm/yarn for the feature UI.
Rap-Up
•The Introduction of The Bundled Bundler
•What’s happened in Ruby 2.6?
•BugMash after releasing Ruby 2.6
•The Challenge for Bundler Integration
•RubyGems 4.0
•Roadmap for Ruby 3.0
❤
❤
1 of 60

Recommended

The Future of library dependency manageement of Ruby by
The Future of library dependency manageement of RubyThe Future of library dependency manageement of Ruby
The Future of library dependency manageement of RubyHiroshi SHIBATA
988 views55 slides
What's new in RubyGems3 by
What's new in RubyGems3What's new in RubyGems3
What's new in RubyGems3Hiroshi SHIBATA
3K views46 slides
OSS Security the hard way by
OSS Security the hard wayOSS Security the hard way
OSS Security the hard wayHiroshi SHIBATA
4.5K views62 slides
Ruby Security the Hard Way by
Ruby Security the Hard WayRuby Security the Hard Way
Ruby Security the Hard WayHiroshi SHIBATA
726 views36 slides
The Future of Dependency Management for Ruby by
The Future of Dependency Management for RubyThe Future of Dependency Management for Ruby
The Future of Dependency Management for RubyHiroshi SHIBATA
7.4K views72 slides
The Future of library dependency management of Ruby by
 The Future of library dependency management of Ruby The Future of library dependency management of Ruby
The Future of library dependency management of RubyHiroshi SHIBATA
644 views33 slides

More Related Content

What's hot

How to distribute Ruby to the world by
How to distribute Ruby to the worldHow to distribute Ruby to the world
How to distribute Ruby to the worldHiroshi SHIBATA
3.8K views51 slides
Roadmap for RubyGems 4 and Bundler 3 by
Roadmap for RubyGems 4 and Bundler 3Roadmap for RubyGems 4 and Bundler 3
Roadmap for RubyGems 4 and Bundler 3Hiroshi SHIBATA
794 views23 slides
Gemification for Ruby 2.5/3.0 by
Gemification for Ruby 2.5/3.0Gemification for Ruby 2.5/3.0
Gemification for Ruby 2.5/3.0Hiroshi SHIBATA
1.3K views50 slides
How to develop the Standard Libraries of Ruby? by
How to develop the Standard Libraries of Ruby?How to develop the Standard Libraries of Ruby?
How to develop the Standard Libraries of Ruby?Hiroshi SHIBATA
3.6K views25 slides
Gems on Ruby by
Gems on RubyGems on Ruby
Gems on RubyHiroshi SHIBATA
1.9K views35 slides
RubyGems 3 & 4 by
RubyGems 3 & 4RubyGems 3 & 4
RubyGems 3 & 4Hiroshi SHIBATA
1.3K views36 slides

What's hot(20)

How to distribute Ruby to the world by Hiroshi SHIBATA
How to distribute Ruby to the worldHow to distribute Ruby to the world
How to distribute Ruby to the world
Hiroshi SHIBATA3.8K views
Roadmap for RubyGems 4 and Bundler 3 by Hiroshi SHIBATA
Roadmap for RubyGems 4 and Bundler 3Roadmap for RubyGems 4 and Bundler 3
Roadmap for RubyGems 4 and Bundler 3
Hiroshi SHIBATA794 views
Gemification for Ruby 2.5/3.0 by Hiroshi SHIBATA
Gemification for Ruby 2.5/3.0Gemification for Ruby 2.5/3.0
Gemification for Ruby 2.5/3.0
Hiroshi SHIBATA1.3K views
How to develop the Standard Libraries of Ruby? by Hiroshi SHIBATA
How to develop the Standard Libraries of Ruby?How to develop the Standard Libraries of Ruby?
How to develop the Standard Libraries of Ruby?
Hiroshi SHIBATA3.6K views
Dependency Resolution with Standard Libraries by Hiroshi SHIBATA
Dependency Resolution with Standard LibrariesDependency Resolution with Standard Libraries
Dependency Resolution with Standard Libraries
Hiroshi SHIBATA803 views
The details of CI/CD environment for Ruby by Hiroshi SHIBATA
The details of CI/CD environment for RubyThe details of CI/CD environment for Ruby
The details of CI/CD environment for Ruby
Hiroshi SHIBATA1.1K views
tDiary annual report 2009 - Sapporo Ruby Kaigi02 by Hiroshi SHIBATA
tDiary annual report 2009 - Sapporo Ruby Kaigi02tDiary annual report 2009 - Sapporo Ruby Kaigi02
tDiary annual report 2009 - Sapporo Ruby Kaigi02
Hiroshi SHIBATA1.5K views
Middleware as Code with mruby by Hiroshi SHIBATA
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
Hiroshi SHIBATA5.2K views
How to develop Jenkins plugin using to ruby and Jenkins.rb by Hiroshi SHIBATA
How to develop Jenkins plugin using to ruby and Jenkins.rbHow to develop Jenkins plugin using to ruby and Jenkins.rb
How to develop Jenkins plugin using to ruby and Jenkins.rb
Hiroshi SHIBATA1.1K views
An introduction and future of Ruby coverage library by mametter
An introduction and future of Ruby coverage libraryAn introduction and future of Ruby coverage library
An introduction and future of Ruby coverage library
mametter6.6K views

Similar to The Future of Bundled Bundler

The story of language development by
The story of language developmentThe story of language development
The story of language developmentHiroshi SHIBATA
11K views45 slides
RubyGems 3 & 4 by
RubyGems 3 & 4RubyGems 3 & 4
RubyGems 3 & 4Hiroshi SHIBATA
11.5K views64 slides
Gemification plan of Standard Library on Ruby by
Gemification plan of Standard Library on RubyGemification plan of Standard Library on Ruby
Gemification plan of Standard Library on RubyHiroshi SHIBATA
351 views14 slides
RubyStack: the easiest way to deploy Ruby on Rails by
RubyStack: the easiest way to deploy Ruby on RailsRubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on Railselliando dias
489 views30 slides
Boxen: How to Manage an Army of Laptops by
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of LaptopsPuppet
19.1K views166 slides
RubyConfBD 2013 decouple, bundle and share with ruby gems by
RubyConfBD 2013   decouple, bundle and share with ruby gems RubyConfBD 2013   decouple, bundle and share with ruby gems
RubyConfBD 2013 decouple, bundle and share with ruby gems nhm taveer hossain khan
902 views28 slides

Similar to The Future of Bundled Bundler(20)

The story of language development by Hiroshi SHIBATA
The story of language developmentThe story of language development
The story of language development
Hiroshi SHIBATA11K views
Gemification plan of Standard Library on Ruby by Hiroshi SHIBATA
Gemification plan of Standard Library on RubyGemification plan of Standard Library on Ruby
Gemification plan of Standard Library on Ruby
Hiroshi SHIBATA351 views
RubyStack: the easiest way to deploy Ruby on Rails by elliando dias
RubyStack: the easiest way to deploy Ruby on RailsRubyStack: the easiest way to deploy Ruby on Rails
RubyStack: the easiest way to deploy Ruby on Rails
elliando dias489 views
Boxen: How to Manage an Army of Laptops by Puppet
Boxen: How to Manage an Army of LaptopsBoxen: How to Manage an Army of Laptops
Boxen: How to Manage an Army of Laptops
Puppet19.1K views
Open Source Tools for Leveling Up Operations FOSSET 2014 by Mandi Walls
Open Source Tools for Leveling Up Operations FOSSET 2014Open Source Tools for Leveling Up Operations FOSSET 2014
Open Source Tools for Leveling Up Operations FOSSET 2014
Mandi Walls1.2K views
Middleware as Code with mruby by Hiroshi SHIBATA
Middleware as Code with mrubyMiddleware as Code with mruby
Middleware as Code with mruby
Hiroshi SHIBATA4.8K views
How to Begin to Develop Ruby Core by Hiroshi SHIBATA
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
Hiroshi SHIBATA2.9K views
Shipping Applications to Production in Containers with Docker by Jérôme Petazzoni
Shipping Applications to Production in Containers with DockerShipping Applications to Production in Containers with Docker
Shipping Applications to Production in Containers with Docker
Jérôme Petazzoni53.8K views
Using rbenv in Production by Nic Benders
Using rbenv in ProductionUsing rbenv in Production
Using rbenv in Production
Nic Benders1.9K views
Packaging perl (LPW2010) by p3castro
Packaging perl (LPW2010)Packaging perl (LPW2010)
Packaging perl (LPW2010)
p3castro2.1K views
Getting Started with Go by Steven Francia
Getting Started with GoGetting Started with Go
Getting Started with Go
Steven Francia39.8K views
Toolbox of a Ruby Team by Arto Artnik
Toolbox of a Ruby TeamToolbox of a Ruby Team
Toolbox of a Ruby Team
Arto Artnik422 views
Deploying your rails application to a clean ubuntu 10 by Maurício Linhares
Deploying your rails application to a clean ubuntu 10Deploying your rails application to a clean ubuntu 10
Deploying your rails application to a clean ubuntu 10
Maurício Linhares3.8K views
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊 by Po-Jen Lai
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
COSCUP 2016 - ROS + Gazebo機器人模擬器工作坊
Po-Jen Lai71.9K views
Node.js - The New, New Hotness by Daniel Shaw
Node.js - The New, New HotnessNode.js - The New, New Hotness
Node.js - The New, New Hotness
Daniel Shaw984 views
Exploring Ruby on Rails and PostgreSQL by Barry Jones
Exploring Ruby on Rails and PostgreSQLExploring Ruby on Rails and PostgreSQL
Exploring Ruby on Rails and PostgreSQL
Barry Jones3.2K views
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere by Ganesh Raju
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data EverywhereApache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Apache Bigtop and ARM64 / AArch64 - Empowering Big Data Everywhere
Ganesh Raju97 views
Rspec and Capybara Intro Tutorial at RailsConf 2013 by Brian Sam-Bodden
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013
Brian Sam-Bodden29.7K views

More from Hiroshi SHIBATA

How resolve Gem dependencies in your code? by
How resolve Gem dependencies in your code?How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?Hiroshi SHIBATA
40 views50 slides
How resolve Gem dependencies in your code? by
How resolve Gem dependencies in your code?How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?Hiroshi SHIBATA
15 views54 slides
Ruby コミッターと歩む Ruby を用いたプロダクト開発 by
Ruby コミッターと歩む Ruby を用いたプロダクト開発Ruby コミッターと歩む Ruby を用いたプロダクト開発
Ruby コミッターと歩む Ruby を用いたプロダクト開発Hiroshi SHIBATA
49 views14 slides
Why ANDPAD commit Ruby and RubyKaigi? by
Why ANDPAD commit Ruby and RubyKaigi?Why ANDPAD commit Ruby and RubyKaigi?
Why ANDPAD commit Ruby and RubyKaigi?Hiroshi SHIBATA
220 views17 slides
RailsGirls から始める エンジニアリングはじめの一歩 by
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩Hiroshi SHIBATA
846 views16 slides
Productive Organization with Ruby by
Productive Organization with RubyProductive Organization with Ruby
Productive Organization with RubyHiroshi SHIBATA
545 views18 slides

More from Hiroshi SHIBATA(9)

How resolve Gem dependencies in your code? by Hiroshi SHIBATA
How resolve Gem dependencies in your code?How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?
Hiroshi SHIBATA40 views
How resolve Gem dependencies in your code? by Hiroshi SHIBATA
How resolve Gem dependencies in your code?How resolve Gem dependencies in your code?
How resolve Gem dependencies in your code?
Hiroshi SHIBATA15 views
Ruby コミッターと歩む Ruby を用いたプロダクト開発 by Hiroshi SHIBATA
Ruby コミッターと歩む Ruby を用いたプロダクト開発Ruby コミッターと歩む Ruby を用いたプロダクト開発
Ruby コミッターと歩む Ruby を用いたプロダクト開発
Hiroshi SHIBATA49 views
Why ANDPAD commit Ruby and RubyKaigi? by Hiroshi SHIBATA
Why ANDPAD commit Ruby and RubyKaigi?Why ANDPAD commit Ruby and RubyKaigi?
Why ANDPAD commit Ruby and RubyKaigi?
Hiroshi SHIBATA220 views
RailsGirls から始める エンジニアリングはじめの一歩 by Hiroshi SHIBATA
RailsGirls から始める エンジニアリングはじめの一歩RailsGirls から始める エンジニアリングはじめの一歩
RailsGirls から始める エンジニアリングはじめの一歩
Hiroshi SHIBATA846 views
Productive Organization with Ruby by Hiroshi SHIBATA
Productive Organization with RubyProductive Organization with Ruby
Productive Organization with Ruby
Hiroshi SHIBATA545 views
The secret of programming language development and future by Hiroshi SHIBATA
The secret of programming  language development and futureThe secret of programming  language development and future
The secret of programming language development and future
Hiroshi SHIBATA1.1K views
How to Begin Developing Ruby Core by Hiroshi SHIBATA
How to Begin Developing Ruby CoreHow to Begin Developing Ruby Core
How to Begin Developing Ruby Core
Hiroshi SHIBATA1.9K views
Large-scaled Deploy Over 100 Servers in 3 Minutes by Hiroshi SHIBATA
Large-scaled Deploy Over 100 Servers in 3 MinutesLarge-scaled Deploy Over 100 Servers in 3 Minutes
Large-scaled Deploy Over 100 Servers in 3 Minutes
Hiroshi SHIBATA3.8K views

Recently uploaded

Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT by
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBITUpdates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBITShapeBlue
138 views8 slides
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueShapeBlue
147 views20 slides
The Power of Heat Decarbonisation Plans in the Built Environment by
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built EnvironmentIES VE
67 views20 slides
Future of AR - Facebook Presentation by
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook PresentationRob McCarty
54 views27 slides
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...ShapeBlue
93 views13 slides
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveNetwork Automation Forum
49 views35 slides

Recently uploaded(20)

Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT by ShapeBlue
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBITUpdates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
ShapeBlue138 views
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue by ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlueMigrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
Migrating VMware Infra to KVM Using CloudStack - Nicolas Vazquez - ShapeBlue
ShapeBlue147 views
The Power of Heat Decarbonisation Plans in the Built Environment by IES VE
The Power of Heat Decarbonisation Plans in the Built EnvironmentThe Power of Heat Decarbonisation Plans in the Built Environment
The Power of Heat Decarbonisation Plans in the Built Environment
IES VE67 views
Future of AR - Facebook Presentation by Rob McCarty
Future of AR - Facebook PresentationFuture of AR - Facebook Presentation
Future of AR - Facebook Presentation
Rob McCarty54 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue93 views
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive by Network Automation Forum
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLiveAutomating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Automating a World-Class Technology Conference; Behind the Scenes of CiscoLive
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha... by ShapeBlue
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
Mitigating Common CloudStack Instance Deployment Failures - Jithin Raju - Sha...
ShapeBlue113 views
State of the Union - Rohit Yadav - Apache CloudStack by ShapeBlue
State of the Union - Rohit Yadav - Apache CloudStackState of the Union - Rohit Yadav - Apache CloudStack
State of the Union - Rohit Yadav - Apache CloudStack
ShapeBlue218 views
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by ShapeBlue
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
ShapeBlue120 views
Backup and Disaster Recovery with CloudStack and StorPool - Workshop - Venko ... by ShapeBlue
Backup and Disaster Recovery with CloudStack and StorPool - Workshop - Venko ...Backup and Disaster Recovery with CloudStack and StorPool - Workshop - Venko ...
Backup and Disaster Recovery with CloudStack and StorPool - Workshop - Venko ...
ShapeBlue114 views
NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu287 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue52 views
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R... by ShapeBlue
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
Setting Up Your First CloudStack Environment with Beginners Challenges - MD R...
ShapeBlue105 views
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or... by ShapeBlue
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
Zero to Cloud Hero: Crafting a Private Cloud from Scratch with XCP-ng, Xen Or...
ShapeBlue128 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue63 views
DRBD Deep Dive - Philipp Reisner - LINBIT by ShapeBlue
DRBD Deep Dive - Philipp Reisner - LINBITDRBD Deep Dive - Philipp Reisner - LINBIT
DRBD Deep Dive - Philipp Reisner - LINBIT
ShapeBlue110 views
Declarative Kubernetes Cluster Deployment with Cloudstack and Cluster API - O... by ShapeBlue
Declarative Kubernetes Cluster Deployment with Cloudstack and Cluster API - O...Declarative Kubernetes Cluster Deployment with Cloudstack and Cluster API - O...
Declarative Kubernetes Cluster Deployment with Cloudstack and Cluster API - O...
ShapeBlue59 views
Data Integrity for Banking and Financial Services by Precisely
Data Integrity for Banking and Financial ServicesData Integrity for Banking and Financial Services
Data Integrity for Banking and Financial Services
Precisely76 views

The Future of Bundled Bundler

  • 1. The first step of package management integration Hiroshi SHIBATA / GMO Pepabo, Inc. 2019.04.20 RubyKaigi 2019 The Future of Bundled Bundler
  • 3. Hiroshi SHIBATA @hsbt https://www.hsbt.org Executive Officer VP of Engineering Technical Director at GMO Pepabo, Inc. @pepabo
  • 4. self.introduce => { name: “SHIBATA Hiroshi”, nickname: “hsbt”, organizations: [“ruby”, “rubygems”, “asakusarb”, “pepabo”, …], commit_bits: [“ruby”, “rake”, “rubygems”, “bundler”, “rdoc”, “psych”, “ruby-build”, “railsgirls”, “railsgirls-jp”, …], sites: [“hsbt.org”, “ruby-lang.org”, “rubyci.org”, “railsgirls.com”, “railsgirls.jp”], }
  • 6. self.introduce => ["hsbt", "udzura", "pyama", "kunit", "daiki", "sangun", "yamoto", "akatsuura", "tokky", "hayapi", "kenken", "azuki", "tosite", "tsumichan", "ryoma", "kymmt", "amacou", "kenchan", "nishihata", "tanaken", "kurotaky", "shimoju", "tascript", “ogidow”, “kaya”] We supported to 25 people for attending the RubyKaigi in this year.
  • 10. No.5
  • 11. Agenda •The Introduction of The Bundled Bundler •What’s happened in Ruby 2.6? •BugMash after releasing Ruby 2.6 •The Challenge for Bundler Integration •RubyGems 4.0 •The Roadmap for Ruby 3.0
  • 12. The Introduction of The Bundled Bundler 1. 3/40min
  • 13. Why should we integrate bundler to rubygems?
  • 15. RubyGems/Bundler integration in 2018 •We are working to integrate RubyGems and Bundler. But it’s no progress in the last year. •RubyGems 3 drop to support under the Ruby 2.2. •I’m working merging bundler into ruby core because Bundler 2 was released. Because Bundler 1.x still supports Ruby 1.8 and 1.9.
  • 16. Bundler Integration on rubygems.rb • It disabled in Ruby 2.5 because bundler is not part of standard library. • You can enabled it with only `gem update --system` if USE_BUNDLER_FOR_GEMDEPS ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path) require 'rubygems/user_interaction' Gem::DefaultUserInteraction.use_ui(ui) do require "bundler" @gemdeps = Bundler.setup Bundler.ui = nil @gemdeps.requested_specs.map(&:to_spec).sort_by(&:name) end else rs = Gem::RequestSet.new @gemdeps = rs.load_gemdeps path rs.resolve_current.map do |s| s.full_spec.tap(&:activate) end end
  • 17. Installer of RubyGems(not Ruby) • It’s provided by update_rubygems, setup.rb, setup_command.rb • Installer of RubyGems promote Bundler to default gems. def install_default_bundler_gem return unless Gem::USE_BUNDLER_FOR_GEMDEPS specs_dir = Gem::Specification.default_specifications_dir specs_dir = File.join(options[:destdir], specs_dir) unless Gem.win_platform? mkdir_p specs_dir (snip…) bundler_bin_dir = bundler_spec.bin_dir bundler_bin_dir = File.join(options[:destdir], bundler_bin_dir) unless Gem.win_platform? mkdir_p bundler_bin_dir bundler_spec.executables.each do |e| cp File.join("bundler", bundler_spec.bindir, e), File.join(bundler_bin_dir, e) end
  • 18. The current behavior of the bundled bundler •It integrates with default gems like json, psych. •The upstream is https://github.com/ bundler/bundler. I backport the released/developed version to ruby repository. •Ruby 2.6 always enabled Bundler gem_deps now(New!) ~ > gem list | rg default: bigdecimal (1.4.3, default: 1.4.2) bundler (default: 2.0.1, 1.17.3) cmath (default: 1.0.0) csv (3.0.6, default: 3.0.4) (snip) thwait (default: 0.1.0) tracer (default: 0.1.0) webrick (default: 1.4.2) zlib (default: 1.0.0)
  • 19. What’s happened in Ruby 2.6? 2. 8/40min
  • 20. What’s new in RubyGems 3 •I released RubyGems 3 at 19 Dec 2018 •https://blog.rubygems.org/2018/12/19/3.0.0-released.html •This version dropped to support the old Ruby versions like 1.8 and 1.9 •RubyGems 3 have a lot of features and bugfixes.
  • 22. Do protect your account of RubyGems.org
  • 23. Remove deprecated code • RubyGems have a lot of workarounds for old Ruby. They are branches like RUBY_VERSION, respond_to?, defined? - if [].respond_to? :flat_map - def pinned_requirement name # :nodoc: - requirement = Gem::Dependency.new name - specification = @set.sets.flat_map { |set| - set.find_all(requirement) - }.compact.first + def pinned_requirement name # :nodoc: + requirement = Gem::Dependency.new name
  • 24. What’s new in Bundler 2? •We disabled the incompatible features like renaming `gems.rb` from `Gemfile` •They no longer support under the Ruby 2.2. •There is no incompatible feature from Bundler 1.17.x.
  • 25. Only support Ruby 2.2+ • We can use Keywords argument, Refinement, Other cool features in RubyGems and Bundler now. • Finally, We got the simple build matrix
  • 26. Introduce `make test-bundler` •I added `test-prepare-bundler` for preparing to invoke rspec on ruby core repository. I put them into `.bundle` directory under the ruby repo and set it to `GEM_HOME` when running `make test-bundler` •Now, We can invoke bundler examples with miniruby each commits. when "bundler" `rm -rf lib/bundler* libexec/bundler libexec/bundle libexec/bundle_ruby spec/bundler man/bundle* man/gemfile*` `cp -r ../../bundler/bundler/lib/bundler* ./lib` `cp -r ../../bundler/bundler/exe/bundle* ./libexec` `cp ../../bundler/bundler/bundler.gemspec ./lib/bundler` `cp -r ../../bundler/bundler/spec spec/bundler` `cp -r ../../bundler/bundler/man/*.{1,5,1.txt,5.txt,ronn} ./man` `rm -rf spec/bundler/support/artifice/vcr_cassettes`
  • 27. The issues of bundler test suite. •The Bundler examples is hard way. •The most of Bundler examples are integration test. Example for invoking to `bundle exec` command and assert standard output. •Finally, I added `ruby_core` filter into bundler examples. Because some of examples expect that installed ruby interpreter like `/usr/local/bin/ruby` Finished in 52 minutes 54 seconds (files took 1.7 seconds to load) 2626 examples, 0 failures, 8 pending
  • 28. The location of execution wrapper • Ruby core put executable script directly under the bin directory. • We often faced conflict error when upgrading rdoc. • When You put ‘y’, You completely lost original executable. ~ > gem update rdoc Updating installed gems Updating rdoc Fetching: rdoc-6.0.4.gem (100%) rdoc's executable "rdoc" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/rdoc Overwrite the executable? [yN] y rdoc's executable "ri" conflicts with /Users/hsbt/.rbenv/versions/2.3.7/bin/ri Overwrite the executable? [yN] y Successfully installed rdoc-6.0.4 Gems updated: rdoc
  • 29. What’s happened? • RubyGems generate wrapper script for executable script of gem #!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby # # This file was generated by RubyGems. # # The application 'rdoc' is installed as part of a # this file is here to facilitate running it. # require 'rubygems' version = ">= 0.a" if ARGV.first str = ARGV.first str = str.dup.force_encoding("BINARY") if str.re if str =~ /A_(.*)_z/ and Gem::Version.correct? version = $1 ARGV.shift end end load Gem.bin_path('rdoc', 'rdoc', version) #!/Users/hsbt/.rbenv/versions/2.6.0-dev/bin/ruby # # RDoc: Documentation tool for source code # (see lib/rdoc/rdoc.rb for more information # # Copyright (c) 2003 Dave Thomas # Released under the same terms as Ruby begin gem 'rdoc' rescue NameError => e # --disable-gems raise unless e.name == :gem rescue Gem::LoadError end require 'rdoc/rdoc' begin r = RDoc::RDoc.new r.document ARGV rescue Errno::ENOSPC Gem wrapper Original executable
  • 30. Update BundlerVersionFinder •BundlerVersionFinder was introduced at RubyGems 2.7 •It ability is the version detection by RubyGems strictly. Ex. 1.17.3 matches only 1.17.3. •We update the filter condition. Now, 1.17.3 matches 1.x.y, 2.0.3 also matches 2.x.y. def self.bundler_version_with_reason if v = ENV["BUNDLER_VERSION"] return [v, "`$BUNDLER_VERSION`"] end if v = bundle_update_bundler_version return if v == true return [v, "`bundle update --bundler`"] end v, lockfile = lockfile_version if v return [v, "your #{lockfile}"] end end
  • 31. Merge Bundler into ruby src •I fixed the all of failures of Bundler examples with ruby core head. •At first, I did merge Bundler 2.0 to Ruby core because Bundler 2 dropped to support the old versions of Ruby. But Bundler 2.0 causes the issues on Heroku platform. •Heroku only support Bundler 1 at that time. •I backport the patches to Bundler 1.17 from 2.0 and merge Bundler 1.17 into ruby core.
  • 32. BugMash after releasing Ruby 2.6 3. 20/40min
  • 33. The issues after releasing Ruby 2.6 •Path Injection problem about rubylibdir to LOAD_PATH. •The installer generate invalid gemspec of Bundler. •The version switcher on Heroku.
  • 34. The path injection for LOAD_PATH issue •https://bugs.ruby-lang.org/issues/15469 •After that, You can’t use the specified version of gems like json or psych. It activates the versions of default gems provided by ruby core. - “/Users/user-name/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/bundler-1.17.2/lib" - “/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash” - "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.5.0/gems/json-1.8.6/lib" - (snip) - "/Users/user-name/.rbenv/versions/2.6.0/lib/ruby/2.6.0" - "/Users/user-name/.rbenv/rbenv.d/exec/gem-rehash" - "/Users/user-name/temp/aiueo/vendor/bundle/ruby/2.6.0/gems/json-1.8.6/lib" - (snip)
  • 35. The invalid gemspec generation issue •The installer of ruby core causes to generate invalid gemspec when you install ruby core. •https://bugs.ruby-lang.org/issues/15582 •Its file-list is the incomplete files by the bundled bundler. It activate the unexpected version of bundler with loading library.
  • 36. The bundler switcher issue of Heroku •https://github.com/heroku/heroku-buildpack-ruby/pull/850 •Heroku platform only uses version 1 of Bundler like 1.17.x. But Bundler version finder of RubyGems detects Bundler 1 or 2 from your Gemfile.lock. @schneems fixes this issue on heroku. •When You use Gemfile.lock updated by Bundler 2 with `bundle update -- bundler`, Heroku reject your app. Now you can use Ruby 2.6 and Bundler 2 on heroku. BLESSED_BUNDLER_VERSIONS = {} BLESSED_BUNDLER_VERSIONS["1"] = "1.15.2" BLESSED_BUNDLER_VERSIONS["2"] = "2.0.1"
  • 37. Ruby 2.6.3 is the best version ever
  • 38. The Challenge for Bundler Integration 4. 26/40min
  • 39. Dependency Resolver incompatible • RubyGems 2.x and 3.x uses Molinillo-0.5.7 • Bundler 1.x and 2.x also uses Molinillo-0.6.4 • These are different versions and behavior of dependency resolver. ~/D/g/r/rubygems (master) > ls lib/rubygems/resolver/molinillo/lib/molinillo delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb dependency_graph errors.rb modules resolver.rb ~/D/g/b/bundler (master) > ls lib/bundler/vendor/molinillo/lib/molinillo compatibility.rb dependency_graph errors.rb modules resolver.rb delegates dependency_graph.rb gem_metadata.rb resolution.rb state.rb
  • 40. RubyGems 3.1 with Molinillo-0.6.x • I try to upgrade Molinillo-0.6.x on RubyGems. https://github.com/rubygems/rubygems/pull/2026 ~/D/g/r/rubygems (molinillo-0-6-3) > env GEMSRC_SKIP=true rake test Gem::Indexer tests are being skipped. Install builder gem. Run options: --seed 2600 # Running: ........................................................................................................... ....................................E..............................................E....................... ........E..................E....E......................F.........FF.F.FFFF....F...F.....F.................. ........................................................................................................... .....................................................................................................E..... ...................................................S.....................S................................. ........................................................................................................... ...........
  • 41. Duplicates the certificates • RubyGems and Bundler stored the duplicated certificates in your box. I fixed this at r67539 ~/D/g/r/rubygems (master) > fd . lib/rubygems/ssl_certs/ lib/rubygems/ssl_certs/index.rubygems.org lib/rubygems/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem lib/rubygems/ssl_certs/rubygems.org lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem ~/D/g/r/rubygems (master) > fd . bundler/lib/bundler/ssl_certs/ bundler/lib/bundler/ssl_certs/index.rubygems.org bundler/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net bundler/lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem bundler/lib/bundler/ssl_certs/rubygems.org bundler/lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem Fixed
  • 42. Activation issues about default gems •You couldn’t use the specified version of default gems like json when RubyGems/Bundler activated them. •When rubygems uses json-2.1.0, You couldn’t use json 1.8.x. Because ruby gems and rubygems.org never uses JSON format. •We can resolve it with `vendoring` approach. But json, psych, and openssl is C extension library.
  • 43. Namespace? •It may resolve with namespace feature with Ruby core. •https://bugs.ruby-lang.org/issues/10320 •https://bugs.ruby-lang.org/issues/13847 •When rubygems used psych with shared library like libyaml-x.y.z, Ruby can’t resolve this problem. •Please pick me with discuss about this if you have a nice idea. require 'libfile', into: :Lib
  • 45. RubyGems 4 • It has non-compatible features. • Make enable as default for conservative option: https:// github.com/rubygems/rubygems/pull/2233 • Behaviour changes with default gems installer: https:// github.com/rubygems/rubygems/pull/2166 • Make ruby gem install to user-install by default: https:// github.com/rubygems/rubygems/issues/1394
  • 46. Make conservative option as default • We got the installation time when already installed gems. • To use conservative is ignore re-install action. ~ > gem i rails clone http://rubyonrails.org -> /Users/hsbt/Documents/rubyonrails.org git ls-remote http://rubyonrails.org hg identify http://rubyonrails.org svn info http://rubyonrails.org error Could not find version control system: http://rubyonrails.org exists /Users/hsbt/Documents/github.com/rails/rails Successfully installed rails-5.2.0 1 gem installed ~ > gem i rails ——conservative ~ >
  • 47. Change behavior of default option • `gem install --default` put gemspec into default gem directory. • But it is not put and build the library files like .rb and native extensions. • I hope to install completely library like csv-1.0.2 into the old Ruby versions. ~ > gem i csv --default Fetching: csv-1.0.2.gem (100%) Successfully installed csv-1.0.2 as a default gem 1 gem installed ~ > ls ~/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/csv-1.0.2/ ~ >
  • 48. Make `--user-install` as default • RubyGems 4 will install the all gems to `~/.gem` maybe. • Pros: Ruby in linux distribution has many of FAQ for gem installation for using `sudo`. This change resolve this issues. • Cons: Ruby version manager like rbenv is not support it. And RubyGems have a lot of issues related this.
  • 49. RubyGems still have a lot of issues • When you share GEM_HOME in your box, You faced… • RubyGems always show the warnings for missing extension with platform mismatch. You always get the warnings with `jruby-lanucher`. (I fixed this in upstream) • RubyGems will activate the different platform with same version like nokogiri-1.10.1 and 1.10.1-java. • RubyGems will remove gem that was failed to `gem pristine`
  • 50. We always welcome your patch.
  • 51. Roadmap for Ruby 3.0 6. 35/40min
  • 52. The policy of RubyGems merging •The RubyGems accepts SemVer like versioning Policy. •Merge latest stable version into Ruby Core •Ruby 2.6.0 bundled RubyGems 3.0 •Ruby 2.7.0 will bundle RubyGems 3.1 or 3.2(TBD) •Ruby 3.0 will bundle RubyGems 4.0 or ?
  • 53. Security release of RubyGems •RubyGems have HackerOne. •3 people handle vulnerability issues and will release RubyGems by SemVer like policy like “2.7.7” from “2.7.6” •On the other hand, The Ruby core team will back port only vulnerability fixes by independent version like “2.6.5.1”, not “2.7.7”
  • 54. Support JRuby and TruffleRuby •Surprisedly, RubyGems and Bundler never test JRuby and TruffleRuby in CI. •We try to add JRuby and TruffleRuby to Travis or other CI environments. •To JRuby and TruffleRuby tam: Please join us for this support.
  • 55. RubyGems/Bundler integration(1) •Now, We put the bundler as submodule in rubygems repository. •We will move the canonical repository of bundler to rubygems org or rubygems/ rubygems.
  • 56. RubyGems/Bundler integration(2) •We will merge into RubyGems 3.2 and Bundler 2.1 into Ruby 2.7.0. After that, RubyGems 4.0 will be merge Ruby 3. Ruby Bundler RubyGems 2.7.0 3.02.7-rcX 3.1 2.0 3.0 2.1 3.2 3.0? 4.0 ?
  • 57. RubyGems/Bundler integration(3) •Unify the duplicated code and configuration like the certificates. •We have a plan to separate bundler-runtime and bundler- cli. After that, We will merge bundler-runtime into rubygems. •I need to learn cargo and npm/yarn for the feature UI.
  • 58. Rap-Up •The Introduction of The Bundled Bundler •What’s happened in Ruby 2.6? •BugMash after releasing Ruby 2.6 •The Challenge for Bundler Integration •RubyGems 4.0 •Roadmap for Ruby 3.0
  • 59.
  • 60.