SonarQube API Call to list all projects and sort it by last analysis date

I’m trying to generate a list of all my projects and sort it by last analysis date. There are projects that are on the list that are tagged as "never"analyzed but when I check it through the sonarqube ui it is recently analyzed.

Need someone to point me to the right API Call to use so I can adjust my script.

#!/bin/bash
SONAR_URL=""
SONAR_TOKEN=""
OUTPUT="projects.csv"
PAGE_SIZE=500

# Step 1: Build a lookup of key -> lastAnalysisDate from admin endpoint
declare -A DATES
PAGE=1; TOTAL=1
while (( (PAGE - 1) * PAGE_SIZE < TOTAL )); do
  RESPONSE=$(curl -sf -u "$SONAR_TOKEN:" \
    "${SONAR_URL}/api/projects/search?ps=${PAGE_SIZE}&p=${PAGE}")
  TOTAL=$(echo "$RESPONSE" | jq '.paging.total')
  while IFS=$'\t' read -r key date; do
    DATES["$key"]="$date"
  done < <(echo "$RESPONSE" | jq -r '.components[] | [.key, (.lastAnalysisDate // "never")] | @tsv')
  PAGE=$(( PAGE + 1 ))
done

# Step 2: Fetch all visible projects and enrich with dates and overall status from lookup
echo "key,name,lastAnalysisDate,overallStatus" > "$OUTPUT"
PAGE=1; TOTAL=1
while (( (PAGE - 1) * PAGE_SIZE < TOTAL )); do
  RESPONSE=$(curl -sf -u "$SONAR_TOKEN:" \
    "${SONAR_URL}/api/components/search_projects?s=analysisDate&asc=no&ps=${PAGE_SIZE}&p=${PAGE}")
  TOTAL=$(echo "$RESPONSE" | jq '.paging.total')
  while IFS=$'\t' read -r key name status; do
    date="${DATES[$key]:-never}"
    printf '"%s","%s","%s","%s"\n' "${key//\"/\"\"}" "${name//\"/\"\"}" "$date" "$status"
  done < <(echo "$RESPONSE" | jq -r '.components[] | [.key, .name, (.measures // [] | map(select(.metric == "alert_status")) | first | .value // "NONE")] | @tsv') >> "$OUTPUT"
  PAGE=$(( PAGE + 1 ))
done

echo "Saved $(($(wc -l < "$OUTPUT") - 1)) projects to $OUTPUT"

Hi,

Which branch is recently analyzed?

You can sort the Projects page by last analysis, but it will be strictly of each project’s main branch.

There’s no good way to do it by “any branch”. For that, it would be a very manual process:

for project in all_projects
  for branch in all_branches
    get-and-store(last analysis date)
sorting-logic

 
HTH,
Ann