64 lines
2.3 KiB
Bash
Executable File
64 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
artifact_dir="${ARTIFACT_DIR:-$root_dir/artifacts}"
|
|
GITEA_SERVER_URL="${GITEA_SERVER_URL:?GITEA_SERVER_URL is required}"
|
|
GITEA_REPOSITORY="${GITEA_REPOSITORY:?GITEA_REPOSITORY is required}"
|
|
GITEA_RELEASE_TAG="${GITEA_RELEASE_TAG:?GITEA_RELEASE_TAG is required}"
|
|
GITEA_TOKEN="${GITEA_TOKEN:?GITEA_TOKEN is required}"
|
|
|
|
[[ "$GITEA_REPOSITORY" =~ ^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$ ]] || {
|
|
echo "Invalid GITEA_REPOSITORY: $GITEA_REPOSITORY" >&2
|
|
exit 1
|
|
}
|
|
|
|
owner="${GITEA_REPOSITORY%%/*}"
|
|
repository="${GITEA_REPOSITORY#*/}"
|
|
api="${GITEA_SERVER_URL%/}/api/v1/repos/$owner/$repository"
|
|
metadata="$(mktemp)"
|
|
response="$(mktemp)"
|
|
existing_names="$(mktemp)"
|
|
trap 'rm -f "$metadata" "$response" "$existing_names"' EXIT
|
|
|
|
auth_header="Authorization: token $GITEA_TOKEN"
|
|
status="$(curl --silent --show-error --output "$metadata" --write-out '%{http_code}' \
|
|
--header "$auth_header" "$api/releases/tags/$GITEA_RELEASE_TAG")"
|
|
[[ "$status" == 200 ]] || {
|
|
echo "Unable to find release $GITEA_RELEASE_TAG (HTTP $status)" >&2
|
|
cat "$metadata" >&2
|
|
exit 1
|
|
}
|
|
|
|
release_id="$(python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])' < "$metadata")"
|
|
python3 -c 'import json,sys; [print(a["name"]) for a in json.load(sys.stdin).get("assets", [])]' \
|
|
< "$metadata" > "$existing_names"
|
|
|
|
shopt -s nullglob
|
|
assets=("$artifact_dir"/*.deb "$artifact_dir"/*.apk)
|
|
checksums=("$artifact_dir"/SHA256SUMS*)
|
|
assets+=("${checksums[@]}")
|
|
((${#assets[@]} > 0)) || {
|
|
echo "No release assets found in $artifact_dir" >&2
|
|
exit 1
|
|
}
|
|
|
|
for asset in "${assets[@]}"; do
|
|
name="$(basename "$asset")"
|
|
if grep -Fxq -- "$name" "$existing_names"; then
|
|
echo "Release asset already exists; keeping it: $name"
|
|
continue
|
|
fi
|
|
encoded_name="$(python3 -c 'import sys,urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$name")"
|
|
echo "Uploading release asset: $name"
|
|
status="$(curl --silent --show-error --output "$response" --write-out '%{http_code}' \
|
|
--request POST --header "$auth_header" --form "attachment=@$asset" \
|
|
"$api/releases/$release_id/assets?name=$encoded_name")"
|
|
[[ "$status" == 201 ]] || {
|
|
echo "Gitea returned HTTP $status while uploading $name" >&2
|
|
cat "$response" >&2
|
|
exit 1
|
|
}
|
|
: > "$response"
|
|
done
|