Files
Test User 5152086668
CI / Docker build (push) Has been cancelled
CI / Frontend test and build (push) Has been cancelled
CI / Rust test (push) Has been cancelled
Release / Build and publish release (push) Has been cancelled
Initial browser fingerprint app with Gitea CI
2026-07-04 03:15:26 +08:00

85 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
if [[ $# -eq 0 ]]; then
echo "usage: $0 <asset> [asset ...]" >&2
exit 2
fi
: "${GITEA_TOKEN:?GITEA_TOKEN is required}"
: "${GITEA_API_URL:?GITEA_API_URL is required, for example https://git.example.com/api/v1}"
: "${GITEA_REPOSITORY:?GITEA_REPOSITORY is required, for example owner/repo}"
: "${RELEASE_TAG:?RELEASE_TAG is required}"
RELEASE_TARGET="${RELEASE_TARGET:-${RELEASE_TAG}}"
RELEASE_NAME="${RELEASE_NAME:-${RELEASE_TAG}}"
RELEASE_BODY="${RELEASE_BODY:-Automated release ${RELEASE_TAG}.}"
PRERELEASE="${PRERELEASE:-false}"
api() {
curl -fsS \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"$@"
}
json_payload="$(
RELEASE_TAG="${RELEASE_TAG}" \
RELEASE_TARGET="${RELEASE_TARGET}" \
RELEASE_NAME="${RELEASE_NAME}" \
RELEASE_BODY="${RELEASE_BODY}" \
PRERELEASE="${PRERELEASE}" \
node <<'NODE'
const payload = {
tag_name: process.env.RELEASE_TAG,
target_commitish: process.env.RELEASE_TARGET,
name: process.env.RELEASE_NAME,
body: process.env.RELEASE_BODY,
draft: false,
prerelease: process.env.PRERELEASE === "true",
};
process.stdout.write(JSON.stringify(payload));
NODE
)"
release_url="${GITEA_API_URL}/repos/${GITEA_REPOSITORY}/releases/tags/${RELEASE_TAG}"
release_json="$(api "${release_url}" 2>/dev/null || true)"
if [[ -z "${release_json}" ]]; then
release_json="$(
api \
-X POST \
-H "Content-Type: application/json" \
--data "${json_payload}" \
"${GITEA_API_URL}/repos/${GITEA_REPOSITORY}/releases"
)"
fi
release_id="$(printf '%s' "${release_json}" | node -e 'let data=""; process.stdin.on("data", d => data += d); process.stdin.on("end", () => process.stdout.write(String(JSON.parse(data).id)));')"
assets_json="$(api "${GITEA_API_URL}/repos/${GITEA_REPOSITORY}/releases/${release_id}/assets")"
for asset in "$@"; do
[[ -f "${asset}" ]] || continue
name="$(basename "${asset}")"
existing_id="$(
ASSETS_JSON="${assets_json}" ASSET_NAME="${name}" node <<'NODE'
const assets = JSON.parse(process.env.ASSETS_JSON || "[]");
const asset = assets.find(item => item.name === process.env.ASSET_NAME);
if (asset) process.stdout.write(String(asset.id));
NODE
)"
if [[ -n "${existing_id}" ]]; then
api -X DELETE "${GITEA_API_URL}/repos/${GITEA_REPOSITORY}/releases/${release_id}/assets/${existing_id}" >/dev/null
fi
api \
-X POST \
-F "attachment=@${asset}" \
"${GITEA_API_URL}/repos/${GITEA_REPOSITORY}/releases/${release_id}/assets?name=${name}" \
>/dev/null
echo "Uploaded ${name}"
done
echo "Published release ${RELEASE_TAG}"