solus-packages/common/Scripts/buildserver-notification.sh
Joey Riches bcdd47c35d common: Parse build page json in buildserver-notification.sh
**Summary**
Make use of the new json output from the build page in order to obtain
more reliable results.

Additionally, get the tag from the package.yml stored in the latest commit
instead potentially tagging from any unstaged changes.

Lastly, take this opportunity to cleanup the script a little.
2023-10-20 19:49:47 +01:00

127 lines
4.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# Script to determine whether a published tag has completed on the build server and gives you a notification whether it has completed or failed.
# Additionally, if a package successfully builds it will then check if it gets successfully indexed into the repo.
# Check requirements before starting
REQUIREMENTS="curl unxz notify-send paplay jq"
for i in $REQUIREMENTS; do
if ! which $i &> /dev/null; then
echo "Missing requirement: $i. Install it to continue."
exit 1
fi
done
if [[ ! -z "${DISABLE_BUILD_SUCCESS_NOTIFY}" ]]; then
# For rebuild-template-script.sh
echo "Notification and sound ping for build success disabled due to DISABLE_BUILD_SUCCESS_NOTIFY being set."
fi
if [ -f "package.yml" ]; then
# Read the file from the latest commit in directory. Not from any potential unstaged changes
SPECFILEREF=$(git show $(git rev-list -1 HEAD .):./package.yml > /tmp/tmp.yml)
TAG=$($(git rev-parse --show-toplevel)/common/Scripts/gettag.py /tmp/tmp.yml)
rm /tmp/tmp.yml
elif [ -f "pspec.xml" ]; then
# Read the file from the latest commit in directory. Not from any potential unstaged changes
SPECFILEREF=$(git show $(git rev-list -1 HEAD .):./pspec.xml > /tmp/tmp.xml)
TAG=$($(git rev-parse --show-toplevel)/common/Scripts/gettag.py /tmp/tmp.xml)
rm /tmp/tmp.xml
else
echo "No valid package.yml or pspec.xml file found"
exit 1
fi
BUILDSERVER_JSON_URL="https://build.getsol.us/builds.json"
JSONPAGE="/tmp/builds.json"
# Download the page
curl -sSL $BUILDSERVER_JSON_URL -o $JSONPAGE
# Check it's actually been published first.
if [[ ! $(jq '.[] | select(.tag == $ARGS.positional[0])' "${JSONPAGE}" --args "${TAG}") ]] ; then
echo "${TAG} not found on build queue, has it been published?"
exit 1
fi
# Get the latest build-id for the $TAG
BUILDID=$(jq '.[] | select(.tag == $ARGS.positional[0]) | .id' "${JSONPAGE}" --args "${TAG}" | grep -o '[0-9]*' | sort -nr | head -1)
echo "Build ID: ${BUILDID} | Tag: ${TAG}"
# Look for build-ok from the build id
while [[ ! $(jq '.[] | select(.tag == $ARGS.positional[0]) | .status' "${JSONPAGE}" --args "${TAG}" | grep "OK") ]]; do
# Don't DoS the server
sleep 20
# Download new build page if-modified-since (-z)
curl -sSL -z $JSONPAGE $BUILDSERVER_JSON_URL -o $JSONPAGE
# Check if the build has failed
if [[ $(jq '.[] | select(.tag == $ARGS.positional[0]) | .status' "${JSONPAGE}" --args "${TAG}" | grep "FAILED") ]] ; then
echo "Failed on the build server!"
notify-send -u critical "${TAG} failed on the build server!" -t 0
paplay /usr/share/sounds/freedesktop/stereo/suspend-error.oga
exit 1
fi
done
echo "Build succeeded on the buildserver! Waiting for it to be indexed..."
if [ -f "${JSONPAGE}" ]; then rm ${JSONPAGE}; fi
### Now that it's built ensure we find it indexed into the repo.
# Setup for index check
INDEX_SHA_URL="https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz.sha1sum"
INDEX_XZ_URL="https://cdn.getsol.us/repo/unstable/eopkg-index.xml.xz"
INDEX_SHA=$(curl -s $INDEX_SHA_URL)
INDEX_XML="/tmp/unstable-index.xml"
curl -s $INDEX_XZ_URL -o ${INDEX_XML}.xz
unxz ${INDEX_XML}.xz -f
# Downloads and extracts the new index if the sha sum has changed.
update_index_if_changed() {
NEW_INDEX_SHA=$(curl -s $INDEX_SHA_URL)
# New sha, grab the new index
if [[ $NEW_INDEX_SHA != $INDEX_SHA ]]; then
INDEX_SHA=$NEW_INDEX_SHA
echo "index sha: ${INDEX_SHA}"
rm ${INDEX_XML}
curl -s $INDEX_XZ_URL -o ${INDEX_XML}.xz
unxz ${INDEX_XML}.xz -f
# Same sha, do nothing
elif [[ $NEW_INDEX_SHA = $INDEX_SHA ]]; then
echo "index sha: ${INDEX_SHA}"
else
echo "Unknown error occured."
if [ -f "${INDEX_XML}" ]; then rm ${INDEX_XML}; fi
exit 1
fi
}
# Look for the tag in the index
# FIXME: some packages like libreoffice do not output a eopkg file matching the tag
while [[ $(grep ${TAG} < ${INDEX_XML} | wc -l) -lt 1 ]] ; do
var=$((var+1))
# Wait up to 1m:30s (90 / (sleep) 5 = 18) before bailing
if [[ $var == 18 ]]; then
echo "Successfully built but hasn't been found in the index yet, please manually check."
notify-send -u low "${TAG} successfully built but hasen't been found in the index yet, please manually check." -t 0
paplay /usr/share/sounds/freedesktop/stereo/dialog-warning.oga
if [ -f "${INDEX_XML}" ]; then rm ${INDEX_XML}; fi
exit 1
fi
sleep 5
# Check for new index
update_index_if_changed
done
# Successfully built and indexed, we're happy bunnies.
echo "Successfully indexed into the repo!"
if [[ -z "${DISABLE_BUILD_SUCCESS_NOTIFY}" ]]; then
notify-send "${TAG} indexed into the repo!" -t 0
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
fi
if [ -f "${INDEX_XML}" ]; then rm ${INDEX_XML}; fi