Skip to content

Sync from Gitee to GitHub #1274

Sync from Gitee to GitHub

Sync from Gitee to GitHub #1274

Workflow file for this run

name: Sync from Gitee to GitHub
on:
workflow_dispatch: # 支持手动触发
schedule:
# 每月2000分钟免费额度,可以根据执行时长调整频率。
# 在东八区的 14:00, 22:00, 23:00, 24:00 运行
# 对应 UTC 的 06:00, 14:00, 15:00, 16:00
- cron: '0 6,14,15,16 * * *'
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Get repository count
id: set-matrix
run: |
# 获取仓库数量
REPO_COUNT=$(yq e '.repositories | length' sync-config.yml)
# 创建数组
INDICES="["
for ((i=0; i<$REPO_COUNT; i++)); do
if [ $i -eq 0 ]; then
INDICES="${INDICES}$i"
else
INDICES="${INDICES},$i"
fi
done
INDICES="${INDICES}]"
# 构建最终的 JSON
echo "matrix={\"repository\":$INDICES}" >> $GITHUB_OUTPUT
sync:
needs: prepare
strategy:
matrix: ${{fromJson(needs.prepare.outputs.matrix)}}
fail-fast: false # 某个仓库同步失败不影响其他仓库
runs-on: ubuntu-latest
steps:
- name: Sync from Gitee
uses: actions/checkout@v3
with:
persist-credentials: false
fetch-depth: 0
- name: Load Configuration
id: config
run: |
# 读取配置文件中指定索引的仓库配置
echo "正在读取配置文件..."
REPO_INDEX=${{ matrix.repository }}
GITEE_REPO_URL=$(yq e ".repositories[$REPO_INDEX].gitee.repo_url" sync-config.yml)
GITEE_BRANCH=$(yq e ".repositories[$REPO_INDEX].gitee.branch" sync-config.yml)
GITHUB_REPO_NAME=$(yq e ".repositories[$REPO_INDEX].github.repo_name" sync-config.yml)
GITHUB_BRANCH=$(yq e ".repositories[$REPO_INDEX].github.branch // .repositories[$REPO_INDEX].gitee.branch" sync-config.yml)
GITHUB_PRIVATE=$(yq e ".repositories[$REPO_INDEX].github.private // false" sync-config.yml)
SYNC_NAME=$(yq e ".repositories[$REPO_INDEX].name" sync-config.yml)
# 设置输出变量
echo "gitee_repo_url=$GITEE_REPO_URL" >> $GITHUB_OUTPUT
echo "gitee_branch=$GITEE_BRANCH" >> $GITHUB_OUTPUT
echo "github_repo_name=$GITHUB_REPO_NAME" >> $GITHUB_OUTPUT
echo "github_branch=$GITHUB_BRANCH" >> $GITHUB_OUTPUT
echo "github_private=$GITHUB_PRIVATE" >> $GITHUB_OUTPUT
echo "sync_name=$SYNC_NAME" >> $GITHUB_OUTPUT
- name: Check and Create Repository
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GITHUB_REPO: ${{ steps.config.outputs.github_repo_name }}
GITHUB_USER: ${{ github.repository_owner }}
GITHUB_PRIVATE: ${{ steps.config.outputs.github_private }}
run: |
echo "🔍 正在检查 GitHub 仓库是否存在..."
REPO_EXISTS=$(curl -s -H "Authorization: token $GH_TOKEN" \
"https://api.github.com/repos/$GITHUB_USER/$GITHUB_REPO" | jq -r '.id // empty')
if [ -z "$REPO_EXISTS" ]; then
echo "📦 仓库不存在,开始创建新仓库..."
curl -X POST -H "Authorization: token $GH_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/user/repos \
-d "{\"name\":\"$GITHUB_REPO\", \"private\":$GITHUB_PRIVATE}"
echo "✨ 仓库创建成功!"
else
echo "✅ 仓库已存在,检查并更新可见性设置..."
# 更新已存在仓库的可见性
curl -X PATCH -H "Authorization: token $GH_TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
"https://api.github.com/repos/$GITHUB_USER/$GITHUB_REPO" \
-d "{\"private\":$GITHUB_PRIVATE}"
echo "✨ 仓库可见性已更新!"
fi
- name: Sync Repository
env:
GITEE_REPO_URL: ${{ steps.config.outputs.gitee_repo_url }}
GITEE_BRANCH: ${{ steps.config.outputs.gitee_branch }}
GITHUB_REPO: ${{ steps.config.outputs.github_repo_name }}
GITHUB_BRANCH: ${{ steps.config.outputs.github_branch }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
GITHUB_USER: ${{ github.repository_owner }}
GITEE_USERNAME: ${{ secrets.GITEE_USERNAME }}
GITEE_PASSWORD: ${{ secrets.GITEE_PASSWORD }}
run: |
echo "🔧 配置 Git 用户信息..."
git config --global user.name "GitHub Actions"
git config --global user.email "[email protected]"
echo "📥 正在克隆 Gitee 仓库的 ${GITEE_BRANCH} 分支..."
# 构建包含认证信息的 URL
GITEE_AUTH_URL=$(echo "$GITEE_REPO_URL" | sed "s|https://|https://$GITEE_USERNAME:$GITEE_PASSWORD@|")
if ! git clone -b "$GITEE_BRANCH" "$GITEE_AUTH_URL" temp; then
echo "❌ 克隆 Gitee 仓库失败"
exit 1
fi
echo "📋 检查仓库内容..."
if [ ! "$(ls -A temp)" ]; then
echo "❌ Gitee 仓库为空"
rm -rf temp
exit 1
fi
echo "🔍 获取提交信息..."
LAST_SYNC_COMMIT=$(git log --grep="Sync from Gitee" -1 --format="%B" | grep -oP "Gitee Commit: \K[a-f0-9]+") || true
cd temp
GITEE_LATEST_COMMIT=$(git rev-parse HEAD)
cd ..
echo "📊 上次同步的提交: ${LAST_SYNC_COMMIT:-无}"
echo "📊 Gitee 最新提交: ${GITEE_LATEST_COMMIT}"
# if [ ! -z "$LAST_SYNC_COMMIT" ] && [ "$LAST_SYNC_COMMIT" = "$GITEE_LATEST_COMMIT" ]; then
# echo "✨ 无需同步:Gitee 仓库无新更改"
# rm -rf temp
# exit 0
# fi
echo "🔄 检测到更改,开始同步..."
echo "📋 准备工作目录..."
WORK_DIR="sync_workspace"
rm -rf $WORK_DIR
mkdir -p $WORK_DIR
echo "📋 复制文件到工作目录..."
cd temp
shopt -s extglob
cp -r !(*.git|.github) "../$WORK_DIR/"
cd ..
rm -rf temp
echo "🔄 准备推送代码..."
cd $WORK_DIR
# 初始化 git
git init
echo "🔄 开始准备推送代码到 GitHub..."
git add .
echo "✅ 已添加所有文件到暂存区"
git commit -m "Sync from Gitee $(date '+%Y-%m-%d %H:%M:%S')
Gitee Commit: ${GITEE_LATEST_COMMIT}"
echo "✅ 已创建提交记录"
# 推送到 GitHub
echo "🔗 正在配置 GitHub 远程仓库地址..."
git remote add origin "https://[email protected]/$GITHUB_USER/$GITHUB_REPO.git"
echo "✅ 远程仓库配置完成"
echo "🌿 正在切换到 ${GITHUB_BRANCH} 分支..."
git branch -M ${GITHUB_BRANCH}
echo "✅ 分支切换完成"
echo "⬆️ 正在推送代码到 GitHub..."
git push -f origin ${GITHUB_BRANCH}
echo "🎉 代码推送完成!"
cd ..
rm -rf $WORK_DIR