-
Notifications
You must be signed in to change notification settings - Fork 32
Description
We know that rubygems 3.33.22 / bundler 2.3.21 is required for basic support of linux-gnu and linux-musl platform names; but buggy bundler behavior prior to 2.5.6 may cause challenges for some users.
This issue is to record some research into how the default versions behave with different native platform gems, and to document recommendations for maintainers as to how and when to ship linux-gnu and linux-musl versions.
testing
To help test this, I published "linux + linux-musl" and "linux-gnu + linux-musl" combinations of the gem rcee_precompiled which you can find at https://rubygems.org/gems/rcee_precompiled/versions.
- v0.5.0 and v0.5.0.1 are "linux + linux-musl"
- v0.5.1 is `"linux-gnu + linux--musl"
Note that the versions in question being tested below are:
| ruby | gem | bundler |
|---|---|---|
| 3.0 | 3.2.33 | 2.2.33 |
| 3.0 (updated rubygems) | 3.5.7 | 2.5.7 |
| 3.1 | 3.3.26 | 2.3.26 |
| 3.2 | 3.4.19 | 2.4.19 |
| 3.3 | 3.5.3 | 2.5.3 |
and the alpine containers have build-base installed to compile the source gem if necessary.
We test Ruby 3.0 with updated rubygems because its default version is below the known minimum needed for this to work correctly (3.3.22).
testing gem install
| target | linux + linux-musl (v0.5.0.1) | linux-gnu + linux-musl (v0.5.1) |
|---|---|---|
| 3.0 gnu | ✔ installs -linux |
🤷 installs source gem |
| 3.0 musl | ✖ installs -linux |
🤷 installs source gem |
| 3.0 gnu (updated rubygems) | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.0 musl (updated rubygems) | ✔ installs -linux-musl |
✔ installs -linux-musl |
| 3.1 gnu | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.1 musl | ✔ installs -linux-musl |
✔ installs -linux-musl |
| 3.2 gnu | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.2 musl | ✔ installs -linux-musl |
✔ installs -linux-musl |
| 3.3 gnu | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.3 musl | ✔ installs -linux-musl |
✔ installs -linux-musl |
testing bundle install
| target | linux + linux-musl (v0.5.0.1) | linux-gnu + linux-musl (v0.5.1) |
|---|---|---|
| 3.0 gnu | ✔ installs -linux |
🤷 installs source gem |
| 3.0 musl | 🤷 installs source gem | 🤷 installs source gem |
| 3.0 gnu (updated rubygems) | ✖ fails to install [1] | ✔ installs -linux-gnu |
| 3.0 musl (updated rubygems) | ✔ installs -linux-musl |
✔ installs -linux-musl |
| 3.1 gnu | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.1 musl | ✔ installs -linux-musl |
✔ installs -linux-musl |
| 3.2 gnu | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.2 musl | ✔ installs -linux-musl |
✔ installs -linux-musl |
| 3.3 gnu | ✔ installs -linux |
✔ installs -linux-gnu |
| 3.3 musl | ✖ installs -linux |
✔ installs -linux-musl |
Error [1]:
Could not find gems matching 'rcee_precompiled (= 0.5.0.1)' valid for all resolution platforms (aarch64-linux-musl,
aarch64-linux, arm-linux-musl, arm-linux, arm64-darwin, x86-linux-musl, x86-linux, x86_64-darwin, x86_64-linux-musl) in
rubygems repository https://rubygems.org/ or installed locally.
The source contains the following gems matching 'rcee_precompiled (= 0.5.0.1)':
* rcee_precompiled-0.5.0.1-aarch64-linux
* rcee_precompiled-0.5.0.1-aarch64-linux-musl
* rcee_precompiled-0.5.0.1-arm-linux
* rcee_precompiled-0.5.0.1-arm-linux-musl
* rcee_precompiled-0.5.0.1-arm64-darwin
* rcee_precompiled-0.5.0.1
* rcee_precompiled-0.5.0.1-x64-mingw-ucrt
* rcee_precompiled-0.5.0.1-x64-mingw32
* rcee_precompiled-0.5.0.1-x86-linux
* rcee_precompiled-0.5.0.1-x86-linux-musl
* rcee_precompiled-0.5.0.1-x86_64-darwin
* rcee_precompiled-0.5.0.1-x86_64-linux
* rcee_precompiled-0.5.0.1-x86_64-linux-musl
Recommendations
Given the inconsisent behavior of gem and bundle when the gem in question ships linux and linux-musl platform gems, it seems pretty clear that it's not a good idea to do this.
So the recommendation has to be:
- either:
- ship a
-linuxplatform gem that works for both gnu and musl systems, - or ship both
-linux-gnuand-linux-muslplatform gems.
- ship a
- do NOT ship
-linuxand-linux-muslplatform gems for the same version.
The installation docs for users should contain some warnings:
- end users on Ruby 3.0 must be using gem 3.3.22 or later / bundler 2.3.21 or later to get basic support for precompiled gems (will fall back to installing the vanilla "ruby" platform gem) set
required_rubygems_versionfor native gems that specify the linux libc rake-compiler#236 - end users on musl systems should be using bundler 2.5.6 or later to avoid on musl systems, bundler does not include the relevant
muslnative gem platform in the lock file ruby/rubygems#7432