8e472ac996
CI/CD - ERP Core / scripts (pull_request) Failing after 12m21s
CI/CD - ERP Core / e2e-typecheck (pull_request) Failing after 13m13s
CI/CD - ERP Core / frontend (pull_request) Failing after 14m5s
CI/CD - ERP Core / backend (pull_request) Failing after 14m57s
CI/CD - ERP Core / detect (pull_request) Failing after 13m42s
CI/CD - ERP Core / Build & Deploy (pull_request) Failing after 12m47s
CI/CD - ERP Core / ci-ok (pull_request) Failing after 14m58s
54 lines
2.0 KiB
Bash
54 lines
2.0 KiB
Bash
#!/usr/bin/env bash
|
||
# ci-cd.yml › backend — flag destructive EF migrations introduced by this pull request.
|
||
#
|
||
# A failed deploy rolls the backend binaries back but never the database, so every release must
|
||
# leave the PREVIOUS backend working on the NEW schema: add tables/columns now, drop or rename
|
||
# them in a later release (expand → contract, docs/40-DEPLOYMENT.md §8).
|
||
# into Dev → warning
|
||
# into production → failure, unless the PR title contains [allow-destructive-migration]
|
||
# shellcheck source=common.sh
|
||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||
|
||
: "${BASE_REF:?BASE_REF (the PR target branch) is required}"
|
||
base="refs/remotes/origin/$BASE_REF"
|
||
git_remote fetch -q --depth 1 "$REPO_GIT_URL" "+refs/heads/$BASE_REF:$base"
|
||
|
||
# Two-dot tree diff: needs only the two commits, not their history (depth-1 friendly).
|
||
mapfile -t files < <(
|
||
git diff --name-only --diff-filter=AM "$base" HEAD -- "$MIGRATIONS_PATH" |
|
||
grep -E '\.cs$' | grep -vE '\.Designer\.cs$|ModelSnapshot\.cs$' || true
|
||
)
|
||
|
||
if ((${#files[@]} == 0)); then
|
||
log "no new or changed migrations"
|
||
exit 0
|
||
fi
|
||
|
||
hits=""
|
||
for f in "${files[@]}"; do
|
||
# Only Up() matters — every Down() legitimately drops what its Up() created.
|
||
found="$(awk '
|
||
/override void Up\(/ { up = 1 }
|
||
/override void Down\(/ { up = 0 }
|
||
up && /migrationBuilder\.(DropTable|DropColumn|RenameColumn|RenameTable|DropSchema|DropSequence)\(/ {
|
||
printf " %s:%d: %s\n", FILENAME, FNR, $0
|
||
}' "$f")"
|
||
hits+="$found"
|
||
done
|
||
|
||
if [[ -z "$hits" ]]; then
|
||
log "checked ${#files[@]} migration file(s): additive only"
|
||
exit 0
|
||
fi
|
||
|
||
printf '%s\n' "$hits"
|
||
msg="destructive operation in a migration's Up() — keep the previous release working on the new schema: expand now, contract in a later release (docs/40-DEPLOYMENT.md §8)"
|
||
if [[ "$BASE_REF" == production ]]; then
|
||
if [[ "${PR_TITLE:-}" == *"[allow-destructive-migration]"* ]]; then
|
||
warn "$msg — allowed by the [allow-destructive-migration] PR title override"
|
||
exit 0
|
||
fi
|
||
fail "$msg"
|
||
fi
|
||
warn "$msg"
|