Sync from Gitee to GitHub #1125
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 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 |