feat: store all migrations
This commit is contained in:
parent
56980bf0ce
commit
f84b8ed11d
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
.env
|
.env
|
||||||
data
|
data
|
||||||
tmp
|
tmp
|
||||||
|
head
|
||||||
|
base
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -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
|
||||||
|
@ -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
|
@ -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
9
scripts/common.sh
Normal 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
|
||||||
|
}
|
@ -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"
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user