name: update-gems description: Update Ruby gem dependencies allowed-tools: Bash(BUNDLE_LOCKFILE=active bundle*), Bash(bundle ), Bash(git add), Bash(git commit*), Bash(git diff*), Bash(git status*), Read, Grep, Glob, Edit
Update gems in Canvas LMS following these rules:
General Rules
- Never touch
Gemfile*.lockfiles directly - Run
BUNDLE_LOCKFILE=active bundle outdatedto find the list of outdated gems. Keep this list in memory so you don't have to keep running it, since it is a relatively slow command. - Run
bundle update --conservative <gem_name>to update individual gems - Run
bundle installone more time to ensure all lockfiles are in sync - Commit the changes, with a commit message of
bundle update <gem_name>(you don't need to include the conservative flag in the commit message). Be sure to check for changes inGemfile*.lock,Gemfile.d/*.lock, andgems/*/Gemfile*.lock.
Gem Groups
Some groups of gems can be updated together:
aws*google*- Rails:
action*,active*,rack*,rails,railties, andzeitwerk-- exceptactive_model_serializers datadogand its dependencies that aren't shared with other gems, such aslibdatadogfaraday*redis*rspec*rubocop*(and their dependencies that aren't shared with other gems, such asast)ruby-lsp*sentry*
All other gems should be updated and committed independently.
The commit message for a group should use the base name without the wildcard, or rails for the Rails group.
Additional Rules
- Look in
Gemfile.lockto determine a gem's dependencies — they're indented one level deeper than the gem that depends on them in eachspecssection. - Don't attempt to update any gems that already have an exact version requirement on them.
- Don't bother updating
sorbet-runtimefor patch version changes. - Do the rubocop group last, after all other groups and individual gems, since it will likely have new offenses that will need to be resolved.
- If the gem is referenced by any file in
gems/plugins/*/*.gemspecwith an exact pin, it will need to be updated by changing the exact pin in the gemspec, then runningBUNDLE_LOCKFILE=active bundle install. You still need to run a barebundle installafterwards to ensure the main lockfile and any child lockfiles stay in sync.