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'
endAnd 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.rootdefaults toRails.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 toRails.loggerin 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_compatibilityIf 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.defineAvro 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.avscSchemas 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.defineAvro 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_schemasFor non-Rails projects, tasks can be defined as:
require 'avroluation/rake/register_all_schemas_task'
Avrolution::Rake::RegisterAllSchemasTask.defineAvro 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=FULLFor 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.defineDevelopment
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.