108 lines
1.7 KiB
Bash
Executable file
108 lines
1.7 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
errors=$(mktemp)
|
|
|
|
step() {
|
|
printf '\x1b[34;1m>> %s\x1b[0m\n' "$*"
|
|
}
|
|
|
|
error() {
|
|
{
|
|
printf '\x1b[31;1merror: \x1b[0m%s\n' "$*";
|
|
grep -v 'current transaction is aborted' < "$errors";
|
|
printf "\x1b[31m;1error: \x1b[0mAborting migrations, fix file(s) then restart process.";
|
|
} 1>&2;
|
|
}
|
|
|
|
try() {
|
|
"$@" 2> "$errors";
|
|
count=$(grep -c 'ERROR' < "$errors")
|
|
if [ "$count" -eq 0 ]; then
|
|
return 0;
|
|
else
|
|
return 1;
|
|
fi
|
|
}
|
|
|
|
export PGPASSWORD="$POSTGRES_PASSWORD"
|
|
|
|
psql() {
|
|
/usr/bin/psql \
|
|
-h db \
|
|
-p 5432 \
|
|
-d "$POSTGRES_DB" \
|
|
-U "$POSTGRES_USER" \
|
|
"$@"
|
|
}
|
|
|
|
pg_isready() {
|
|
/usr/bin/pg_isready \
|
|
-h db \
|
|
-p 5432 \
|
|
-d "$POSTGRES_DB" \
|
|
-U "$POSTGRES_USER"
|
|
}
|
|
|
|
curr_revision() {
|
|
psql -qtAX -f /db/rev.sql;
|
|
}
|
|
|
|
wait_until_ready() {
|
|
step 'Checking if the database is ready...';
|
|
while true; do
|
|
pg_isready;
|
|
code=$?;
|
|
if [ $code -eq 0 ]; then
|
|
break;
|
|
fi
|
|
sleep 3;
|
|
done
|
|
}
|
|
|
|
run_migrations() {
|
|
i="$1"
|
|
while true; do
|
|
name=$(printf "%04d" "$i");
|
|
file="/db/migrations/$name.sql"
|
|
if [ -f "$file" ]; then
|
|
if try psql -f "$file"; then
|
|
i=$((i+1));
|
|
continue;
|
|
else
|
|
error "An error occoured during a migration (rev $name)"
|
|
return 1;
|
|
fi
|
|
else
|
|
return 0;
|
|
fi
|
|
done
|
|
}
|
|
|
|
init () {
|
|
# reomve ready status
|
|
# so php ignores requests
|
|
rm -f /status/ready
|
|
|
|
step 'Waiting for database';
|
|
# make sure the database is running
|
|
# before we run any requests
|
|
wait_until_ready;
|
|
step 'Database ready';
|
|
|
|
step 'Peforming migrations';
|
|
# get the current revision
|
|
REV=$(curr_revision);
|
|
step "Database at revision: $REV"
|
|
# run each migration that is
|
|
# higher than our current revision
|
|
if ! run_migrations "$REV"; then
|
|
return 1;
|
|
fi
|
|
|
|
step 'Database is initialized'
|
|
# database is ready
|
|
touch /status/ready
|
|
}
|
|
|
|
init
|
|
rm "$errors"
|