hensei-api/lib/post_deployment/database_migrator.rb

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.migration_context.needs_migration?
schema_migrations = ActiveRecord::Base.connection.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.migration_context.current_version
ActiveRecord::Tasks::DatabaseTasks.migrate
new_schema_version = ActiveRecord::Base.connection.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