zeek/auxil/spicy/scripts/store-release-artifacts
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

96 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
set -e
set -o pipefail
usage() {
cat << EOF
Downloads CI packaging artifacts and optionally uploads them to a release.
Usage: $0 --commit COMMIT --upload
This script downloads Cirrus CI packaging artifacts for the given COMMIT from
all completed tasks and stores them in a temporary directory. The packaging
artifacts will be renamed to include te name of the job which produced them.
The output directory will be reported.
With '--upload' artifacts are uploaded to the release page and we expect a valid
Github token with 'repo' scope passed on stdin. In this case COMMIT should
refer to a tag for which a release already exists.
EOF
}
if [ "$#" == 0 ]; then
usage;
exit 1
fi
while true; do
case "$1" in
--commit) COMMIT="$2"; shift; shift;;
--upload) UPLOAD=1; shift;;
*) break;;
esac
done
REPO=zeek/spicy
COMMIT=${COMMIT?Expected commit passed with '--commit COMMIT'}
while read -t 0 -r GITHUB_TOKEN; do
break
done < /dev/stdin
OUTPUT_DIR=binary_artifacts
mkdir ${OUTPUT_DIR} && cd "${OUTPUT_DIR}"
echo "Storing artifacts in ${OUTPUT_DIR}"
mkdir packages
curl -sSL https://api.github.com/repos/"${REPO}"/commits/"${COMMIT}"/check-runs'?per_page=100' \
| jq -r '.check_runs[] | select(.app.name=="Cirrus CI") | select(.name | test("^(docker|macos|freebsd)")) | select(.conclusion=="success") | ["https://api.cirrus-ci.com/v1/artifact/task/" + .external_id + "/packages.zip", .name] | @tsv' \
| while IFS=$'\t' read -r URI NAME; do
echo "Fetching artifacts for CI job ${NAME}"
curl -sSL "$URI" -o packages.zip
unzip packages.zip 1> /dev/null
# Testing with `-e` only works if there is a single glob match. We know
# this is the case here.
# shellcheck disable=SC2144
if [ -e build/spicy*.tar.gz ]; then
mv build/spicy*.tar.gz "packages/spicy_${NAME}.tar.gz"
elif [ -e spicy*.deb ]; then
mv spicy*.deb "packages/spicy_${NAME}.deb"
elif [ -e spicy*.rpm ]; then
mv spicy*.rpm "packages/spicy_${NAME}.rpm"
fi
rm -rf build spicy* packages.zip
done
mv packages/* .
rmdir packages
if [ -n "${UPLOAD}" ]; then
if [[ "${COMMIT}" != v* ]]; then
echo "Skipping upload since ${COMMIT} does not look like a release tag"
exit 1
fi
UPLOAD_URL=$(curl -sSL https://api.github.com/repos/"${REPO}"/releases | jq -r '.[] | select(.tag_name=="'"${COMMIT}"'") | .upload_url')
if [[ -z "${UPLOAD_URL}" ]]; then
echo "Not updating release artifacts since release ${COMMIT} does not exist"
exit 0
fi
for ARTIFACT in *.tar.gz; do
curl -sSL \
-X POST --data-binary @./"${ARTIFACT}" \
--header "Content-Type: application/octet-stream" \
--header "Authorization:token ${GITHUB_TOKEN}" \
"${UPLOAD_URL}?name=${ARTIFACT}"
done
fi