Talks

Working towards Bundler 3

Bundler hit a big milestone this year with the release of Bundler 2 🎉, but not without its bumps and hurdles. We'll look into the problems that some of our users have been experiencing after the Bundler 2 release, what the core team has been doing to fix these issues and what we've since learned. Afterwards, We'll look at the upcoming Bundler 2.1 and Bundler 3 releases.

RubyKaigi 2019

00:00:00.030 Konnichiwa! Thank you for coming to my talk, especially so late in the day. I know we all have tight schedules. I promise this won't be super long, and we can look forward to beers afterwards.
00:00:07.770 My name is Colby Swandale, and this talk is about Bundler and what's been happening with it recently.
00:00:13.950 You can find me on Twitter at OceanicPanda. I'm usually pretty active there. I am one of the maintainers of Bundler, and I'm also its current release manager.
00:00:20.689 I look after putting together releases and then actually shipping them to our users. I am also a core team member of RubyGems, but I predominantly spend my time on Bundler.
00:00:33.809 I live in Australia, specifically in a city called Melbourne. This might look a bit upside down to you all since we are in the northern hemisphere.
00:00:46.980 Melbourne is known best for its sports, coffee, and music, but it is infamously known for its weather. For anyone who knows what I'm talking about, it can be sunny for the first half of the day and then turn completely rainy in the next half.
00:01:08.820 I work at a company called Envato, which is a marketplace for creative assets and creative people. I'm part of the content warehouse team, where I manage the content uploaded by our authors.
00:01:19.650 If you're new to Ruby, firstly, welcome! I hope you've been enjoying the conference so far. If you're unfamiliar with Bundler, I'll do a quick recap on what it is and what it does.
00:01:36.900 Bundler is a tool that helps manage your project dependencies. To use Bundler, you create a special file called a Gemfile.
00:01:52.649 In your Gemfile, you typically specify two things. The first is the source, so where you want to fetch your gems from. The official public repository for all Ruby gems is rubygems.org.
00:02:05.759 The second thing you normally specify are the projects or applications that your application depends on. For example, you might specify Rails. Once you create that Gemfile, you then run what's called 'bundle install'.
00:02:23.680 This command takes your Gemfile and goes through all your dependencies, checking their dependencies and ensuring that all the versions can work together.
00:02:34.660 It will then produce a Gemfile.lock, which specifies all the resolved dependencies and their versions. You can check this into Git and share it with others.
00:02:44.320 When they run 'bundle install', they can have the exact same versions and dependencies as you've installed. Finally, inside your application, you specify 'require bundler' and start requiring your dependencies.
00:02:54.100 The Bundler core team has been very busy over the past twelve months. We've been active in getting things shipped and fixing bugs while also planning for the future.
00:03:06.620 The first big update was Bundler 1.17, where we introduced several new features, such as the 'bundler remove' command and added a bunch of new options to existing commands.
00:03:21.320 We also added new features to 'bundle doctor' to help diagnose any issues within your local environment.
00:03:35.240 With the release of Bundler 2, I will talk about that shortly, we introduced substantial changes, such as dropping support for Ruby 2.4 and older RubyGems versions.
00:03:43.530 This change allowed us to clean up a lot of compatibility code that we've had for the past ten years.
00:03:51.160 This makes shipping new features faster because we no longer need to worry about supporting obsolete versions.
00:04:02.920 Unfortunately, the release of Bundler 2 did not go as planned, as many of you probably know.
00:04:10.610 The first of January, we released a blog post detailing the breaking changes. We intended for the list of changes to be small so as not to break too many things.
00:04:24.240 As the organizer of this release, I was super excited. It was my first time managing such a big change, and there was quite a bit of nervousness.
00:04:36.620 However, as soon as we pushed Bundler 2 to rubygems.org, we started getting complaints from our users.
00:04:43.590 The first issues reported involved CI systems, especially those running Ruby on macOS. This became a significant problem because we had broken many setups.
00:05:00.480 Additionally, we inadvertently required users to run 'gem update' RubyGems, which caused significant disruption.
00:05:15.330 I issued an update quickly, but it took a lot of effort after the initial release, and these problems escalated.
00:05:30.600 To address the issue, we decided to backtrack the RubyGems requirements, reverting them to a more suitable version.
00:05:36.600 We faced a couple of fundamental problems, including how RubyGems resolves gem installations and deal with already established environments.
00:06:00.819 In conclusion, RubyGems does not typically take into account the Ruby version you're installing into, which led to user confusion.
00:06:24.360 Many users were accustomed to simply running 'gem install bundler' because it worked for years without hassle.
00:06:36.960 However, the automatic fetching of the latest versions created issues, especially in CI environments.
00:06:45.960 When users tried to install Bundler, they often faced errors if their Ruby environment did not meet the new requirements due to RubyGems' behavior.
00:07:02.570 The second problem involved how the versions interact. RubyGems introduced a version resolver that sometimes caused confusion.
00:07:16.560 This version resolver had been in RubyGems for about two years, but it only gained traction during our Bundler 2 release.
00:07:28.070 The version resolver removes the requirement for users to specify the exact version of Bundler for their setup.
00:07:41.680 This was intended to simplify workflows, enabling smooth transitions between different versions of Bundler.
00:07:57.890 However, a substantial number of projects exist that still depend on the legacy versions. Missing clarification can cause frustrating errors.
00:08:14.270 When RubyGems encounters these issues, it can often result in cryptic error messages that don't effectively guide users on how to resolve them.
00:08:31.060 A common scenario is users running into situations where they think they have compatible setups, only to be confronted with seemingly random errors.
00:08:48.050 Our team is currently focused on addressing these issues with thorough documentation to summarize the new requirements.
00:09:06.020 We believe that educating users about how to solve some of these problems will greatly enhance their experience and reduce confusion.
00:09:22.330 We are working on providing better solutions in the future for Bundler and RubyGems to help ease transitions.
00:09:38.450 Communication has also been an ongoing challenge. Specifically, key discussions sometimes took place in private spaces.
00:09:49.430 As a result, important decisions weren't always accessible in public forums. We recognize this as a problem.
00:10:01.170 Going forward, we are committed to moving all our decision-making processes to public platforms, especially GitHub.
00:10:09.940 This transparent approach means that everyone can see discussions and participate, reducing misunderstandings and promoting clarity.
00:10:18.580 The overall goal is to improve the major release processes and ensure the community is engaged throughout.
00:10:25.570 As we move towards Bundler 3, there are a few anticipated changes.
00:10:29.880 For starters, we aim to increase support for CI systems and eliminate inconsistencies.
00:10:35.600 Additionally, there will be a focus on testing on various platforms, such as Windows and JRuby.
00:10:41.540 Another significant upcoming release is Bundler 2.1, targeting recent issues to improve features and capabilities.
00:10:52.230 We're eager to introduce several new commands and improve the overall user experience with our releases.
00:11:04.830 As we enter the development cycle for Bundler 3, we want to make deprecation measures clear and manageable for users.
00:11:15.490 We're designing it to provide ample time for transition, with clear communications detailing what to expect.
00:11:28.300 As we implement these changes, we aim to remain sensitive to user needs and improve Bundler's performance.
00:11:34.530 Turning our attention to the user feedback we've gathered, we've identified several key areas of improvement.
00:11:41.600 One crucial point is the ability for Bundler to directly read prior Bundler1 lock files, providing a better upgrade experience.
00:11:52.890 While we plan to throw errors to signal upgrades, our focus here is about educating users on adapting to Bundler 2.
00:12:02.940 As we approach all these goals, effective communication and user engagement remain front and center.
00:12:08.880 We will aim for transparency in discussions, including creating RFCs, to notify users of changes well in advance.
00:12:19.330 Understanding that breaking changes can disrupt established workflows, we are committed to minimizing these disruptions wherever possible.
00:12:37.360 As a final point, I want to express my gratitude for your patience as the Bundler team works through these changes. We appreciate it greatly.
00:12:53.520 If you have any issues or need updates regarding Bundler or RubyGems, feel free to reach out via GitHub.
00:13:00.980 Thank you for your attention, and now I am open to any questions.