Skip to content

Instantly share code, notes, and snippets.

@ndbroadbent
Last active December 8, 2019 05:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ndbroadbent/5667a92d22aeac85238b6dcd205ecdfc to your computer and use it in GitHub Desktop.
Save ndbroadbent/5667a92d22aeac85238b6dcd205ecdfc to your computer and use it in GitHub Desktop.
Much faster bash implementation for rake parallel:prepare (for parallel_tests gem)
#!/bin/bash
set -eo pipefail
DATABASE_NAME="$1"
if [ -z "$PARALLEL_TEST_PROCESSORS" ]; then
PARALLEL_TEST_PROCESSORS="$2"
fi
ACTION="$3"
if [ -z "$ACTION" ]; then
ACTION="create"
fi
if [ -z "$DATABASE_NAME" ] || [ -z "$PARALLEL_TEST_PROCESSORS" ] || (
[ "$ACTION" != "create" ] && [ "$ACTION" != "drop" ]
); then
echo "Usage: $0 <database name> <processors = \$PARALLEL_TEST_PROCESSORS> <action: create|drop = create>" >&2
exit 1
fi
if [ "$ACTION" = "create" ]; then
# Original db:structure:dump:
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb#L49-L79
DEV_DATABASE="${DATABASE_NAME}_development"
DB_STRUCTURE_FILE="db/structure.sql"
echo "Dumping ${DEV_DATABASE} schema to ${DB_STRUCTURE_FILE}..."
pg_dump --schema-only "$DEV_DATABASE" > "$DB_STRUCTURE_FILE"
# Remove initial comments (https://stackoverflow.com/a/17365113/304706)
# See: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb#L121-L136
cat "$DB_STRUCTURE_FILE" | sed -n '/^SET/,$p' > "${DB_STRUCTURE_FILE}.uncommented"
mv "${DB_STRUCTURE_FILE}.uncommented" "$DB_STRUCTURE_FILE"
# Set search_path (always seems to be $user)
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/tasks/postgresql_database_tasks.rb#L78
echo 'SET search_path TO "$user", public;' >> "$DB_STRUCTURE_FILE"
# Dump schema information
# https://github.com/rails/rails/blob/master/activerecord/lib/active_record/tasks/database_tasks.rb#L379-L385
# * dump_schema_information: https://github.com/rails/rails/blob/b4ee2d5f6568a6edbf5ab521e6babd10639747f0/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L1070-L1073
# * insert_versions_sql: https://github.com/rails/rails/blob/b4ee2d5f6568a6edbf5ab521e6babd10639747f0/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L1457-L1468
pg_dump $DEV_DATABASE --data-only --table schema_migrations | sed -n '/^COPY/,$p' | grep -v '^--' \
>> "$DB_STRUCTURE_FILE"
fi
for TEST_ENV_NUMBER in $(seq 1 $PARALLEL_TEST_PROCESSORS); do
if [ "$TEST_ENV_NUMBER" = "1" ]; then TEST_ENV_NUMBER=""; fi
DATABASE="${DATABASE_NAME}_test${TEST_ENV_NUMBER}"
if [ "$ACTION" = "create" ]; then
(
echo "Creating $DATABASE..."
createdb "${DATABASE}" || true
echo "=> Loading ${DB_STRUCTURE_FILE} into ${DATABASE}..."
cat "$DB_STRUCTURE_FILE" | psql "$DATABASE" -q > /dev/null
) &
else
(
echo "Dropping $DATABASE..."
dropdb "$DATABASE" || true
) &
fi
done
wait
if [ "$ACTION" = "create" ]; then
echo "Created $PARALLEL_TEST_PROCESSORS test databases!"
else
echo "Dropped $PARALLEL_TEST_PROCESSORS test databases!"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment