From 41ffe6c113ccbedcedc3da29d5736b835cccfab4 Mon Sep 17 00:00:00 2001 From: Nathan Wong Date: Thu, 22 Feb 2024 11:23:32 +0000 Subject: [PATCH] Update "Ruby gems" article with aliases We've recently started using ruby alias versions in R&D to mitigate issues with versions on our CI where only the most recent patch version is available. This modification to the "The better way with Ruby Gems" article introduces the concept of Ruby version aliases and how to configure them, as well as touching on the advantages / disadvantages of taking this route. --- content/authors/authors.json | 4 ++ content/authors/avatars/nathan.jpg | Bin 0 -> 27796 bytes .../29/the-better-way-with-ruby-gems/post.md | 43 +++++++++++++++--- 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 content/authors/avatars/nathan.jpg diff --git a/content/authors/authors.json b/content/authors/authors.json index a1774b7f..c49e2e8c 100644 --- a/content/authors/authors.json +++ b/content/authors/authors.json @@ -82,5 +82,9 @@ "Anjali Goyal": { "avatar": "anjali_goyal.jpg", "role": "Senior QA Engineer - Customer Success" + }, + "Nathan Wong": { + "avatar": "nathan.jpg", + "role": "Principal Mobile Engineer - R&D" } } diff --git a/content/authors/avatars/nathan.jpg b/content/authors/avatars/nathan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68363a8b680090a73e78c58ad9e2355210edddf8 GIT binary patch literal 27796 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 literal 0 HcmV?d00001 diff --git a/content/posts/2023/09/29/the-better-way-with-ruby-gems/post.md b/content/posts/2023/09/29/the-better-way-with-ruby-gems/post.md index 028018bc..95d4ae4d 100644 --- a/content/posts/2023/09/29/the-better-way-with-ruby-gems/post.md +++ b/content/posts/2023/09/29/the-better-way-with-ruby-gems/post.md @@ -4,7 +4,7 @@ Using Ruby Gems to ensure that everyone in the project shares the same setup. ![](assets/the_better_way_ruby_gems.png) -Authors: Arthur Alves +Authors: Arthur Alves, Nathan Wong Date: 2023-09-29 Category: mobile @@ -31,7 +31,7 @@ A solution to maintain all these alignments, regardless of how many projects you **_Versions specified here are illustrative. Choose your versions carefully in accordance with your team._** -#### **1.** Multiple Ruby versions. +### 1. Multiple Ruby versions. **1.1** Install RBENV @@ -123,7 +123,7 @@ This will create the file `.ruby-version`. This file should be committed, so tha **_Later, if you want to change the version, make sure it’s installed with `rbenv` and run the `local` command again, i.e: `rbenv local 3.1.2`._** -#### **2.** Using Ruby Gems. +### 2. Using Ruby Gems. You’ve managed to have multiple versions of Ruby and set different versions for different repositories. Now, we’re set to use Ruby Gems. @@ -165,7 +165,7 @@ Then proceed to run `bundle install` again._** **_`Gemfile.lock` should also be committed._** -##### **3.** Running your tools. +### 3. Running your tools. By now your project has a locked version of Ruby, which everyone can install without conflicting with other setups/projects. And you have most of the tools you need, such as Cocoapods and Fastlane, installed in a similar manner, as Ruby Gems. @@ -185,7 +185,6 @@ bundle exec pod install bundle exec fastlane ``` --- You can make this easier by creating an alias in your `~/.zshrc` or `~/.bashrc` file: @@ -198,4 +197,36 @@ From now on, the commands above could be used as: ```bash bx pod install bx fastlane -``` \ No newline at end of file +``` + +## Using Ruby aliases + +When aligning Ruby versions across a team, or with a CI platform that you don't have full control over, +using explicit versions in the `.ruby-version` file may result in unexpected build failures. + +One way to mitigate this is by configuring version aliases. An aliased version allows us to specify a minor +version in the `.ruby-version` file (eg. `3.2`) - then each engineer's machine would define an alias from +this version to the patch version that they have installed locally (`3.2.1`, `3.2.2` or `3.2.3`). + +Aliases can be configured on a machine by using the [rbenv-aliases](https://github.com/tpope/rbenv-aliases) plugin for rbenv. + +``` +mkdir -p "$(rbenv root)/plugins" +git clone https://github.com/tpope/rbenv-aliases.git \ + "$(rbenv root)/plugins/rbenv-aliases" +rbenv alias --auto +``` + +This will automatically configure aliases for each minor version to the most recent patch version, and +update `rbenv` so that future installed versions will update any aliases where appropriate. + +You can then update the `.ruby-version` file with the aliased version: + +``` +rbenv local 3.2 +``` + +There are some negatives to this approach: by not pinning specific versions, we may start to observe different +behaviour if aliasing to different ruby versions on different machines. Using the command `rbenv install` will +also no longer work when `.ruby-version` points to an aliased version - it's necessary to explicitly +provide the Ruby version that should be installed.