Last active
May 15, 2024 19:07
-
-
Save jprinet/13ffaac26a973cd20c37007e93f0a67c to your computer and use it in GitHub Desktop.
Get list of Github repositories in build scans
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Prerequisites:
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]