Enforce migration compatibility registry
This commit is contained in:
parent
3ba3de6eff
commit
009ed6dafa
|
|
@ -9,3 +9,4 @@
|
||||||
20260801123806 application_safe additive concurrent user directory search indexes
|
20260801123806 application_safe additive concurrent user directory search indexes
|
||||||
20260801141743 application_safe additive concurrent operations queue search indexes
|
20260801141743 application_safe additive concurrent operations queue search indexes
|
||||||
20260801200302 application_safe additive generated public discovery coordinate columns
|
20260801200302 application_safe additive generated public discovery coordinate columns
|
||||||
|
20260812120611 application_safe dropping the delivery-channel check allows inbox-only subscriptions that old code can still read safely
|
||||||
|
|
|
||||||
|
76
scripts/check-migration-registry.sh
Executable file
76
scripts/check-migration-registry.sh
Executable file
|
|
@ -0,0 +1,76 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT=${1:-$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)}
|
||||||
|
registry="$ROOT/priv/repo/migration_application_compatibility.tsv"
|
||||||
|
migrations_dir="$ROOT/priv/repo/migrations"
|
||||||
|
|
||||||
|
[[ -f "$registry" ]] || {
|
||||||
|
echo "Migration compatibility registry is missing: $registry" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
[[ -d "$migrations_dir" ]] || {
|
||||||
|
echo "Migration directory is missing: $migrations_dir" >&2
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
|
||||||
|
mapfile -t entries < <(
|
||||||
|
awk -F '\t' '
|
||||||
|
$0 !~ /^#/ && NF > 0 {
|
||||||
|
if (NF != 3 || $1 !~ /^[0-9]{14}$/ ||
|
||||||
|
($2 != "application_safe" && $2 != "forward_only") ||
|
||||||
|
$3 == "" || $3 == $2) {
|
||||||
|
print "INVALID\t" NR "\t" $0
|
||||||
|
} else {
|
||||||
|
print $1 "\t" $2 "\t" $3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' "$registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ ${#entries[@]} -eq 0 ]]; then
|
||||||
|
echo "Migration compatibility registry has no reviewed entries." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
for entry in "${entries[@]}"; do
|
||||||
|
if [[ "$entry" == INVALID$'\t'* ]]; then
|
||||||
|
echo "Invalid migration registry entry: $entry" >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
mapfile -t versions < <(printf '%s\n' "${entries[@]}" | cut -f1)
|
||||||
|
if [[ $(printf '%s\n' "${versions[@]}" | sort -u | wc -l) -ne ${#versions[@]} ]]; then
|
||||||
|
echo "Migration compatibility registry contains a duplicate version." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
first_reviewed_version=$(printf '%s\n' "${versions[@]}" | sort | head -n 1)
|
||||||
|
|
||||||
|
mapfile -t reviewed_migrations < <(
|
||||||
|
find "$migrations_dir" -maxdepth 1 -type f -name '[0-9]*.exs' -printf '%f\n' |
|
||||||
|
awk -F_ -v first="$first_reviewed_version" '$1 >= first {print $1}' |
|
||||||
|
sort
|
||||||
|
)
|
||||||
|
|
||||||
|
for version in "${versions[@]}"; do
|
||||||
|
mapfile -t files < <(
|
||||||
|
find "$migrations_dir" -maxdepth 1 -type f -name "${version}_*.exs" -printf '%f\n'
|
||||||
|
)
|
||||||
|
if [[ ${#files[@]} -ne 1 ]]; then
|
||||||
|
echo "Registry version $version must identify exactly one migration file." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for version in "${reviewed_migrations[@]}"; do
|
||||||
|
matches=$(printf '%s\n' "${versions[@]}" | grep -Fxc "$version" || true)
|
||||||
|
if [[ "$matches" -ne 1 ]]; then
|
||||||
|
echo "Migration $version must have exactly one reviewed registry entry." >&2
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Migration compatibility registry is complete and internally consistent."
|
||||||
|
|
@ -134,6 +134,7 @@ echo "Checking isolated production application rollback plan/apply"
|
||||||
./scripts/production-rollback-drill.sh
|
./scripts/production-rollback-drill.sh
|
||||||
|
|
||||||
echo "Checking release migration compatibility policy"
|
echo "Checking release migration compatibility policy"
|
||||||
|
./scripts/check-migration-registry.sh
|
||||||
./scripts/release-migration-policy-drill.sh
|
./scripts/release-migration-policy-drill.sh
|
||||||
|
|
||||||
echo "Checking isolated production release orchestration"
|
echo "Checking isolated production release orchestration"
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,11 @@ git -C "$fixture" add .
|
||||||
git -C "$fixture" commit --quiet -m baseline
|
git -C "$fixture" commit --quiet -m baseline
|
||||||
baseline=$(git -C "$fixture" rev-parse HEAD)
|
baseline=$(git -C "$fixture" rev-parse HEAD)
|
||||||
|
|
||||||
|
if "$ROOT/scripts/check-migration-registry.sh" "$fixture" >/dev/null 2>&1; then
|
||||||
|
echo "Migration registry checker accepted an empty registry." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
printf '%s\n' 'defmodule SafeMigration do end' \
|
printf '%s\n' 'defmodule SafeMigration do end' \
|
||||||
>"$fixture/priv/repo/migrations/20260101000000_safe_migration.exs"
|
>"$fixture/priv/repo/migrations/20260101000000_safe_migration.exs"
|
||||||
printf '%s\t%s\t%s\n' \
|
printf '%s\t%s\t%s\n' \
|
||||||
|
|
@ -31,6 +36,8 @@ git -C "$fixture" add .
|
||||||
git -C "$fixture" commit --quiet -m safe
|
git -C "$fixture" commit --quiet -m safe
|
||||||
safe=$(git -C "$fixture" rev-parse HEAD)
|
safe=$(git -C "$fixture" rev-parse HEAD)
|
||||||
|
|
||||||
|
"$ROOT/scripts/check-migration-registry.sh" "$fixture" >/dev/null
|
||||||
|
|
||||||
safe_output=$(
|
safe_output=$(
|
||||||
"$ROOT/scripts/release-migration-policy.sh" "$baseline" "$safe" "$fixture"
|
"$ROOT/scripts/release-migration-policy.sh" "$baseline" "$safe" "$fixture"
|
||||||
)
|
)
|
||||||
|
|
@ -47,6 +54,8 @@ git -C "$fixture" add .
|
||||||
git -C "$fixture" commit --quiet -m forward
|
git -C "$fixture" commit --quiet -m forward
|
||||||
forward=$(git -C "$fixture" rev-parse HEAD)
|
forward=$(git -C "$fixture" rev-parse HEAD)
|
||||||
|
|
||||||
|
"$ROOT/scripts/check-migration-registry.sh" "$fixture" >/dev/null
|
||||||
|
|
||||||
forward_output=$(
|
forward_output=$(
|
||||||
"$ROOT/scripts/release-migration-policy.sh" "$baseline" "$forward" "$fixture"
|
"$ROOT/scripts/release-migration-policy.sh" "$baseline" "$forward" "$fixture"
|
||||||
)
|
)
|
||||||
|
|
@ -74,6 +83,11 @@ git -C "$fixture" add .
|
||||||
git -C "$fixture" commit --quiet -m unknown
|
git -C "$fixture" commit --quiet -m unknown
|
||||||
unknown=$(git -C "$fixture" rev-parse HEAD)
|
unknown=$(git -C "$fixture" rev-parse HEAD)
|
||||||
|
|
||||||
|
if "$ROOT/scripts/check-migration-registry.sh" "$fixture" >/dev/null 2>&1; then
|
||||||
|
echo "Migration registry checker accepted an unreviewed migration." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if "$ROOT/scripts/release-migration-policy.sh" \
|
if "$ROOT/scripts/release-migration-policy.sh" \
|
||||||
"$safe" "$unknown" "$fixture" >/dev/null 2>&1; then
|
"$safe" "$unknown" "$fixture" >/dev/null 2>&1; then
|
||||||
echo "Migration policy accepted an unreviewed migration." >&2
|
echo "Migration policy accepted an unreviewed migration." >&2
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user