feat: store all migrations

This commit is contained in:
Orion Kindel 2023-07-17 15:44:40 -04:00
parent 56980bf0ce
commit f84b8ed11d
Signed by untrusted user who does not match committer: orion
GPG Key ID: 6D4165AE4C928719
8 changed files with 60 additions and 36 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
.env .env
data data
tmp tmp
head
base

3
.gitmodules vendored
View File

@ -1,3 +1,6 @@
[submodule "migrations"] [submodule "migrations"]
path = migrations path = migrations
url = git@git.orionkindel.com:dnim/db url = git@git.orionkindel.com:dnim/db
branch = migrations
[submodule "migraionts"]
branch = migrations

View File

@ -6,8 +6,6 @@ services:
image: "postgres:15.3-bullseye" image: "postgres:15.3-bullseye"
ports: ports:
- "5432:5432" - "5432:5432"
volumes:
- "./data/base:/var/lib/postgresql/data"
env_file: env_file:
- "./.env.schema" - "./.env.schema"
head: head:
@ -16,7 +14,5 @@ services:
restart: "always" restart: "always"
ports: ports:
- "5433:5432" - "5433:5432"
volumes:
- "./data/head:/var/lib/postgresql/data"
env_file: env_file:
- "./.env.schema" - "./.env.schema"

@ -1 +1 @@
Subproject commit 66ce56ed6af6cb63dbc4164e2f8146988dcda92b Subproject commit 85aca00ea85ebaf371e63aa12a0f69a4a7e75c2c

View File

@ -2,34 +2,51 @@
set -e set -e
source ./scripts/common.sh
source ./scripts/env.sh ./.env.schema source ./scripts/env.sh ./.env.schema
docker compose down
base_or_head="$1" base_or_head="$1"
rev="$2" rev="$2"
git worktree remove "./$base_or_head" || true
git worktree add "./$base_or_head" --detach "$rev"
mkdir -p "./$base_or_head/data/$base_or_head"
ln -sr "../data/$base_or_head" "./$base_or_head/data/$base_or_head"
cp docker-compose.yml "./$base_or_head/docker-compose.yml"
cd "./$base_or_head"
docker compose up -d "$base_or_head"
cd "../$base_or_head"
if [[ "$base_or_head" = "head" ]]; then if [[ "$base_or_head" = "head" ]]; then
port=5433 port=5433
else else
port=5432 port=5432
fi fi
url=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:$port docker compose down "$base_or_head"
dropdb=$(mktemp) url="postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:$port"
echo "drop database dnim with (force); create database dnim;" > "$dropdb"
psql --quiet "$url/postgres" --file="$dropdb"
ls ./schema/ | xargs -I{} psql --quiet "$url/dnim" --file=./schema/{} isready() {
until pg_isready -p "$port" 1>/dev/null; do true; done;
}
initdb() {
dropdb=$(mktemp)
echo "drop database dnim with (force);" > "$dropdb"
psql --quiet "$url/postgres" -f "$dropdb" || true
psql --quiet "$url/postgres" -c "create database dnim"
}
if [[ "$rev" = "empty" ]]; then
docker compose up -d "$base_or_head"
isready
initdb
exit 0
fi
git worktree remove --force "./$base_or_head" || true
rm -rf "./$base_or_head" || true
git worktree add "./$base_or_head" --detach "$rev"
cp docker-compose.yml "./$base_or_head/docker-compose.yml"
cp .env.schema "./$base_or_head/.env.schema"
cd "./$base_or_head"
docker compose up -d "$base_or_head"
cd "../$base_or_head"
isready
initdb
ls ./schema/ | xargs -I{} bash -c "$(declare -f query_file); query_file \"$url/dnim\" ./schema/{}"

9
scripts/common.sh Normal file
View File

@ -0,0 +1,9 @@
#! /bin/bash
query_file() {
psql -v ON_ERROR_STOP=1 --single-transaction --quiet "$1" --file="$2" 1>&2
}
query() {
psql -v ON_ERROR_STOP=1 --single-transaction --quiet "$1" --command="$2" 1>&2
}

View File

@ -12,16 +12,12 @@ if [[ -n "$head_arg" ]]; then
head="$head_arg" head="$head_arg"
fi; fi;
cd ./migrations 1>&2
git pull
cd ../ 1>&2
migration="./migrations/${base}_to_${head}.sql" migration="./migrations/${base}_to_${head}.sql"
base_url=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/dnim base_url=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5432/dnim
head_url=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5433/dnim head_url=postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost:5433/dnim
if [[ -z "$base" ]] || [ -z "$head" ]; then if [[ -z "$base" ]] || [[ -z "$head" ]]; then
echo "revisions to diff are required ex. ./scripts/diff.sh abc bcd" 1>&2; echo "revisions to diff are required ex. ./scripts/diff.sh abc bcd" 1>&2;
exit 1; exit 1;
fi fi
@ -30,7 +26,7 @@ if [[ ! -f "$migration" ]]; then
./scripts/build.sh base "$base" 1>&2 ./scripts/build.sh base "$base" 1>&2
./scripts/build.sh head "$head" 1>&2 ./scripts/build.sh head "$head" 1>&2
until (pg_isready -p 5432 && pg_isready -p 5433) 1>/dev/null; do true; done; until pg_isready -p 5432 1>/dev/null && pg_isready -p 5433 1>/dev/null; do true; done;
migra --unsafe "$base_url" "$head_url" > "$migration" \ migra --unsafe "$base_url" "$head_url" > "$migration" \
|| echo "migra exited with code $?. this is /probably/ fine" 1>&2 || echo "migra exited with code $?. this is /probably/ fine" 1>&2
@ -38,7 +34,7 @@ if [[ ! -f "$migration" ]]; then
cd ./migrations cd ./migrations
git add --all git add --all
git commit -m "$migration" git commit -m "$migration"
git push cd ../
fi fi
echo "$migration" echo "$migration"

View File

@ -2,6 +2,7 @@
set -e set -e
source ./scripts/common.sh
source ./scripts/env.sh ./.env source ./scripts/env.sh ./.env
if [[ -n $(git status --porcelain) ]]; then if [[ -n $(git status --porcelain) ]]; then
@ -12,21 +13,21 @@ fi
to_tag="$1" to_tag="$1"
get_dnim_database_count="copy (select count(*) from pg_database where datname = 'dnim') to stdout with null as '';" get_dnim_database_count="copy (select count(*) from pg_database where datname = 'dnim') to stdout with null as '';"
dnim_database_count=$(psql "$POSTGRES_URI/postgres" -c "$get_dnim_database_count") dnim_database_count=$(query "$POSTGRES_URI/postgres" "$get_dnim_database_count")
if [[ "$dnim_database_count" = "0" ]]; then if [[ "$dnim_database_count" = "0" ]]; then
echo "fresh database" echo "fresh database"
psql "$POSTGRES_URI/postgres" -c "create database dnim;" query "$POSTGRES_URI/postgres" "create database dnim;"
ls ./schema/ | xargs -I{} psql --quiet "$POSTGRES_URI/dnim" --file=./schema/{} ls ./schema/ | xargs -I{} bash -c "$(declare -f query_file); query_file \"$POSTGRES_URI/dnim\" ./schema/{}"
rev_last='empty' rev_last='empty'
script='' script=''
else else
get_rev_last="copy (select to_revision from migration order by performed_on desc limit 1) to stdout with null as '';" get_rev_last="copy (select to_revision from migration order by performed_on desc limit 1) to stdout with null as '';"
rev_last=$(psql "$POSTGRES_URI/dnim" -c "$get_rev_last") rev_last=$(query "$POSTGRES_URI/dnim" "$get_rev_last")
migration=$(./scripts/diff.sh "$rev_last" "$to_tag") migration=$(./scripts/diff.sh "$rev_last" "$to_tag")
if [[ "$2" = "--greenlight" ]]; then if [[ "$2" = "--greenlight" ]]; then
psql "$POSTGRES_URI/dnim" -v ON_ERROR_STOP=1 --single-transaction -f "$migration" query_file "$POSTGRES_URI/dnim" "$migration"
else else
echo "migration available at $migration" echo "migration available at $migration"
echo "review and rerun with --greenlight to apply" echo "review and rerun with --greenlight to apply"
@ -35,5 +36,5 @@ else
fi fi
insert_migration="insert into migration (from_revision, to_revision) values ('$rev_last', '$to_tag');" insert_migration="insert into migration (from_revision, to_revision) values ('$rev_last', '$to_tag');"
psql "$POSTGRES_URI/dnim" -c "$insert_migration" query "$POSTGRES_URI/dnim" "$insert_migration"
echo "inserted migration" echo "inserted migration"