Provides a DSL for declaring a continuous integration workflow that can be run either locally or in the cloud. Each step is timed, reports success/error, and is aggregated into a collective report that reports total runtime, as well as whether the entire run was successful or not.
Example:
ActiveSupport::ContinuousIntegration.run do step "Setup", "bin/setup --skip-server" step "Style: Ruby", "bin/rubocop" step "Security: Gem audit", "bin/bundler-audit" step "Tests: Rails", "bin/rails test test:system" if success? step "Signoff: Ready for merge and deploy", "gh signoff" else failure "Skipping signoff; CI failed.", "Fix the issues and try again." end end
Starting with Rails 8.1, a default ‘bin/ci` and `config/ci.rb` file are created to provide out-of-the-box CI.
Constants
| COLORS | = | { banner: "\033[1;32m", # Green title: "\033[1;35m", # Purple subtitle: "\033[1;90m", # Medium Gray error: "\033[1;31m", # Red success: "\033[1;32m" # Green } |
Attributes
| [R] | results |
Class Public methods
new() Link
run(title = "Continuous Integration", subtitle = "Running tests, style checks, and security audits", &block) Link
Perform a CI run. Execute each step, show their results and runtime, and exit with a non-zero status if there are any failures.
Pass an optional title, subtitle, and a block that declares the steps to be executed.
Sets the CI environment variable to “true” to allow for conditional behavior in the app, like enabling eager loading and disabling logging.
A ‘fail fast’ option can be passed as a CLI argument (-f or –fail-fast). This exits with a non-zero status directly after a step fails.
Example:
ActiveSupport::ContinuousIntegration.run do step "Setup", "bin/setup --skip-server" step "Style: Ruby", "bin/rubocop" step "Security: Gem audit", "bin/bundler-audit" step "Tests: Rails", "bin/rails test test:system" if success? step "Signoff: Ready for merge and deploy", "gh signoff" else failure "Skipping signoff; CI failed.", "Fix the issues and try again." end end
# File activesupport/lib/active_support/continuous_integration.rb, line 57 def self.run(title = "Continuous Integration", subtitle = "Running tests, style checks, and security audits", &block) new.tap do |ci| ENV["CI"] = "true" ci.heading title, subtitle, padding: false ci.report(title, &block) abort unless ci.success? end end
Instance Public methods
echo(text, type:) Link
Echo text to the terminal in the color corresponding to the type of the text.
Examples:
echo "This is going to be green!", type: :success echo "This is going to be red!", type: :error
See ActiveSupport::ContinuousIntegration::COLORS for a complete list of options.
failure(title, subtitle = nil) Link
Display an error heading with the title and optional subtitle to reflect that the run failed.
heading(heading, subtitle = nil, type: :banner, padding: true) Link
Display a colorized heading followed by an optional subtitle.
Examples:
heading "Smoke Testing", "End-to-end tests verifying key functionality", padding: false heading "Skipping video encoding tests", "Install FFmpeg to run these tests", type: :error
See ActiveSupport::ContinuousIntegration::COLORS for a complete list of options.
step(title, *command) Link
Declare a step with a title and a command. The command can either be given as a single string or as multiple strings that will be passed to ‘system` as individual arguments (and therefore correctly escaped for paths etc).
Examples:
step "Setup", "bin/setup" step "Single test", "bin/rails", "test", "--name", "test_that_is_one"