Commit 56753c80 authored by Andreas Brandl's avatar Andreas Brandl

Add docs section with background on versioning

parent 463dbff7
...@@ -217,6 +217,33 @@ In case you need to insert, update, or delete a significant amount of data, you: ...@@ -217,6 +217,33 @@ In case you need to insert, update, or delete a significant amount of data, you:
- Must disable the single transaction with `disable_ddl_transaction!`. - Must disable the single transaction with `disable_ddl_transaction!`.
- Should consider doing it in a [Background Migration](background_migrations.md). - Should consider doing it in a [Background Migration](background_migrations.md).
## Migration helpers and versioning
Various helper methods are available for many common patterns in database migrations. Those
helpers can be found in `Gitlab::Database::MigrationHelpers` and related modules.
In order to allow changing a helper's behavior over time, we implement a versioning scheme
for migration helpers. This allows us to maintain the behavior of a helper for already
existing migrations but change the behavior for any new migrations.
For that purpose, all database migrations should inherit from `Gitlab::Database::Migration`,
which is a "versioned" class. For new migrations, the latest version should be used (which
can be looked up in `Gitlab::Database::Migration::MIGRATION_CLASSES`) to use the latest version
of migration helpers.
In this example, we use version 1.0 of the migration class:
```ruby
class TestMigration < Gitlab::Database::Migration[1.0]
def change
end
end
```
Note that it is discouraged to include `Gitlab::Database::MigrationHelpers` directly into a
migration. Instead, the latest version of `Gitlab::Database::Migration` will expose the latest
version of migration helpers automatically.
## Retry mechanism when acquiring database locks ## Retry mechanism when acquiring database locks
When changing the database schema, we use helper methods to invoke DDL (Data Definition When changing the database schema, we use helper methods to invoke DDL (Data Definition
......
...@@ -10,8 +10,8 @@ module RuboCop ...@@ -10,8 +10,8 @@ module RuboCop
ENFORCED_SINCE = 2021_08_30_00_00_00 ENFORCED_SINCE = 2021_08_30_00_00_00
MSG_INHERIT = 'Don\'t inherit from ActiveRecord::Migration but use Gitlab::Database::Migration[1.0] instead.' MSG_INHERIT = 'Don\'t inherit from ActiveRecord::Migration but use Gitlab::Database::Migration[1.0] instead. See https://docs.gitlab.com/ee/development/migration_style_guide.html#migration-helpers-and-versioning.'
MSG_INCLUDE = 'Don\'t include migration helper modules directly. Inherit from Gitlab::Database::Migration[1.0] instead.' MSG_INCLUDE = 'Don\'t include migration helper modules directly. Inherit from Gitlab::Database::Migration[1.0] instead. See https://docs.gitlab.com/ee/development/migration_style_guide.html#migration-helpers-and-versioning.'
MIGRATION_CLASS = 'Gitlab::Database::Migration' MIGRATION_CLASS = 'Gitlab::Database::Migration'
......
...@@ -51,7 +51,7 @@ RSpec.describe RuboCop::Cop::Migration::VersionedMigrationClass do ...@@ -51,7 +51,7 @@ RSpec.describe RuboCop::Cop::Migration::VersionedMigrationClass do
it 'adds an offence if inheriting from ActiveRecord::Migration' do it 'adds an offence if inheriting from ActiveRecord::Migration' do
expect_offense(<<~RUBY) expect_offense(<<~RUBY)
class MyMigration < ActiveRecord::Migration[6.1] class MyMigration < ActiveRecord::Migration[6.1]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't inherit from ActiveRecord::Migration but use Gitlab::Database::Migration[1.0] instead. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't inherit from ActiveRecord::Migration but use Gitlab::Database::Migration[1.0] instead. See https://docs.gitlab.com/ee/development/migration_style_guide.html#migration-helpers-and-versioning.
end end
RUBY RUBY
end end
...@@ -60,7 +60,7 @@ RSpec.describe RuboCop::Cop::Migration::VersionedMigrationClass do ...@@ -60,7 +60,7 @@ RSpec.describe RuboCop::Cop::Migration::VersionedMigrationClass do
expect_offense(<<~RUBY) expect_offense(<<~RUBY)
class MyMigration < Gitlab::Database::Migration[1.0] class MyMigration < Gitlab::Database::Migration[1.0]
include Gitlab::Database::MigrationHelpers include Gitlab::Database::MigrationHelpers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't include migration helper modules directly. Inherit from Gitlab::Database::Migration[1.0] instead. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Don't include migration helper modules directly. Inherit from Gitlab::Database::Migration[1.0] instead. See https://docs.gitlab.com/ee/development/migration_style_guide.html#migration-helpers-and-versioning.
end end
RUBY RUBY
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment