#!/bin/bash set -euo pipefail SONAR_URL="http://192.168.1.2:9001" PROJECT="Warehouse-Management-System" # The directory scan.sh was invoked from is the project root. PROJECT_DIR="$PWD" OUTPUT="$PROJECT_DIR/sonarqube-issues.csv" TMP=$(mktemp) trap 'rm -f "$TMP" "$TMP.new"' EXIT if [ -z "${SONAR_TOKEN:-}" ]; then echo "ERROR: SONAR_TOKEN is not set" exit 1 fi if [ ! -d "$PROJECT_DIR" ]; then echo "ERROR: Project directory does not exist: $PROJECT_DIR" exit 1 fi # Delete previous report FIRST. echo "Removing previous SonarQube report..." rm -f "$OUTPUT" echo echo "Project directory: $PROJECT_DIR" echo "Running SonarQube scan..." cd "$PROJECT_DIR" JAVA_HOME="/opt/homebrew/opt/openjdk" \ PATH="/opt/homebrew/opt/openjdk/bin:$PATH" \ sonar-scanner \ -Dsonar.projectKey="$PROJECT" \ -Dsonar.sources=. \ -Dsonar.host.url="$SONAR_URL" \ -Dsonar.token="$SONAR_TOKEN" echo echo "Downloading SonarQube issues..." echo '[]' > "$TMP" PAGE=1 PAGE_SIZE=500 while true; do echo "Fetching page $PAGE..." RESPONSE=$(curl \ --connect-timeout 5 \ --max-time 60 \ -sS \ -u "$SONAR_TOKEN:" \ "$SONAR_URL/api/issues/search?componentKeys=$PROJECT&ps=$PAGE_SIZE&p=$PAGE") COUNT=$(echo "$RESPONSE" | jq '.issues | length') TOTAL=$(echo "$RESPONSE" | jq '.total') echo " $COUNT issues received ($TOTAL total)" jq -s '.[0] + .[1].issues' \ "$TMP" \ <(printf '%s' "$RESPONSE") > "$TMP.new" mv "$TMP.new" "$TMP" [ "$COUNT" -lt "$PAGE_SIZE" ] && break PAGE=$((PAGE + 1)) done jq -r --arg project "$PROJECT" ' [ "Severity", "Type", "Status", "Rule", "File", "Line", "Message", "Effort", "Assignee", "Author", "Created", "Updated" ], (.[] | [ .severity, .type, .status, .rule, (.component | sub("^" + $project + ":";"")), (.line // ""), .message, (.effort // ""), (.assignee // ""), (.author // ""), .creationDate, .updateDate ]) | @csv ' "$TMP" > "$OUTPUT" ISSUE_COUNT=$(($(wc -l < "$OUTPUT") - 1)) echo echo "Complete." echo "Report: $OUTPUT" echo "Issues exported: $ISSUE_COUNT"