Skip to content

Commit

Permalink
Announce monorepo
Browse files Browse the repository at this point in the history
  • Loading branch information
JonRowe committed Nov 27, 2024
1 parent 85f3381 commit cb801d7
Showing 1 changed file with 79 additions and 0 deletions.
79 changes: 79 additions & 0 deletions source/blog/2024-11-27-introducing-the-monorepo.html.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
---
title: Introducing the RSpec monorepo, and some updates on the future of RSpec.
author: Jon Rowe
no_comments: true
publish: true
---

## The quick version

We're switching to a monorepo out of the `rspec/rspec` repository on Github. The `main`
branch is a combination of all the repos `main` branches, `dev` is rebased on this during
the transition phase with the intent of `main` becoming the default when this is complete.

Please switch any git dependencies to at least `main` if not `dev`.

## The full story...

Since the early days of RSpec, it has consisted of multiple gems. The trio of
`rspec-core`, `rspec-expectations` and `rspec-mocks` containing the bulk of
the code, with the `rspec` metagem just deferring to these, and eventually the
`rspec-support` gem containing shared code.

At the time of creation these were all individual repos, and they have remained as such over
the lifetime of RSpec. There is an additional core repository, `rspec-dev` that contains tools
for dealing with the multiple repositories, creating PRs with shared updates, dealing with our
various maintenance branches.

Over time this situation has made it harder to coordinate work, for example requiring pinning PRs
against each other; harder to fix simple issues, for example you can't just edit a CI file to fix
an issue, you have to do so in rspec-dev, run commands to run them against all repositories, then
rebase off a maintenance branch and do so again; and harder to perform releases beyond single
repository patch versions.

We have been wanting to combine the repositories into one for some time, and it was just a matter
of finding the "right time", one of our alumni Yuji Nakayama, who wrote a great upgrade tool for
RSpec 2 to 3, also created the repository_merger gem that makes this possible.

But somehow it was never the right time, so finally, we're just jumping in and doing it...

So from this week, RSpec is now a monorepo for all future development.

## Step we intend to take

1. Make the `rspec` repo public, its been private as a work in progress but now we're ready for help.
2. Transfer any open issues from the various repositories to the monorepo, then prevent new ones from
being opened, and update the repo's READMEs.
3. Work on bringing the build for `3-13-maintenance` across so patches can be issued from the monorepo,
but if we fail at this we will publish and backport any patches required across to the old repositories.
4. Bring across the remaining rspec-dev tooling, for example documentation generation, into the monorepo.
5. Bring across any PRs that can be salvaged, this may seem harsh but some are quite stale at this
point, and they can always be reopened once rebased off the new repository. This has honestly
been the main pain point for switching to a monorepo.

## What's next?

After the monorepo has stabilised, with its `main` being the default branch, what else does the future
hold for RSpec?

Our immediate plan has always been to begin resurrecting the RSpec 4 work that has languished, but
pragmatism here leads me to say that some of those changes may be postponed, but the next version of
the core gems will be at least "a version of RSpec 4", with some of the things we previously wanted
to bring forward within it, and later improvements to follow.

Primarily though we will be using the opportunity to change our supported Ruby policy, previously we
have stuck with a very strict version of semver where we considered dropping Ruby versions a breaking
change, hence our current build supports all the way back to 1.8.7. Yes you heard that right. Pretty
prehistoric.

In RSpec 4 we will be changing that policy to "currently supported Rubies at time of minor release",
what this means is we may update the minimum required Ruby version in our gem specs on minor release
versions in future. Given our policy of only supporting the latest major/minor pair this means essentially
that once a Ruby version is end of life, maintenance support for it will cease in RSpec.

Again this may seem harsh given our previous "we will be the last to drop support" policy, but Ruby
has stabilised so much over the decade since we released RSpec 3, the inconsistencies in versions
are largely ironed out.. (barring the pretty consequential changes of keyword arguments from Ruby 2.x to 3.x)
and with our slow release cadence I think this is a sensible change for making it easier to maintain RSpec
for the next decade. We still won't rush to remove support for any widely used Ruby, but we are formally
stating we reserve the right to do so within our versioning policy.

0 comments on commit cb801d7

Please sign in to comment.