Skip to content

Ruby 3 prep: Update ReleaseTools::Version#slug to return a ReleaseTools::Version

Steve Abrams requested to merge ruby-3-version-class-updates into master

What does this MR do and why?

In moving from Ruby 2 to Ruby 3, the implicit return in some of ReleaseTools::Versions 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)

Edited by Steve Abrams

Merge request reports