f40bda99a8
Gitee 在推送密集时返回 429 Pending queue overflowed / 408 Authorization server timeout,属服务端限流,原实现一次失败即终止。 - 推送改为最多 5 次退避重试(30s/60s/90s/120s) - 增加每日定时兜底(18:30 UTC = 次日 02:30 北京时间), 避免某次推送失败后长期不同步
65 lines
2.1 KiB
YAML
65 lines
2.1 KiB
YAML
name: mirror-to-gitee
|
||
|
||
# 把本仓同步到 Gitee 企业仓 snowgoat/<同名仓库>。
|
||
# 触发:main 分支推送、v* tag 推送、手动;另有每日兜底重试。
|
||
on:
|
||
push:
|
||
branches:
|
||
- main
|
||
tags:
|
||
- 'v*'
|
||
schedule:
|
||
# Gitea Actions 的 cron 用 UTC:18:30 UTC = 次日 02:30 北京时间
|
||
- cron: '30 18 * * *'
|
||
workflow_dispatch:
|
||
|
||
concurrency:
|
||
group: mirror-${{ github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
mirror:
|
||
runs-on: host
|
||
steps:
|
||
- name: 同步到 Gitee
|
||
env:
|
||
SRC_TOKEN: ${{ secrets.SRC_GIT_TOKEN }}
|
||
DST_TOKEN: ${{ secrets.GITEE_TOKEN }}
|
||
DST_OWNER: ${{ secrets.GITEE_OWNER }}
|
||
DST_USER: ${{ secrets.GITEE_USER }}
|
||
REPO_NAME: ${{ github.event.repository.name }}
|
||
run: |
|
||
set -u
|
||
|
||
if [ -z "${REPO_NAME:-}" ]; then
|
||
echo "未取到仓库名,退出"; exit 1
|
||
fi
|
||
|
||
WORK=$(mktemp -d)
|
||
trap 'rm -rf "$WORK"' EXIT
|
||
|
||
echo "源:git.5iot.com/iotlcm-public/$REPO_NAME"
|
||
echo "目标:gitee.com/$DST_OWNER/$REPO_NAME"
|
||
|
||
git clone --mirror "https://jenkins:${SRC_TOKEN}@git.5iot.com/iotlcm-public/${REPO_NAME}.git" "$WORK/repo.git"
|
||
cd "$WORK/repo.git"
|
||
echo "本地 ref:$(git for-each-ref --format='%(refname:short)' | tr '\n' ' ')"
|
||
|
||
# Gitee 在推送密集时会返回 429 Pending queue overflowed / 408 Authorization server timeout,
|
||
# 属服务端限流,退避重试即可。
|
||
attempt=0
|
||
while [ "$attempt" -lt 5 ]; do
|
||
attempt=$((attempt + 1))
|
||
echo "----- 推送尝试 $attempt/5"
|
||
if git push --mirror "https://${DST_USER}:${DST_TOKEN}@gitee.com/${DST_OWNER}/${REPO_NAME}.git" 2>&1; then
|
||
echo "✅ 已同步到 Gitee"
|
||
exit 0
|
||
fi
|
||
wait_s=$((attempt * 30))
|
||
echo "推送失败,${wait_s}s 后重试"
|
||
sleep "$wait_s"
|
||
done
|
||
|
||
echo "❌ 连续 5 次推送失败,请检查 Gitee 状态或令牌"
|
||
exit 1
|