Ruby 3 prep: Update ReleaseTools::Version#slug to return a ReleaseTools::Version
What does this MR do and why?
In moving from Ruby 2 to Ruby 3, the implicit return in some of ReleaseTools::Version
s methods breaks. We see in this sample console output, Ruby 2.7.7 #slug
returns an instance of ReleaseTools::Version
, but in Ruby 3.2.1, it does not (seen in command [5]):
# Ruby 2.7.7
[1] pry(main)> v = ReleaseTools::Version.new('1.0.0')
=> "1.0.0"
[2] pry(main)> v.is_a?(ReleaseTools::Version)
=> true
[3] pry(main)> v.is_a?(String)
=> true
[4] pry(main)> v.tag.is_a?(ReleaseTools::Version)
=> false
[5] pry(main)> v.slug.is_a?(ReleaseTools::Version)
=> true
[6] pry(main)> v.slug.is_a?(String)
=> true
[7] pry(main)> v.tag.is_a?(String)
=> true
# Ruby 3.2.1
[1] pry(main)> v = ReleaseTools::Version.new('1.0.0')
=> "1.0.0"
[2] pry(main)> v.is_a?(ReleaseTools::Version)
=> true
[3] pry(main)> v.is_a?(String)
=> true
[4] pry(main)> v.tag.is_a?(ReleaseTools::Version)
=> false
[5] pry(main)> v.slug.is_a?(ReleaseTools::Version)
=> false
[6] pry(main)> v.slug.is_a?(String)
=> true
[7] pry(main)> v.tag.is_a?(String)
=> true
This breaks the ability to chain ReleaseTools::Version
methods in ways like version.slug.tag
which we see in ReleaseTools::PublicRelease::CngImageRelease. The tests for that class failed when run against Ruby 3.2.1:
Failures:
1) ReleaseTools::PublicRelease::CNGImageRelease#distribution_component_versions returns the component versions for CE and EE
Failure/Error: ce_data['variables'][file] = @gitlab_version.slug.tag(ee: false)
NoMethodError:
undefined method `tag' for "42-0-0":String
# ./lib/release_tools/public_release/cng_image_release.rb:153:in `block in distribution_component_versions'
# ./lib/release_tools/public_release/cng_image_release.rb:152:in `each'
# ./lib/release_tools/public_release/cng_image_release.rb:152:in `distribution_component_versions'
# ./spec/lib/release_tools/public_release/cng_image_release_spec.rb:237:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:48:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:47:in `block (2 levels) in <top (required)>'
2) ReleaseTools::PublicRelease::CNGImageRelease#distribution_component_versions respects MAILROOM_VERSION value
Failure/Error: ce_data['variables'][file] = @gitlab_version.slug.tag(ee: false)
NoMethodError:
undefined method `tag' for "42-0-0":String
# ./lib/release_tools/public_release/cng_image_release.rb:153:in `block in distribution_component_versions'
# ./lib/release_tools/public_release/cng_image_release.rb:152:in `each'
# ./lib/release_tools/public_release/cng_image_release.rb:152:in `distribution_component_versions'
# ./spec/lib/release_tools/public_release/cng_image_release_spec.rb:270:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:48:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:47:in `block (2 levels) in <top (required)>'
Failed examples:
rspec ./spec/lib/release_tools/public_release/cng_image_release_spec.rb:227 # ReleaseTools::PublicRelease::CNGImageRelease#distribution_component_versions returns the component versions for CE and EE
rspec ./spec/lib/release_tools/public_release/cng_image_release_spec.rb:260 # ReleaseTools::PublicRelease::CNGImageRelease#distribution_component_versions respects MAILROOM_VERSION value
This MR updates the #slug
method to explicitly return an instance of ReleaseTools::Version
to fix that problem and get the tests passing in preparation for upgrading to Ruby 3.
By making this change while we are still running on Ruby 2.7.7, this proves that these changes are also compatible with our current version.
Author Check-list
- [-] Has documentation been updated?
Related to gitlab-com/gl-infra/delivery#2864 (closed)