85 lines
2.6 KiB
Bash
Executable File
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}"
|