Skip to content

v0.6.0 - 文档站体验、UI 视觉与维护系统增强版 #3

v0.6.0 - 文档站体验、UI 视觉与维护系统增强版

v0.6.0 - 文档站体验、UI 视觉与维护系统增强版 #3

name: Sync GitHub Release to Gitee
on:
release:
types: [published, edited]
workflow_dispatch:
inputs:
tag:
description: 'v0.4.0'
required: true
type: string
jobs:
sync-gitee-release:
runs-on: ubuntu-latest
steps:
- name: Wait for Gitee mirror to sync tag
run: sleep 180
- name: Get GitHub release data
id: gh_release
env:
GH_TOKEN: ${{ github.token }}
EVENT_TAG: ${{ github.event.release.tag_name }}
INPUT_TAG: ${{ inputs.tag }}
run: |
set -e
TAG="${EVENT_TAG:-$INPUT_TAG}"
if [ -z "$TAG" ]; then
echo "Missing release tag."
exit 1
fi
echo "tag=$TAG" >> "$GITHUB_OUTPUT"
python3 <<'PY'
import json
import os
import urllib.request
token = os.environ["GH_TOKEN"]
repo = os.environ["GITHUB_REPOSITORY"]
tag = os.environ.get("EVENT_TAG") or os.environ.get("INPUT_TAG")
url = f"https://api.github.com/repos/{repo}/releases/tags/{tag}"
req = urllib.request.Request(url)
req.add_header("Authorization", f"Bearer {token}")
req.add_header("Accept", "application/vnd.github+json")
with urllib.request.urlopen(req, timeout=60) as res:
data = json.loads(res.read().decode("utf-8"))
with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as out:
out.write(f"name={data.get('name') or tag}\n")
out.write(f"prerelease={str(data.get('prerelease', False)).lower()}\n")
out.write("body<<EOF\n")
out.write(data.get("body") or "")
out.write("\nEOF\n")
PY
- name: Create or update Gitee release
env:
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
GITEE_OWNER: ${{ secrets.GITEE_OWNER }}
GITEE_REPO: ${{ secrets.GITEE_REPO }}
TAG_NAME: ${{ steps.gh_release.outputs.tag }}
RELEASE_NAME: ${{ steps.gh_release.outputs.name }}
RELEASE_BODY: ${{ steps.gh_release.outputs.body }}
PRERELEASE: ${{ steps.gh_release.outputs.prerelease }}
run: |
python3 <<'PY'
import json
import os
import urllib.parse
import urllib.request
import urllib.error
required = ["GITEE_TOKEN", "GITEE_OWNER", "GITEE_REPO", "TAG_NAME"]
missing = [key for key in required if not os.environ.get(key)]
if missing:
raise SystemExit(f"Missing required env/secrets: {', '.join(missing)}")
token = os.environ["GITEE_TOKEN"]
owner = os.environ["GITEE_OWNER"]
repo = os.environ["GITEE_REPO"]
tag = os.environ["TAG_NAME"]
name = os.environ.get("RELEASE_NAME") or tag
body = os.environ.get("RELEASE_BODY") or ""
prerelease = os.environ.get("PRERELEASE", "false").lower() == "true"
base = f"https://gitee.com/api/v5/repos/{owner}/{repo}"
def request(method, url, data=None):
req = urllib.request.Request(url, method=method)
encoded = None
if data is not None:
encoded = urllib.parse.urlencode(data).encode("utf-8")
req.add_header("Content-Type", "application/x-www-form-urlencoded")
try:
with urllib.request.urlopen(req, data=encoded, timeout=60) as res:
text = res.read().decode("utf-8")
return json.loads(text) if text else None
except urllib.error.HTTPError as e:
text = e.read().decode("utf-8", errors="replace")
print(f"HTTP {e.code}: {text}")
raise
releases_url = f"{base}/releases?access_token={urllib.parse.quote(token)}&per_page=100"
releases = request("GET", releases_url) or []
existing = None
for item in releases:
if item.get("tag_name") == tag:
existing = item
break
payload = {
"access_token": token,
"tag_name": tag,
"name": name,
"body": body,
"prerelease": "true" if prerelease else "false",
"target_commitish": "main",
}
if existing:
release_id = existing.get("id")
print(f"Updating Gitee release: {tag}, id={release_id}")
request("PATCH", f"{base}/releases/{release_id}", payload)
else:
print(f"Creating Gitee release: {tag}")
request("POST", f"{base}/releases", payload)
print("Gitee release sync done.")
PY