Skip to content

Commit 37b19c3

Browse files
committed
添加上游自动同步配置(安全阈值10%)
1 parent 0320f12 commit 37b19c3

1 file changed

Lines changed: 127 additions & 0 deletions

File tree

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
name: Sync Upstream Safely
2+
3+
on:
4+
schedule:
5+
# 每天凌晨 2 点(UTC)运行
6+
- cron: '0 2 * * *'
7+
workflow_dispatch: # 允许手动触发
8+
9+
jobs:
10+
sync:
11+
runs-on: ubuntu-latest
12+
env:
13+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
14+
steps:
15+
- name: Checkout code
16+
uses: actions/checkout@v4
17+
with:
18+
fetch-depth: 0
19+
token: ${{ secrets.GITHUB_TOKEN }}
20+
21+
- name: Configure Git
22+
run: |
23+
git config --global user.name "github-actions[bot]"
24+
git config --global user.email "github-actions[bot]@users.noreply.github.com"
25+
26+
- name: Add upstream remote
27+
id: upstream
28+
run: |
29+
# 添加上游仓库(请替换为实际的上游仓库地址)
30+
UPSTREAM_REPO="${{ secrets.UPSTREAM_REPO }}"
31+
if [ -z "$UPSTREAM_REPO" ]; then
32+
echo "❌ 未设置 UPSTREAM_REPO secret,请先在仓库设置中添加"
33+
echo "格式: https://github.com/原作者/原仓库名.git"
34+
exit 1
35+
fi
36+
37+
git remote add upstream "$UPSTREAM_REPO"
38+
echo "✅ 已添加上游仓库: $UPSTREAM_REPO"
39+
git fetch upstream
40+
41+
- name: Check upstream changes
42+
id: check
43+
run: |
44+
# 获取当前分支的文件列表
45+
CURRENT_FILES=$(git ls-tree -r HEAD --name-only | wc -l)
46+
47+
# 获取上游分支的文件列表
48+
UPSTREAM_FILES=$(git ls-tree -r upstream/main --name-only | wc -l)
49+
50+
# 检测删除的文件数量
51+
DELETED_FILES=$(git diff --name-only HEAD upstream/main | grep "^-" | wc -l || echo 0)
52+
53+
# 计算删除比例
54+
if [ $CURRENT_FILES -gt 0 ]; then
55+
DELETE_RATIO=$((DELETED_FILES * 100 / CURRENT_FILES))
56+
else
57+
DELETE_RATIO=100
58+
fi
59+
60+
echo "current_files=$CURRENT_FILES" >> $GITHUB_OUTPUT
61+
echo "upstream_files=$UPSTREAM_FILES" >> $GITHUB_OUTPUT
62+
echo "deleted_files=$DELETED_FILES" >> $GITHUB_OUTPUT
63+
echo "delete_ratio=$DELETE_RATIO" >> $GITHUB_OUTPUT
64+
65+
echo "📊 变更统计:"
66+
echo " - 当前文件数: $CURRENT_FILES"
67+
echo " - 上游文件数: $UPSTREAM_FILES"
68+
echo " - 删除文件数: $DELETED_FILES"
69+
echo " - 删除比例: $DELETE_RATIO%"
70+
71+
# 显示变更详情
72+
echo ""
73+
echo "📝 变更文件列表:"
74+
git diff --stat HEAD upstream/main || echo " (无变更)"
75+
76+
- name: Stop and notify if deletion > 10%
77+
if: steps.check.outputs.delete_ratio > 10
78+
run: |
79+
RATIO=${{ steps.check.outputs.delete_ratio }}
80+
DELETED=${{ steps.check.outputs.deleted_files }}
81+
82+
echo ""
83+
echo "⚠️ 检测到上游删除了 $DELETED 个文件(删除比例 $RATIO%)"
84+
echo "⚠️ 超过 10% 阈值,为保护数据,已停止自动同步"
85+
echo ""
86+
echo "🔍 请手动审查上游变更:"
87+
echo " 1. 访问上游仓库查看变更详情"
88+
echo " 2. 如果确认安全,手动执行同步或重新运行此 workflow"
89+
echo " 3. 修改此 workflow 中的阈值(当前 10%)以调整敏感度"
90+
echo ""
91+
echo "🛡️ 你的数据已受到保护,不会自动同步此变更"
92+
exit 1
93+
94+
- name: Backup before sync
95+
run: |
96+
# 创建备份标签
97+
BACKUP_TAG="backup-$(date +%Y%m%d-%H%M%S)"
98+
git tag "$BACKUP_TAG"
99+
git push origin "$BACKUP_TAG"
100+
echo "✅ 已创建备份标签: $BACKUP_TAG"
101+
102+
- name: Sync with upstream
103+
if: steps.check.outputs.delete_ratio <= 10
104+
run: |
105+
# 检测主分支名称
106+
MAIN_BRANCH=$(git rev-parse --abbrev-ref HEAD)
107+
108+
echo "🔄 正在同步上游更新..."
109+
git merge upstream/main --no-edit
110+
111+
echo "📤 正在推送到 origin..."
112+
git push origin "$MAIN_BRANCH"
113+
114+
echo "✅ 同步完成!"
115+
116+
- name: Notify on success
117+
if: success()
118+
run: |
119+
RATIO=${{ steps.check.outputs.delete_ratio }}
120+
echo "✅ 上游同步成功"
121+
echo " 删除比例: $RATIO%(安全阈值: 10%)"
122+
123+
- name: Notify on failure
124+
if: failure()
125+
run: |
126+
echo "❌ 同步失败或被阻止"
127+
echo " 请检查上方日志了解详情"

0 commit comments

Comments
 (0)