Ruby
This guide will help build Ruby projects on Semaphore.
Overview
The Ruby interpreters are pre-installed in the Linux and macOS Semaphore environments. You can switch the active interpreter using sem-version. You may also use Docker images.
How to select Ruby versions
Change the active Ruby versions on Linux and macOS with sem-version. This command ignores .ruby-versions
sem-version ruby 3.2.2
Semaphore uses rbenv
to switch versions for Ruby. The available Ruby versions depend on the OS image you're using. You can check the available Ruby versions by executing the following command inside a Semaphore job:
rbenv install --list
Using Docker containers
The sem-version
tool does not work on Docker containers. You must use a pre-built Docker image with the language versions you need and run the job using Docker environments.
You can use the pre-build Ruby images or build your own. Find Dockerfiles to build your custom images in the semaphoreci/docker-images repository.
How to cache Gems
To cache downloaded Gems, you must download them to the vendor/bundle
folder relative to the current directory.
So, the first job on the pipeline should contain the following commands:
checkout
cache restore
bundle install --deployment --path vendor/bundle
cache store
All successive jobs can reuse Gems from the cache with:
checkout
cache restore
bundle install --deployment --path vendor/bundle
How to set up test reports
This section explains how to set up test reports (and flaky tests) for Ruby and RSpec.
-
Install the
rspec_junit_formatter
Gem in your project. Add the following line to Gemfilegem "rspec_junit_formatter", :group => [:test]
-
Install the dependencies
bundle install
-
Configure RSpec to use the Gem. This can be achieved in two ways:
-
Extending
.rspec
file configuration like this:--format RspecJunitFormatter
--out junit.xml
--format documentation -
Or, changing the
rspec
invocationbundle exec rspec --format RspecJunitFormatter --out junit.xml --format documentation
-
-
Follow Step 3 for every job in your pipeline that executes tests
-
Create an after_pipeline job with the following command:
test-results publish junit.xml
Example pipeline definition
- name: Tests
task:
prologue:
commands:
- checkout
- cache restore
- bundle install --deployment --path vendor/bundle
- cache store
job:
name: "Tests"
commands:
- checkout
- cache restore
- bundle install --deployment --path vendor/bundle
# Or bundle exec rspec if using .rspec configuration file
- bundle exec rspec --format RspecJunitFormatter --out junit.xml --format documentation
epilogue:
always:
commands:
- test-results publish junit.xml
How to parallelize tests
You can run RSpec and Cucumber tests in parallel automatically using job parallelism.
For RSpec, follow these steps:
-
Enable job parallelism
-
Change your test command in the CI to:
gem install semaphore_test_boosters
rspec_booster --job $SEMAPHORE_JOB_INDEX/$SEMAPHORE_JOB_COUNT
On Cucumber, we use cucumber_booster
instead:
-
Enable job parallelism
-
Change your test command in the CI to:
gem install semaphore_test_boosters
cucumber_booster --job $SEMAPHORE_JOB_INDEX/$SEMAPHORE_JOB_COUNT