Files
hercules-hyperion/scripts/ci/upload-package.sh
Yvan Janssens 93e90a1839
Some checks failed
ci/woodpecker/manual/woodpecker Pipeline failed
Add Woodpecker Debian package pipeline
2026-05-04 14:51:57 +02:00

95 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
source "$(cd "$(dirname "$0")/.." && pwd)/lib/common.sh"
require_cmd curl
require_env GITEA_PACKAGE_TOKEN
work_root="$(ci_work_root)"
metadata_file="$work_root/artifacts/package.env"
[[ -f "$metadata_file" ]] || die "Package metadata file not found: $metadata_file"
set -a
# shellcheck disable=SC1090
. "$metadata_file"
set +a
owner="${GITEA_PACKAGE_OWNER:-${CI_REPO_OWNER:-}}"
username="${GITEA_PACKAGE_USERNAME:-${CI_REPO_OWNER:-}}"
base_url="${GITEA_BASE_URL:-$DEFAULT_GITEA_BASE_URL}"
[[ -n "$owner" ]] || die "Unable to determine Gitea package owner. Set GITEA_PACKAGE_OWNER or CI_REPO_OWNER."
[[ -n "$username" ]] || die "Unable to determine Gitea upload username. Set GITEA_PACKAGE_USERNAME or CI_REPO_OWNER."
[[ -f "${PACKAGE_FILE:-}" ]] || die "Built package file not found: ${PACKAGE_FILE:-unset}"
upload_url="$base_url/api/packages/$owner/debian/pool/$PACKAGE_DISTRIBUTION/$PACKAGE_COMPONENT/upload"
upload_response_file="$(mktemp)"
urlencode() {
local input="$1"
local length="${#input}"
local index char encoded=""
for ((index = 0; index < length; index++)); do
char="${input:index:1}"
case "$char" in
[a-zA-Z0-9._~-]) encoded+="$char" ;;
*)
printf -v char '%%%02X' "'$char"
encoded+="$char"
;;
esac
done
printf '%s\n' "$encoded"
}
upload_package() {
curl \
--silent \
--show-error \
--output "$upload_response_file" \
--write-out '%{http_code}' \
--user "$username:$GITEA_PACKAGE_TOKEN" \
--upload-file "$PACKAGE_FILE" \
"$upload_url"
}
log "Uploading ${PACKAGE_FILE##*/} to $upload_url"
status_code="$(upload_package)"
if [[ "$status_code" == "409" ]]; then
delete_url="$base_url/api/packages/$owner/debian/pool/$PACKAGE_DISTRIBUTION/$PACKAGE_COMPONENT/$(urlencode "$PACKAGE_NAME")/$(urlencode "$PACKAGE_VERSION")/$(urlencode "$PACKAGE_ARCHITECTURE")"
log "Package already exists, deleting current $PACKAGE_NAME/$PACKAGE_VERSION/$PACKAGE_ARCHITECTURE before retry"
delete_status="$(
curl \
--silent \
--show-error \
--output "$upload_response_file" \
--write-out '%{http_code}' \
--user "$username:$GITEA_PACKAGE_TOKEN" \
--request DELETE \
"$delete_url"
)"
if [[ "$delete_status" != "204" ]]; then
cat "$upload_response_file" >&2
die "Package delete failed with HTTP $delete_status"
fi
status_code="$(upload_package)"
fi
if [[ "$status_code" != "201" ]]; then
cat "$upload_response_file" >&2
die "Package upload failed with HTTP $status_code"
fi
rm -f "$upload_response_file"
log "Upload finished"