Files
hercules-hyperion/scripts/ci/upload-package.sh
Yvan Janssens f3ee735362
Some checks failed
ci/woodpecker/push/woodpecker/4 Pipeline was successful
ci/woodpecker/push/woodpecker/2 Pipeline was successful
ci/woodpecker/push/woodpecker/3 Pipeline was successful
ci/woodpecker/push/woodpecker/5 Pipeline was successful
ci/woodpecker/push/woodpecker/1 Pipeline was successful
ci/woodpecker/push/woodpecker/6 Pipeline was successful
ci/woodpecker/manual/woodpecker/1 Pipeline failed
ci/woodpecker/manual/woodpecker/2 Pipeline was successful
ci/woodpecker/manual/woodpecker/6 Pipeline was successful
ci/woodpecker/manual/woodpecker/4 Pipeline was successful
ci/woodpecker/manual/woodpecker/3 Pipeline was successful
ci/woodpecker/manual/woodpecker/5 Pipeline was successful
Skip CI builds for existing packages
2026-05-05 12:35:23 +02:00

101 lines
2.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
source "$(cd "$(dirname "$0")/.." && pwd)/lib/common.sh"
require_cmd curl
work_root="$(ci_work_root)"
metadata_file="$(ci_metadata_file)"
[[ -f "$metadata_file" ]] || die "Package metadata file not found: $metadata_file"
set -a
# shellcheck disable=SC1090
. "$metadata_file"
set +a
if [[ "${SKIP_PACKAGE_BUILD:-false}" == "true" ]]; then
log "Skipping package upload because the package already exists in Gitea"
exit 0
fi
require_env GITEA_PACKAGE_TOKEN
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"