v0.6.0 - 文档站体验、UI 视觉与维护系统增强版 #3
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |