chore(release): 新增国内 Gitea 发布脚本 publish-gitea.sh(先国内后 GitHub 流程)
This commit is contained in:
1 parent
5864d661c1
commit
7bc2dee8b2
1 file changed
+62
@@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env bash
|
||||
# Publish a release (notes + assets) to the domestic Gitea mirror
|
||||
# (git.codingplan.site/admin/KimiCodeSwitch).
|
||||
#
|
||||
# Usage: publish-gitea.sh <tag> <asset> [asset...]
|
||||
# tag : e.g. v0.7.15; notes read from release-notes-<tag>.md
|
||||
# assets : files to attach (MSI, install-macos.sh, ...)
|
||||
#
|
||||
# Auth: reuses the stored git credential for git.codingplan.site
|
||||
# (`git credential fill`); the secret never appears in argv or output.
|
||||
set -euo pipefail
|
||||
|
||||
GITEA="https://git.codingplan.site/api/v1"
|
||||
REPO="admin/KimiCodeSwitch"
|
||||
TAG="${1:?usage: publish-gitea.sh <tag> <asset> [asset...]}"
|
||||
shift
|
||||
|
||||
NOTES_FILE="release-notes-${TAG}.md"
|
||||
json_escape() {
|
||||
python - "$1" <<'PYEOF'
|
||||
import json, sys
|
||||
print(json.dumps(open(sys.argv[1], encoding="utf-8").read()))
|
||||
PYEOF
|
||||
}
|
||||
if [[ -f "$NOTES_FILE" ]]; then
|
||||
BODY=$(json_escape "$NOTES_FILE")
|
||||
else
|
||||
BODY="\"${TAG}\""
|
||||
fi
|
||||
|
||||
# Resolve stored git credential for this host (no secret echoed).
|
||||
CRED=$(printf 'protocol=https\nhost=git.codingplan.site\n\n' | git credential fill)
|
||||
USER=$(grep '^username=' <<<"$CRED" | cut -d= -f2-)
|
||||
PASS=$(grep '^password=' <<<"$CRED" | cut -d= -f2-)
|
||||
[[ -n "$USER" && -n "$PASS" ]] || { echo "no stored credential for git.codingplan.site" >&2; exit 1; }
|
||||
AUTH=(-u "$USER:$PASS")
|
||||
|
||||
# Create (or reuse) the release for this tag.
|
||||
EXISTING=$(curl -sf --max-time 20 "${AUTH[@]}" "$GITEA/repos/$REPO/releases/tags/$TAG" || true)
|
||||
if [[ -n "$EXISTING" && "$EXISTING" != *"message"* ]]; then
|
||||
RELEASE_ID=$(grep -o '"id":[0-9]*' <<<"$EXISTING" | head -1 | cut -d: -f2)
|
||||
echo "release $TAG exists (id=$RELEASE_ID), attaching assets"
|
||||
else
|
||||
CREATED=$(curl -sf --max-time 20 "${AUTH[@]}" \
|
||||
-H 'Content-Type: application/json' -X POST \
|
||||
-d "{\"tag_name\":\"$TAG\",\"name\":\"$TAG\",\"body\":$BODY,\"draft\":false,\"prerelease\":false}" \
|
||||
"$GITEA/repos/$REPO/releases")
|
||||
RELEASE_ID=$(grep -o '"id":[0-9]*' <<<"$CREATED" | head -1 | cut -d: -f2)
|
||||
echo "created release $TAG (id=$RELEASE_ID)"
|
||||
fi
|
||||
|
||||
for ASSET in "$@"; do
|
||||
[[ -f "$ASSET" ]] || { echo "skip missing asset: $ASSET" >&2; continue; }
|
||||
NAME=$(basename "$ASSET")
|
||||
CODE=$(curl -s -o /dev/null -w '%{http_code}' --max-time 600 "${AUTH[@]}" \
|
||||
-F "attachment=@$ASSET" \
|
||||
"$GITEA/repos/$REPO/releases/$RELEASE_ID/assets?name=$NAME")
|
||||
echo "upload $NAME -> HTTP $CODE"
|
||||
[[ "$CODE" == 2* ]] || { echo "upload failed: $NAME" >&2; exit 1; }
|
||||
done
|
||||
|
||||
echo "done: https://git.codingplan.site/$REPO/releases/tag/$TAG"
|
||||
Reference in new issue
Block a user