Project

avrolution

0.0
Low commit activity in last 3 years
No release in over a year
Support for the evolution of Avro schemas stored in a schema registry.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Project Readme

avrolution

Support for the evolution of Avro schemas stored in a schema registry.

This gem provides utilities to help with the management of Avro JSON schemas in a schema registry. The compatibility of Avro JSON schema files can be checked against a registry. Expected compatibility breaks can also be declared.

Installation

Add this gem to your application's Gemfile, typically in a dev/test group:

group :development, :test do
  gem 'avrolution'
end

And then execute:

$ bundle install

Or install it yourself as:

$ gem install avrolution

Within a Rails project, create an avro_compatibility_breaks.txt file at Rails.root by running:

$ rails generate avrolution:install

Configuration

The gem supports the following configuration:

  • root - The directory to search for Avro JSON schemas (.avsc). This is also the default location for the compatibility breaks file. In a Rails application, Avrolution.root defaults to Rails.root.
  • compatibility_breaks_file - The path to the compability breaks file. Defaults to #{Avrolution}.root/avro_compatibility_breaks.txt.
  • compatibility_schema_registry_url - The URL for the schema registry to use for compatibility checking, or a Proc to determine the value. ENV['COMPATIBILITY_SCHEMA_REGISTRY_URL'] overrides this value if set.
  • deployment_schema_registry_url - The URL for the schema registry to use when registering new schema version, or a Proc to determine the value. ENV['DEPLOYMENT_SCHEMA_REGISTRY_URL'] overrides this value if set.
  • logger - A logger used by the rake tasks in this gem. This does NOT default to Rails.logger in Rails applications.

Usage

Avro Compatibility Check Rake Task

There is a rake task to check the compatibility of all Avro JSON schemas under Avrolution.root against a schema registry.

For Rails applications, the avro:check_compatibility task is automatically defined via a Railtie.

This task does not require any arguments. It checks the compatibility of all unregistered Avro JSON schemas found recursively under Avrolution.root against the schema registry ENV['COMPATIBILITY_SCHEMA_REGISTRY_URL'] or Avroluion.compatibility_schema_registry_url.

rake avro:check_compatibility

If a schema is incompatible, then Avrolution.compatibility_breaks_file is also consulted. If the schema is still incompatible with the last registered version then the differences are displayed and the command to add a compatibility break is printed.

For non-Rails projects, tasks can be defined as:

require 'avrolution/rake/check_compatibility_task'
Avrolution::Rake::CheckCompatibilityTask.define

Avro Register Schemas Rake Task

There is a rake task to register new schemas.

For Rails applications, the avro:register_schemas task is automatically defined via a Railtie.

This rake task requires a comma-separated list of files for the schemas to register.

rake avro:register_schemas schemas=/app/avro/schemas/one.avsc,/app/avro/schema/two.avsc

Schemas are registered against the schema registry ENV['DEPLOYMENT_SCHEMA_REGISTRY_URL'] or Avroluion.deployment_schema_registry_url.

The Avrolution.compatibility_breaks_file is consulted prior to registering the schema, and if an entry is found then the specified compatibility settings are used.

For non-Rails projects, tasks can be defined as:

require 'avroluation/rake/register_schemas_task'
Avrolution::Rake::RegisterSchemasTask.define

Avro Register All Schemas Rake Task

This rake task allows you to register all schemas discovered under Avrolution.root.

Similarly to the task avro:register_schemas, it will register them against the configured registry. Additionally, this task will be auto included for Rails applications.

rake avro:register_all_schemas

For non-Rails projects, tasks can be defined as:

require 'avroluation/rake/register_all_schemas_task'
Avrolution::Rake::RegisterAllSchemasTask.define

Avro Add Compatibility Break Rake Task

There is a rake task add an entry to the Avrolution.compatibility_breaks_file.

This rake task accepts the following arguments:

  • name - The full name of the Avro schema.
  • fingerprint - The Resolution fingerprint as a hex string.
  • with_compatibility - Optional compatibility level to use for the check and during registration.
  • after_compatibility - Optional compatibility level to set after registration.
rake avro:add_compatibility_break name=com.salsify.alerts.example_value \
  fingerprint=36a2035c15c1bbbfe895494697d1f760171d00ab4fd39d0616261bf6854374f9 \
  with_compatibility=BACKWARD after_compatibility=FULL

For Rails applications, the avro:add_compatibility_break task is automatically defined via a Railtie.

For non-Rails projects tasks can be defined as:

require 'avrolution/rake/add_compatibility_break_task'
Avrolution::Rake::AddCompatibilityBreakTask.define

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install.

To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/salsify/avrolution.

License

The gem is available as open source under the terms of the MIT License.