Skip to content

Instantly share code, notes, and snippets.

@jprinet
Last active May 15, 2024 19:07
Show Gist options
  • Save jprinet/13ffaac26a973cd20c37007e93f0a67c to your computer and use it in GitHub Desktop.
Save jprinet/13ffaac26a973cd20c37007e93f0a67c to your computer and use it in GitHub Desktop.
Get list of Github repositories in build scans
#!/bin/bash
# init parameters
readonly geUrl=$1
readonly bearerToken=$2
readonly daysAgo=$3
# init global vars
readonly maxBuildsPerBatch=100
readonly recoveryFile="$0.out.build-scan-id"
readonly outputFile="$0.out.txt"
readonly workFile="$0.out.tmp.txt"
buildScans=""
buildCount=1
#############
# functions #
#############
function getBuildScansInTimeWindowWithGitRepositoryAsCustomValue() {
local filter=$1
local encodedQuery=$(echo "value:\"Git repository=*\" and buildStartTime > -${daysAgo}d" | jq -sRr @uri)
buildScans=$(curl --silent "${geUrl}/api/builds?${filter}&maxBuilds=${maxBuildsPerBatch}&reverse=false&query=${encodedQuery}" --header "authorization: Bearer ${bearerToken}" | jq -r ".[] | [.id,.availableAt,.buildToolType] | @csv")
}
function getBuildScans() {
getBuildScansInTimeWindowWithGitRepositoryAsCustomValue "fromInstant=0"
}
function getBuildScansFromBuildId() {
local buildId=$1
getBuildScansInTimeWindowWithGitRepositoryAsCustomValue "fromBuild=${buildId}"
}
########
# main #
########
# check if recovery data are present
recoveryBuildScanId=$(cat ${recoveryFile} 2>/dev/null)
if [[ -z "${recoveryBuildScanId}" ]]
then
# Clean output files
rm -f ${outputFile}
rm -f ${workFile}
# Get first batch of builds
getBuildScans
else
echo "Recovering data from build scan id ${recoveryBuildScanId} (you can trigger a fresh run by deleting ${recoveryFile})"
# Get first batch of builds
getBuildScansFromBuildId ${recoveryBuildScanId}
fi
# Iterate over build scan list
while [ ! -z "${buildScans}" ]
do
buildScanId=""
for buildScan in ${buildScans}; do
# Remove "
buildScan=$(echo "${buildScan}" | sed -e 's/"//g')
# Parse fields
buildScanId=$(echo "${buildScan}" | cut -d, -f 1)
buildScanDate=$(echo "${buildScan}" | cut -d, -f 2)
buildTool=$(echo "${buildScan}" | cut -d, -f 3)
echo "Build ${buildCount}: Processing ${buildScanId} (${buildTool})"
# save build scan id for recovery mode
echo "${buildScanId}" > ${recoveryFile}
# Get Git repository
buildData=$(curl --silent ${geUrl}/api/builds/${buildScanId}/${buildTool}-attributes --header "authorization: Bearer ${bearerToken}" | jq -r '.values[] | select(.name | contains("Git repository")) | .value')
# remove .git extension
buildData=$(echo ${buildData} | sed -e 's/\.git$//')
# append to file if not already present
grep -q "${buildData}" $0.out.tmp.txt 2>/dev/null || echo ${buildData} >> $0.out.tmp.txt
buildCount=$((buildCount+1))
done
getBuildScansFromBuildId ${buildScanId}
done
# Remove recovery data
rm -f ${recoveryFile}
# Sort results
sort ${workFile} > ${outputFile}
# Display results
echo "List of repositories found:"
echo ""
cat ${outputFile}
@jprinet
Copy link
Author

jprinet commented Aug 22, 2023

Prerequisites:

  • Develocity 2023.3 or above
  • Access token with API Read permissions

Call me with:
./process-scans.sh <GE_URL> <GE_ACCESS_TOKEN> <NB_DAYS_FROM_NOW>

This will collect the Git repositories added as custom values (key Git repository) to build scans belonging to the date range [NOW, NOW - <NB_DAYS_FROM_NOW> days]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment