ci: migrate workflows and releases to Gitea
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
archive_path="${1:-relaytv.zip}"
|
||||
notes_path="${2:-RELEASE_NOTES.md}"
|
||||
|
||||
for variable_name in GITEA_SERVER_URL GITEA_REPOSITORY GITEA_REF_NAME GITEA_TOKEN; do
|
||||
if [[ -z "${!variable_name:-}" ]]; then
|
||||
echo "Required environment variable is not set: ${variable_name}" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ! -f "$archive_path" ]]; then
|
||||
echo "Release archive does not exist: $archive_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "$notes_path" ]]; then
|
||||
echo "Release notes do not exist: $notes_path" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
api_base="${GITEA_SERVER_URL%/}/api/v1/repos/${GITEA_REPOSITORY}/releases"
|
||||
asset_name="${archive_path##*/}"
|
||||
authorization_header="Authorization: token ${GITEA_TOKEN}"
|
||||
|
||||
release_payload="$({
|
||||
RELEASE_NOTES_PATH="$notes_path" python3 - <<'PY'
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
tag = os.environ["GITEA_REF_NAME"]
|
||||
notes = Path(os.environ["RELEASE_NOTES_PATH"]).read_text(encoding="utf-8")
|
||||
print(json.dumps({
|
||||
"body": notes,
|
||||
"draft": False,
|
||||
"name": tag,
|
||||
"prerelease": False,
|
||||
"tag_name": tag,
|
||||
}))
|
||||
PY
|
||||
})"
|
||||
|
||||
lookup_response="$(
|
||||
curl --silent --show-error \
|
||||
--header "$authorization_header" \
|
||||
--output - \
|
||||
--write-out $'\n%{http_code}' \
|
||||
"$api_base/tags/$GITEA_REF_NAME"
|
||||
)"
|
||||
lookup_status="${lookup_response##*$'\n'}"
|
||||
lookup_body="${lookup_response%$'\n'*}"
|
||||
|
||||
case "$lookup_status" in
|
||||
200)
|
||||
release_id="$(python3 -c 'import json, sys; print(json.load(sys.stdin)["id"])' <<<"$lookup_body")"
|
||||
curl --fail-with-body --silent --show-error \
|
||||
--request PATCH \
|
||||
--header "$authorization_header" \
|
||||
--header "Content-Type: application/json" \
|
||||
--data "$release_payload" \
|
||||
"$api_base/$release_id" >/dev/null
|
||||
;;
|
||||
404)
|
||||
release_response="$(
|
||||
curl --fail-with-body --silent --show-error \
|
||||
--request POST \
|
||||
--header "$authorization_header" \
|
||||
--header "Content-Type: application/json" \
|
||||
--data "$release_payload" \
|
||||
"$api_base"
|
||||
)"
|
||||
release_id="$(python3 -c 'import json, sys; print(json.load(sys.stdin)["id"])' <<<"$release_response")"
|
||||
;;
|
||||
*)
|
||||
echo "Could not look up Gitea release for $GITEA_REF_NAME (HTTP $lookup_status)." >&2
|
||||
echo "$lookup_body" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
asset_id="$({
|
||||
ASSET_NAME="$asset_name" python3 -c '
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
|
||||
assets = json.load(sys.stdin)
|
||||
match = next((asset for asset in assets if asset["name"] == os.environ["ASSET_NAME"]), None)
|
||||
print(match["id"] if match else "")
|
||||
' < <(
|
||||
curl --fail-with-body --silent --show-error \
|
||||
--header "$authorization_header" \
|
||||
"$api_base/$release_id/assets"
|
||||
)
|
||||
})"
|
||||
|
||||
if [[ -n "$asset_id" ]]; then
|
||||
curl --fail-with-body --silent --show-error \
|
||||
--request DELETE \
|
||||
--header "$authorization_header" \
|
||||
"$api_base/$release_id/assets/$asset_id" >/dev/null
|
||||
fi
|
||||
|
||||
curl --fail-with-body --silent --show-error \
|
||||
--request POST \
|
||||
--header "$authorization_header" \
|
||||
--form "attachment=@${archive_path};filename=${asset_name}" \
|
||||
"$api_base/$release_id/assets?name=$asset_name" >/dev/null
|
||||
|
||||
echo "Published $asset_name to Gitea release $GITEA_REF_NAME."
|
||||
Reference in New Issue
Block a user