Files
2026-11-06 21:43:41 +05:30

67 lines
2.5 KiB
Bash

#!/usr/bin/env bash
# Regenerates every file in gatling-spring-boot/output/.
# Needs JDK 25 and Maven on the PATH and python3 (standard library only).
# k6 is optional: set K6=/path/to/k6 or have it on the PATH; without it the k6 steps are skipped.
# Takes about 6 minutes: no single load run is longer than ~70 seconds.
set -euo pipefail
cd "$(dirname "$0")/.."
PORT="${PORT:-18300}"
export APP_URL="http://localhost:${PORT}"
K6="${K6:-$(command -v k6 || true)}"
OUT=output
JAR=target/gatling-spring-boot-lab-1.0.0.jar
# keep transcripts free of JVM launcher noise that varies per machine
filter() { grep -vE '^(Picked up JAVA_TOOL_OPTIONS|WARNING: )' || true; }
rm -f "$OUT"/*.txt "$OUT"/*.json "$OUT"/*.svg
mkdir -p "$OUT"
# 1. unit test: the capacity limit the whole post relies on (writes output/01-saturation-test.txt)
mvn -B -q clean test 2>&1 | filter
# 2. build and start the app under test
mvn -B -q package -DskipTests 2>&1 | filter
mkdir -p target/k6
PORT="$PORT" java -jar "$JAR" > target/app.log 2>&1 &
APP_PID=$!
trap 'kill $APP_PID 2>/dev/null || true' EXIT
for _ in $(seq 1 60); do
curl -fs "$APP_URL/api/stats" > /dev/null 2>&1 && break
sleep 1
done
curl -fs "$APP_URL/api/quote/ORCL" > "$OUT/02-single-request.txt"; echo >> "$OUT/02-single-request.txt"
# 3. Gatling runs, one simulation per mvn invocation
gatling() { # <output file> <simulation class>
mvn -B test-compile gatling:test -Dgatling.simulationClass="lab.gatling.$2" 2>&1 | filter > "$OUT/$1"
}
gatling 03-basic-console.txt BasicSimulation
gatling 04-knee-steps-console.txt KneeStepsSimulation
python3 scripts/analyze.py gatling "$(ls -dt target/gatling/kneestepssimulation-* | head -1)"
gatling 06-knee-ramp-console.txt KneeRampSimulation
gatling 07-closed-model-console.txt ClosedModelSimulation
# 4. the run that must fail the build; keep going, record Maven's exit code
set +e
gatling 05-failing-assertion-console.txt FailingAssertionSimulation
echo "maven exit code: ${PIPESTATUS[0]}" > "$OUT/05b-failing-assertion-exit.txt"
set -e
# 5. k6, same app, same profile
if [ -n "$K6" ]; then
"$K6" version > "$OUT/20-k6-version.txt"
"$K6" run --quiet --out json=target/k6/knee.json k6/knee.js > "$OUT/22-k6-knee-console.txt" 2>&1
python3 scripts/analyze.py k6 target/k6/knee.json
set +e
"$K6" run --quiet k6/threshold-fail.js > "$OUT/23-k6-threshold-fail-console.txt" 2>&1
echo "k6 exit code: $?" > "$OUT/23b-k6-threshold-fail-exit.txt"
set -e
else
echo "k6 not found: skipping k6 steps" >&2
fi
python3 scripts/analyze.py chart
echo "done: $(ls "$OUT" | wc -l) files in $OUT/"