diff --git a/doc/development/database/migration_ordering.md b/doc/development/database/migration_ordering.md new file mode 100644 index 0000000000000000000000000000000000000000..9f695e0a2d6fa1c897a8e3c977ff74e8991820b1 --- /dev/null +++ b/doc/development/database/migration_ordering.md @@ -0,0 +1,45 @@ +--- +stage: Data Stores +group: Database +info: Any user with at least the Maintainer role can merge updates to this content. For details, see https://docs.gitlab.com/ee/development/development_processes.html#development-guidelines-review. +--- + +# Migration ordering + +Starting with GitLab 17.1, the migration Rake tasks apply migrations using +a custom ordering scheme that conforms to the GitLab release cadence. This change +simplifies the upgrade process, and eases both maintenance and support. + +## Pre 17.1 logic + +Relevant Rake tasks apply migrations in an order based upon the 14-digit timestamp +given in the file name of the migration itself. This behavior is the default for a Rails application. + +GitLab also features logic to extend standard migration behavior in these important ways: + +1. You can load migrations from additional folders. For example, migrations are + loaded from both the `db/post_migrate` folder and the `db/migrate` folder, which + you need when using [Post-Deployment migrations](post_deployment_migrations.md). +1. If you set the environment variable `SKIP_POST_DEPLOYMENT_MIGRATIONS`, migrations + are not loaded from any `post_migrate` folder. +1. You must provide a GitLab minor version, or "milestone", on all new migrations. + +## 17.1+ logic + +The new logic orders migrations according to four criteria, in this order: + +1. If a GitLab milestone is present in the migration definition. + Migrations without a milestone defined are sorted lower. +1. The milestone defined on the migration. "Milestone" values are converted to + [GitLab semantic versions](https://gitlab.com/gitlab-org/gitlab/-/blob/master/gems/gitlab-utils/lib/gitlab/version_info.rb) + and these semantic versions are used as this sort criteria, in ascending order. +1. The 'migration type', which you can think of as an enumerable with two values: + `regular` and `post`, with `regular` sorting lower. + [Relevant source](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/database/migrations/version.rb). +1. The timestamp value itself. + +### New behavior for post-deployment migrations + +This change causes post-deployment migrations to always be sorted at the end +of a given milestone. Previously, post-deployment migrations were +interleaved with regular ones, provided `SKIP_POST_DEPLOYMENT_MIGRATIONS` was not set.