87 lines
2.8 KiB
Ruby
87 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative '../logging_helper'
|
|
|
|
module PostDeployment
|
|
class DatabaseMigrator
|
|
include LoggingHelper
|
|
|
|
def initialize(test_mode:, verbose:)
|
|
@test_mode = test_mode
|
|
@verbose = verbose
|
|
end
|
|
|
|
def run
|
|
log_header 'Running database migrations...', '-'
|
|
puts "\n"
|
|
|
|
if @test_mode
|
|
simulate_migrations
|
|
else
|
|
perform_migrations
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def simulate_migrations
|
|
log_step "TEST MODE: Would run pending migrations..."
|
|
|
|
# Check schema migrations
|
|
pending_schema_migrations = ActiveRecord::Base.connection.pool.migration_context.needs_migration?
|
|
schema_migrations = ActiveRecord::Base.connection.pool.migration_context.migrations
|
|
|
|
# Check data migrations
|
|
data_migrations_path = DataMigrate.config.data_migrations_path
|
|
data_migration_context = DataMigrate::MigrationContext.new(data_migrations_path)
|
|
pending_data_migrations = data_migration_context.needs_migration?
|
|
data_migrations = data_migration_context.migrations
|
|
|
|
if pending_schema_migrations || pending_data_migrations
|
|
if schema_migrations.any?
|
|
log_step "Would apply #{schema_migrations.size} pending schema migrations:"
|
|
schema_migrations.each do |migration|
|
|
log_step " • #{migration.name}"
|
|
end
|
|
end
|
|
|
|
if data_migrations.any?
|
|
log_step "\nWould apply #{data_migrations.size} pending data migrations:"
|
|
data_migrations.each do |migration|
|
|
log_step " • #{migration.name}"
|
|
end
|
|
end
|
|
else
|
|
log_step "No pending migrations."
|
|
end
|
|
end
|
|
|
|
def perform_migrations
|
|
ActiveRecord::Migration.verbose = @verbose
|
|
|
|
# Run schema migrations
|
|
schema_version = ActiveRecord::Base.connection.pool.migration_context.current_version
|
|
ActiveRecord::Tasks::DatabaseTasks.migrate
|
|
new_schema_version = ActiveRecord::Base.connection.pool.migration_context.current_version
|
|
|
|
# Run data migrations
|
|
data_migrations_path = DataMigrate.config.data_migrations_path
|
|
data_migration_context = DataMigrate::MigrationContext.new(data_migrations_path)
|
|
|
|
data_version = data_migration_context.current_version
|
|
data_migration_context.migrate
|
|
new_data_version = data_migration_context.current_version
|
|
|
|
if schema_version == new_schema_version && data_version == new_data_version
|
|
log_step "No pending migrations."
|
|
else
|
|
if schema_version != new_schema_version
|
|
log_step "Migrated schema from version #{schema_version} to #{new_schema_version}"
|
|
end
|
|
if data_version != new_data_version
|
|
log_step "Migrated data from version #{data_version} to #{new_data_version}"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|