Skip to content

利用GitHub Actions实现将GitHub代码同步到Gitee

国内访问 GitHub 有时候会不太稳定,这就可能导致你在安装 GitHub 上的一些软件(或者拉取代码)的时候,由于网络问题而失败。这时候你就想:

  1. 把代码同步一份到 gitee,从 gitee 进行拉取下载;
  2. 把代码同步一份到 coding,使用 coding 的网站托管/自动构建功能,实时部署你的站点应用。

虽然,gitee 和 coding 都提供了从 GitHub 导入项目和强制更新的选项(coding 还提供了可以通过触发时间来自动同步),但都比较繁琐,在这里介绍一种通过 GitHub Actions 的方法是一步实现 GitHub 代码实时同步 gitee 和 coding。

利用 Github Action 实现将 Github 上面的代码同步到 Gitee 中, 有如下两种方式:

有两种方式

  1. 使用秘钥的方式
  2. 使用账号密码的方式

第一种方式-使用秘钥

首先说明一下,这种方式有点繁琐,而且只能把 GitHub 的代码同步到 gitee 码云上,暂时无法同步到 coding 上(至少在本人的测试中,coding 是没办法的)。

基于秘钥的方式同步,主要参考 Gitee Pages Action 项目的做法,具体步骤如下:

  1. 生成SSH公私钥
  2. 添加公钥
  3. 添加私钥
  4. 配置代码

生成ssh公私钥

注意:Github 上的 SSH Keys 公钥和 Gitee 的个人设置页面配置的 SSH Keys 公钥内容必须是完全一致的!

密钥的配置步骤如下: 首先,在命令行终端或 Git Bash 使用命令ssh-keygen -t rsa -C "youremail@example.com" -f "gitee_id_rsa" 生成 SSH Key,注意替换为自己的邮箱。生成的 gitee_id_rsa gitee_id_rsa.pub 是公钥。(注意此处不要设置密码,生成的公私钥用于下面 GitHub / Gitee 的配置,以保证公私钥成对,否则从 GitHub -> Gitee 的同步将会失败。)

添加公钥

将 SSH 生成的公钥分别添加到 GithubGitee 中, 配置SSH公钥(即:gitee_id_rsa.pub),命名随意;

添加私钥

如果你还没有生成与 Github 相对应的 Gitee 仓库,记得先创建,推荐使用 url 导入的方式创建;

在需要同步的 Github 仓库里面依次进入 Settings > Secrets > Actions;

点击 New repository secret 按钮; name 这里使用 GITEE_RSA_PRIVATE_KEY; Value 填之前生成的私钥;

配置代码

在需要同步的 Github 仓库根目录下创建 .github/workflows 文件夹,并在该目录下创建后缀为 yml 的文件, 这里命名为 sync-gitee.yml; 该文件里面填入以下内容:

yml
name: sync_to_gitee
# 触发条件:在push时
on:
    push:
        branches: [master]
    workflow_dispatch:
# 任务
jobs:
    # This workflow contains a single job called "build"
    build:
        # 在哪个操作系统下 - 服务器环境:最新版ubuntu
        runs-on: ubuntu-latest
        steps:
            # 同步到gitee仓库
            - name: Sync to Gitee
                uses: wearerequired/git-mirror-action@master
                env:
                # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY
                SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
                with:
                # 注意替换为你的 GitHub 源仓库地址 - SSH URL of the source repo
                source-repo: git@github.com:github-username/github-repositoryname.git
                # 注意替换为你的 Gitee 目标仓库地址 - SSH URL of the destination repo
                destination-repo: git@gitee.com:gitee-username/gitee-repositoryname.git

第二种方式-使用账号密码

这个方法参考的是 @abersheeran 的 push-to-mirror 方法,可以同步到 gitee 以及任何一个支持 git 的平台,其原理很简单,就拉取然后推送。

配置账号密码

首先,在 GitHub 项目的「Settings -> Secrets → New repository secret」路径下配置好你需要同步的 coding 和 gitee 账号密码(命名可以随便,只要求跟下面 sync-gitee.yml 的变量名称一致即可)。其中:

  • GITEE_USERNAME 存放 Gitee 的账号;
  • GITEE_PASSWORD 存放 Gitee 帐号的密码;
  • CODING_USERNAME 存放 Coding 的账号;
  • CODING_PASSWORD 存放 Coding 帐号的密码;

创建 workflow

在你的 GitHub 项目 .github/workflows/ 文件夹下创建一个 .yml 文件,如 sync-gitee.yml,内容如下:

yml
name: Sync-To-Gitee-and-Coding

on:
  push:
    branches:
      - main

jobs:
  push-to-mirror:
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        run: |
          git init
          git remote add origin https://github.com/${GITHUB_REPOSITORY}.git
          git fetch --all
          for branch in `git branch -a | grep remotes | grep -v HEAD`; do
            git branch --track ${branch##*/} $branch
          done
        env:
          GITHUB_REPOSITORY: shenweiyan/GitHub-SYNC

      - name: Push to Coding
        run: |
          remote_repo="https://${CODING_USERNAME}:${CODING_PASSWORD}@e.coding.net/${CODING_REPOSITORY}.git"

          git remote add coding "${remote_repo}"
          git show-ref # useful for debugging
          git branch --verbose

          # publish all
          git push --all --force coding
          git push --tags --force coding
        env:
          CODING_REPOSITORY: shenweiyan/devs/GitHub-SYNC
          CODING_USERNAME: ${{ secrets.CODING_USERNAME }}
          CODING_PASSWORD: ${{ secrets.CODING_PASSWORD }}

      - name: Push to Gitee
        run: |
          remote_repo="https://${GITEE_USERNAME}:${GITEE_PASSWORD}@gitee.com/${GITEE_REPOSITORY}.git"

          git remote add gitee "${remote_repo}"
          git show-ref # useful for debugging
          git branch --verbose

          # publish all
          git push --all --force gitee
          git push --tags --force gitee
        env:
          GITEE_REPOSITORY: shenweiyan/GitHub-SYNC
          GITEE_USERNAME: ${{ secrets.GITEE_USERNAME }}
          GITEE_PASSWORD: ${{ secrets.GITEE_PASSWORD }}

最后更新:

创作不易请尊重他人劳动成果,未经授权禁止转载!
Released under the MIT License.