hensei-api/lib/post_deployment/database_migrator.rb
Justin Edmund d71b78e5f8
Update post-deploy script and Rails credentials (#155)
* Fresh credentials.yml.enc

* Update .ruby-gemset

* Made PostDeploymentManager modular

We broke PostDeploymentManager out into several files to make it easier to maintain.

We also added a "force" mode that forces the script to consider all CSV files. This is useful for testing the post-deploy script itself. This should only be used in test mode or you will dirty your database.

We also fine tuned some of the logging to make sure that both verbose and non-verbose modes are helpful.
2025-01-15 14:56:38 -08:00

84 lines
2.6 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_version = DataMigrate::DataMigrator.current_version
DataMigrate::DataMigrator.migrate
new_data_version = DataMigrate::DataMigrator.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