#!/bin/bash # Jenkins-driven test runner for python-api-automation, ported from a sibling do-*-automation # repo's Jenkins runner script (same stash/rerun/report-merge structure), adapted for pytest: # dropped the `--headless` flag (Selenium-only, meaningless for pure API tests) and simplified the # ENV -> postactivate-.sh mapping to this repo's actual two files (PRODUCTION vs everything # else -- postactivate-dev.sh already targets the stg3 environment here, unlike the source repo's # separate STG2/STG3 files). # ===================================================== # Configuration # ===================================================== ALLURE_RESULTS_ROOT="reports" INITIAL_RESULTS="${ALLURE_RESULTS_ROOT}/initial" RERUN_RESULTS="${ALLURE_RESULTS_ROOT}/rerun" ALLURE_REPORT_DIR="allure-report" TEMP_DIR="temp" OWNER="Autobot" if [ $# -lt 2 ]; then echo "Usage: $0 [rerun]" echo " rerun: true (default) or false. Pass false to skip rerun of failed tests." exit 1 fi TAG=$1 ENV=$2 # Optional 3rd arg: true = run rerun, false = skip rerun (e.g. from Jenkins params.RERUN) RERUN="${3:-true}" # ===================================================== # STEP 1: History Preservation & Cleanup # ===================================================== echo "[INFO] Stashing Allure history" mkdir -p "$TEMP_DIR/history_stash" if [ -d "$ALLURE_REPORT_DIR/history" ]; then cp -r "$ALLURE_REPORT_DIR/history/." "$TEMP_DIR/history_stash/" fi echo "[INFO] Cleaning previous execution artifacts" rm -rf "$ALLURE_RESULTS_ROOT" rm -rf "$ALLURE_REPORT_DIR" rm -rf allure-report-initial allure-report-rerun allure-report-single rm -rf "$TEMP_DIR"/*.json .pytest_cache mkdir -p "$TEMP_DIR" "$INITIAL_RESULTS" "$RERUN_RESULTS" if [ "$(ls -A $TEMP_DIR/history_stash 2>/dev/null)" ]; then echo "[INFO] Restoring history to initial results" mkdir -p "$INITIAL_RESULTS/history" cp -r "$TEMP_DIR/history_stash/." "$INITIAL_RESULTS/history/" fi # ===================================================== # STEP 2: Environment Setup # On CI the pipeline already activates the venv and sources the postactivate for the target env # before calling this script. Only fall back to local setup if that hasn't happened, so we never # clobber the pipeline's configuration. # ===================================================== if [ -z "$VIRTUAL_ENV" ]; then if [ -f "venv/bin/activate" ]; then echo "[INFO] Activating local venv" source venv/bin/activate else echo "[WARN] No active virtualenv and ./venv not found; using current Python" fi else echo "[INFO] Using already-active virtualenv: $VIRTUAL_ENV" fi # Source the postactivate for this env only if ENVIRONMENT isn't already set. This repo only has # two real postactivate files (prod, and dev which targets stg3) -- unlike some sibling repos there # is no separate stg2/stg3 file to switch on. if [ -z "$ENVIRONMENT" ]; then case "$(echo "$ENV" | tr '[:lower:]' '[:upper:]')" in PRODUCTION) POSTACTIVATE="postactivate-prod.sh" ;; *) POSTACTIVATE="postactivate-dev.sh" ;; esac if [ -f "$POSTACTIVATE" ]; then echo "[INFO] Sourcing $POSTACTIVATE for ENV=$ENV" source "$POSTACTIVATE" else echo "[WARN] $POSTACTIVATE not found; assuming environment is already configured" fi else echo "[INFO] ENVIRONMENT=$ENVIRONMENT already set; skipping postactivate sourcing" fi # ===================================================== # STEP 3: INITIAL RUN & SUMMARY # ===================================================== echo "================ INITIAL RUN ================" # --dist=loadgroup: normal load-balanced parallel distribution, except tests carrying the same # xdist_group marker (assigned in tests/regression/conftest.py::pytest_collection_modifyitems -- # the contest domain and the shared-OTP-mailbox tests) always land on the same worker, so they # never race each other under -n auto. pytest -n auto --dist=loadgroup -m "$TAG" --alluredir="$INITIAL_RESULTS" || true # Essential for send_email_report.py (initial_stats) allure generate "$INITIAL_RESULTS" --clean -o "allure-report-initial" cp "allure-report-initial/widgets/summary.json" "$TEMP_DIR/initial_summary.json" # ===================================================== # STEP 4: RERUN & SUMMARY (optional; pass false as 3rd arg to skip) # ===================================================== is_rerun_enabled() { case "$(echo "$RERUN" | tr '[:upper:]' '[:lower:]')" in false|0|no) return 1 ;; *) return 0 ;; # true or empty -> enabled esac } if is_rerun_enabled && [ -f ".pytest_cache/v/cache/lastfailed" ]; then echo "================ RERUN FAILED TESTS ================" # Inject history into rerun folder to maintain trend continuity if [ -d "$INITIAL_RESULTS/history" ]; then mkdir -p "$RERUN_RESULTS/history" cp -r "$INITIAL_RESULTS/history/." "$RERUN_RESULTS/history/" fi pytest --last-failed --last-failed-no-failures=none --alluredir="$RERUN_RESULTS" || true # Essential for send_email_report.py (rerun_stats) allure generate "$RERUN_RESULTS" --clean -o "allure-report-rerun" cp "allure-report-rerun/widgets/summary.json" "$TEMP_DIR/rerun_summary.json" elif ! is_rerun_enabled; then echo "[INFO] Rerun skipped (RERUN=$RERUN)" fi # ===================================================== # STEP 5: FINAL CONSOLIDATED REPORT & EMAIL ARTIFACTS # ===================================================== echo "================ GENERATING FINAL REPORTS ================" # Final report for Jenkins/History persistence allure generate "$INITIAL_RESULTS" "$RERUN_RESULTS" --clean -o "$ALLURE_REPORT_DIR" # Final summary and suites.csv for the email script cp "$ALLURE_REPORT_DIR/widgets/summary.json" "$TEMP_DIR/summary.json" cp "$ALLURE_REPORT_DIR/data/suites.csv" "$TEMP_DIR/suites.csv" # Single file report (email attachment) allure generate --single-file "$INITIAL_RESULTS" "$RERUN_RESULTS" --clean -o allure-report-single cp allure-report-single/index.html "$TEMP_DIR/index.html" # ===================================================== # STEP 6: SEND EMAIL & CLEANUP # ===================================================== python send_email_report.py "$OWNER" "$TAG" # Cleanup results but keep allure-report for next run's history stash # Commented out so Jenkins' allure post-step can read raw results after this script exits # rm -rf "$ALLURE_RESULTS_ROOT" rm -rf allure-report-initial allure-report-rerun allure-report-single echo "Test execution completed successfully"