60 lines
1.4 KiB
Bash
60 lines
1.4 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
FAIL_STAGE="${1:-G3}"
|
||
|
|
DATE_TAG="${2:-$(date +%F)}"
|
||
|
|
PROJECT_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
|
||
|
|
OUT_DIR="$PROJECT_ROOT/reports/gates"
|
||
|
|
mkdir -p "$OUT_DIR"
|
||
|
|
LOG_FILE="$OUT_DIR/stage_gate_drill_${DATE_TAG}.log"
|
||
|
|
|
||
|
|
stages=(G0 G1 G2 G3 G4 G5)
|
||
|
|
|
||
|
|
: > "$LOG_FILE"
|
||
|
|
|
||
|
|
log() {
|
||
|
|
echo "$1" | tee -a "$LOG_FILE"
|
||
|
|
}
|
||
|
|
|
||
|
|
log "[INFO] stage gate drill start, fail_stage=$FAIL_STAGE, date=$DATE_TAG"
|
||
|
|
pass_count=0
|
||
|
|
failed=0
|
||
|
|
failed_stage=""
|
||
|
|
rollback_to=""
|
||
|
|
|
||
|
|
for s in "${stages[@]}"; do
|
||
|
|
if [[ "$s" == "$FAIL_STAGE" ]]; then
|
||
|
|
log "[FAIL] $s quality gate check failed: simulated contract drift"
|
||
|
|
failed=1
|
||
|
|
failed_stage="$s"
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
log "[PASS] $s quality gate check passed"
|
||
|
|
pass_count=$((pass_count+1))
|
||
|
|
done
|
||
|
|
|
||
|
|
if [[ $failed -eq 0 ]]; then
|
||
|
|
log "[INFO] no failure injected; drill considered invalid"
|
||
|
|
exit 2
|
||
|
|
fi
|
||
|
|
|
||
|
|
case "$failed_stage" in
|
||
|
|
G0) rollback_to="G0" ;;
|
||
|
|
G1) rollback_to="G0" ;;
|
||
|
|
G2) rollback_to="G1" ;;
|
||
|
|
G3) rollback_to="G2" ;;
|
||
|
|
G4) rollback_to="G3" ;;
|
||
|
|
G5) rollback_to="G4" ;;
|
||
|
|
*) rollback_to="G0" ;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
log "[ACTION] rollback triggered: from $failed_stage to $rollback_to"
|
||
|
|
log "[ACTION] freeze subsequent promotion stages"
|
||
|
|
log "[ACTION] open corrective task with 24h SLA"
|
||
|
|
log "[PASS] rollback drill complete"
|
||
|
|
|
||
|
|
echo "LOG_FILE=$LOG_FILE"
|
||
|
|
echo "PASS_COUNT=$pass_count"
|
||
|
|
echo "FAILED_STAGE=$failed_stage"
|
||
|
|
echo "ROLLBACK_TO=$rollback_to"
|