The Gitee mirror force-pushes main verbatim, so Chinese users saw a README whose top install commands point at raw.githubusercontent.com (hard to reach in China) and a coverage badge that fails to render (the relative .github/badges/coverage.svg can't be served by Gitee — gitee raw returns a signed, expiring URL with content-type text/plain). Add a Gitee-only post-process step: build a gitee-main branch on top of origin/main and rewrite README.md / README_zh.md before pushing — (1) raw.githubusercontent.com/<repo>/main -> gitee.com/<repo>/raw/main (2) the coverage badge -> a shields.io static badge whose percentage is read from the repo's coverage.svg and colored by threshold. GitHub's README is untouched; only the Gitee copy is rewritten. The branch is rebuilt from origin/main every run, so it stays a clean single-commit delta and never drifts.
76 lines
3.4 KiB
YAML
76 lines
3.4 KiB
YAML
# 把本仓库代码自动镜像到 Gitee,供国内用户访问(raw 脚本入口 + tags)。
|
||
# 用 HTTPS + 令牌直接 git push(无需 SSH key),复用已配置的 secret:
|
||
# GITEE_TOKEN —— Gitee 私人令牌(勾 projects)
|
||
# GITEE_USER —— 令牌所属 Gitee 用户名(用于 https 推送鉴权)
|
||
# GITEE_REPO —— "owner/repo",如 DingTalk-Real-AI/dingtalk-workspace-cli
|
||
# 未配置 GITEE_TOKEN 时(如 fork)自动跳过,不报红叉。
|
||
name: Mirror code to Gitee
|
||
|
||
on:
|
||
push:
|
||
branches:
|
||
- main
|
||
tags:
|
||
- 'v*'
|
||
schedule:
|
||
- cron: '0 18 * * *'
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
mirror:
|
||
runs-on: ubuntu-latest
|
||
# GitHub Actions 不允许在 job-level if 直接引用 secrets,故先用 env 暴露再在 step 守卫。
|
||
env:
|
||
GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}
|
||
GITEE_USER: ${{ secrets.GITEE_USER }}
|
||
GITEE_REPO: ${{ secrets.GITEE_REPO }}
|
||
steps:
|
||
- name: Checkout (full history + tags)
|
||
if: env.GITEE_TOKEN != ''
|
||
uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 0
|
||
|
||
- name: Push main + tags to Gitee (with README localization)
|
||
if: env.GITEE_TOKEN != ''
|
||
run: |
|
||
set -eu
|
||
REMOTE="https://${GITEE_USER}:${GITEE_TOKEN}@gitee.com/${GITEE_REPO}.git"
|
||
# 取到 main 与所有 tag(落到 origin/* 与本地 tags,避免推当前分支引用冲突)
|
||
git fetch --force --tags origin 'refs/heads/main:refs/remotes/origin/main'
|
||
|
||
# Gitee 专属分支:在 origin/main 之上叠加一个 README 本地化 commit。
|
||
# GitHub 那份 README 不变;只有推往 Gitee 的副本被改写。
|
||
git checkout -B gitee-main origin/main
|
||
git config user.email "actions@github.com"
|
||
git config user.name "github-actions[bot]"
|
||
|
||
# 1) 安装命令本地化:raw.githubusercontent → gitee raw(国内可达)。
|
||
for f in README.md README_zh.md; do
|
||
[ -f "$f" ] || continue
|
||
sed -i "s#raw.githubusercontent.com/${GITEE_REPO}/main#gitee.com/${GITEE_REPO}/raw/main#g" "$f"
|
||
done
|
||
|
||
# 2) coverage 徽章:仓库内相对路径 svg 在 Gitee 渲染不出来(gitee raw 对 svg
|
||
# 返回需签名、会过期的 URL,且 content-type 为 text/plain)。改成 shields.io
|
||
# 静态徽章——数值取自仓库 coverage.svg,颜色按覆盖率阈值。
|
||
SVG=".github/badges/coverage.svg"
|
||
if [ -f "$SVG" ]; then
|
||
PCT="$(grep -oE '[0-9]+(\.[0-9]+)?%' "$SVG" | head -1)"
|
||
NUM="${PCT%\%}"; INT="${NUM%.*}"
|
||
if [ "${INT:-0}" -ge 80 ]; then C=brightgreen; elif [ "${INT:-0}" -ge 60 ]; then C=yellow; else C=red; fi
|
||
BADGE="https://img.shields.io/badge/coverage-${NUM}%25-${C}"
|
||
for f in README.md README_zh.md; do
|
||
[ -f "$f" ] || continue
|
||
sed -i "s#\.github/badges/coverage\.svg#${BADGE}#g" "$f"
|
||
done
|
||
fi
|
||
|
||
git add README.md README_zh.md 2>/dev/null || true
|
||
git commit -m "docs(gitee): localize install commands + coverage badge for Gitee mirror" || true
|
||
|
||
# 镜像对齐(force:Gitee 始终跟随 GitHub + Gitee 专属 README 本地化)
|
||
git push --force "$REMOTE" 'gitee-main:refs/heads/main'
|
||
git push --force --tags "$REMOTE"
|
||
echo "✅ 已镜像 main(+Gitee README 本地化) + tags 到 Gitee ${GITEE_REPO}"
|