Skip to main content
Version: Master

Local development with devenv

Contributing to Rails Event Store doesn't require hand-installing Ruby (rbenv/rvm/asdf), Postgres, MySQL or Redis on your machine. This repository ships a devenv configuration (devenv.nix / devenv.yaml) that provisions the whole toolchain — the same Ruby CI runs on, plus databases on the exact ports the CI matrix uses.

This builds on the Nix tooling the project already relies on: CI runs the database-backed suites inside nix-shell using the ephemeral database definitions under support/nix/, and pushes build artifacts to the railseventstore Cachix cache. devenv is the local-development front end to that same world.

As everywhere else in this repo, make stays the entry point — devenv only provides the environment the existing make targets run in.

One-time setup

Install Nix and devenv. Then, from the repository root:

devenv shell

The first run builds/downloads the toolchain (Cachix makes this fast). You land in a shell with the right Ruby, bundler and native libraries for the pg, mysql2 and sqlite3 gems.

Databases

Start the databases (Postgres 14 + 18, MySQL 8.4, Redis) as background processes:

devenv up

They listen on the same host/port pairs as support/ci/generate, so a DATABASE_URL copied from any CI matrix cell works verbatim:

EngineDATABASE_URL
Postgres 14postgres://postgres:secret@localhost:10014/rails_event_store
Postgres 18postgres://postgres:secret@localhost:10018/rails_event_store
MySQL 8.4mysql2://root:secret@127.0.0.1:10084/rails_event_store
MySQL 9.7mysql2://root:secret@127.0.0.1:10097/rails_event_store
Redis$REDIS_URL (unix socket, exported in the shell)

MySQL 9.7 (CI's mysql_9_7) is the one version nixpkgs can't provide (no 9.x build), so it runs from a mysql:9.7 container instead of a native process. It starts automatically when a docker-compatible CLI (Docker, OrbStack, or an Apple container docker shim) is on PATH; without one, devenv up simply skips it and everything else still works natively.

Running the suites

Inside the devenv shell, install the gem's dependencies once, then use the regular make targets:

make install-ruby_event_store # bundle install for that gem
make test-ruby_event_store # no database needed
make install-ruby_event_store-active_record # bundle install for that gem
make test-ruby_event_store-active_record # against Postgres 18 by default

To reproduce a specific CI matrix cell, use res-cell, which maps a short database name to the CI DATABASE_URL and sets DATA_TYPE for you:

res-cell pg14 jsonb make test-ruby_event_store-active_record

Databases are sqlite, pg14, pg18, mysql84, mysql97. Or set the environment variables by hand if you prefer:

DATABASE_URL=postgres://postgres:secret@localhost:10014/rails_event_store \
DATA_TYPE=jsonb make test-ruby_event_store-active_record

Mutation testing works the same way:

make mutate-ruby_event_store-active_record

Other Ruby versions

The shell's default Ruby is 4.0 (CI's primary cell). To reproduce a 3.3 or 3.4 cell, prefix the command — each version keeps its own gem home so native extensions never clash:

res-ruby-3.4 make test-ruby_event_store-active_record

It composes with res-cell to pin both axes at once:

res-ruby-3.4 res-cell pg14 jsonb make test-ruby_event_store-active_record

Browser demo

make -C ruby_event_store-browser dev

Serves the standalone browser, seeded with sample events, at http://localhost:9393.

CI coverage

.github/workflows/devenv_setup_test.yml boots the databases through devenv and runs a database-backed and a database-less suite on every change to devenv.nix / devenv.yaml, so this setup can't silently rot.