Gitee自动同步GitHub仓库

3,642 阅读1分钟

Gitee自动同步GitHub仓库

为什么要同步

github是国际通用的代码托管平台,但是在国内的访问速度堪忧~如使用 GitHub pages,将个人博客项目主页托管在github上的话,体验不会很好。

image-20210127175601588

在国内的代码托管平台主要是giteecoding,故他们的pages服务成了首选

同步方案

同步上传

通过remote 设定不同的别名,上传两遍,在\.git\config中同时设置GitHub Gitee 的地址

GitHub的Actions

借助wearerequired/git-mirror-action这个项目,通过GitHubActions 实现任意仓库自动同步

image-20210127180951168

怎么做呢?

1、在仓库根目录下创建.github/workflows/sync.yml文件

name: Sync To Gitee
on: page_build
jobs:
  sync:
    runs-on: ubuntu-latest
    steps:
      - uses: wearerequired/git-mirror-action@master
        env:
          SSH_PRIVATE_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
        with:
          source-repo: "git@github.com:qianzai/mydocs.git"
          destination-repo: "git@gitee.com:BuZM/mydocs.git"
  • 记得修改 source-repodestination-repo为对应的两个仓库
  • 因为有page的关系,所以触发条件改为了page_build,如果只是普通的同步的话,可以把on换成对应的触发条件

2、添加钥匙

使用 ssh-keygen 命令生成一对公钥私钥

image-20210127182551412

在Gitee添加公钥

image-20210127182636736

在GitHub添加私钥,添加GITEE_PRIVATE_KEY,内容为之前的私匙

image-20210127182918666

这样子,每次部署之后,github 会自动推送到 gitee

pages 同步

giteepages服务不能自动更新,每次还要去手动更新,除非花钱购买开启gitee pages pro服务

模拟登录调用

其实抓取以下接口就能发现 直接通过POST: https://gitee.com/${repository}/pages/rebuild 这个接口进行的,那么我们只要模拟登录就可以了

axios.post(
  url + "/rebuild",
  qs.stringify({
    branch: core.getInput("branch"),
    build_directory: core.getInput("directory"),
    force_https: core.getInput("https")
  }),
  {
    headers: {
      "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
      Cookie: cookie,
      Referer: url,
      "X-Requested-With": "XMLHttpRequest",
      "X-CSRF-Token": csrfToken
    }
  }
);

主要是headers里的 Content-Type, X-CSRF-Token, Cookie特别重要,页面的参数对应这页面的几个按钮

其中,Cookie 可以devtools中直接拿到,X-CSRF-TOKEN经过调查,被写在了<meta content="" name="csrf-token"></meta>上,通过获取任意一个页面然后拿到即可

这个大佬已经将其封装好了,我们直接使用即可

gitee-pages-actiongithub.com/mizuka-wu/g…

只要在之前actionssteps上追加一个step即可

 - name: reload
        uses: mizuka-wu/gitee-pages-action@v1.0.0
        with:
            repository: BuZM/mydocs
            cookie: ${{ secrets.GITEE_COOKIE }} 
            directory: docs
            https: true

参考

添加 cookie

和之前添加私钥一样,在setting中点击secrets,新建GITEE_COOKIE,将上面获取到的cookie值存入其中即可

上传同步

Actions运行成功

image-20210127185015652