去中心化用 GitHub Actions 把 Hexo 博客源码备份到 Gitee 和 CODING

本文最后更新于:2022年4月8日 凌晨

这是去中心化博客备份专题的第 3 篇。上一篇在这里。

互联网时代的“狡兔三窟”,叫作“去中心化”。

GitHub 封禁伊朗和俄罗斯开发者的私有账户,不能说明大厂不靠谱或者开源不靠谱,相反,说明了中心化不靠谱。即使 GitHub 那样的大厂,也会因为合规要求而封禁账号。如果开发者仅仅依赖 GitHub 托管源码,那还是落入了中心化的窠臼。

谷月姐不但给 博客 建立了好几个镜像,而且源码放在好几个不同的云盘和源码托管平台。就是要去中心化,免得一旦中美开战, GitHub 封禁中国开发者的账户,导致我的博客全军覆没。

我的 博客 源码在本地有一份,在 GitHub 有一份。接下来,谷月姐要把它备份到不同的云端。如果本地或 GitHub 出错,可以及时恢复。如果我的 GitHub 被封禁,还可以转移到其他的源码托管网站,或者从本地发布我的博客。

上一期,谷月姐介绍了把 Hexo 博客源码用 Git 从本地备份到 GiteeCODING

本期,谷月姐要把源码GitHub ActionsGitHub 备份到 GiteeCODING

注意

  1. 其他基于 Git 的代码托管平台也适用本教程。
  2. 它同步不了子模块。

1 建立仓库

GitHub 上已经有私有仓库了。

Gitee 上建立一个私有仓库,HTTP 协议的 URL 是:https://gitee.com/kukmoon/kukmoon_blog.git 。注意:默认分支与 GitHub 上的博客源码仓库的默认分支一致,此处都是 master

CODING 上建立一个私有仓库,HTTP 协议的 URL 是:https://e.coding.net/kukmoon/blog/source_code.git 。注意:默认分支与 GitHub 上的博客源码仓库的默认分支一致,此处都是 master

2 准备令牌

Gitee 首页点击右上角头像→设置→左侧导航栏中的安全设置→私人令牌→右上角生成新令牌。权限可以全选。将令牌记录下来。

CODING 个人首页点击左侧导航栏中的项目→“谷月姐的博客”(谷月姐把博客源码仓库放到了这个项目里)→左下角项目设置→左侧导航栏中的开发者选项→项目令牌→新建项目令牌,令牌名称随意填,指定一个过期时间,将代码仓库权限设为统一配置所有代码仓库权限,并勾选“读写”(系统默认勾选了“读取”),点击“新建”。系统生成一个项目令牌。

注意:Gitee 生成的令牌只有令牌;CODING 生成的令牌包括一个用户名和一个密码。

3 设置仓库秘密(repo secrets)

要把上一步生成的令牌保存到 GitHub 的博客源码仓库 kukmoon_blog 中,用于向 GiteeCODING 推送源码。

令牌不能明文保存,所以要以仓库秘密(repo secrets)的形式保存。

进入 GitHub,打开博客源码仓库 kukmoon_blog,点击仓库上方导航栏的 Settings,点击左侧导航栏 Security 下方的 Secrets → Actions,点击右上方的 New repository secret,添加四个 secrets:

  1. GITEE_USER:在 Gitee 注册的用户名。就是你的 Gitee 个人主页大头像下方以 @ 开头的一串英文。
    Gitee 用户名
  2. GITEE_TOKEN:按照第 2 步在 Gitee 创建的令牌。
    Gitee 令牌
  3. CODING_USER:按照第 2 步在 CODING 创建的项目令牌中的用户名。
    CODING_USER
  4. CODING_TOKEN:按照第 2 步在 CODING 创建的项目令牌中的密码。
    CODING_TOKEN

4 写 GitHub Actions

新建 kukmoon_blog/.github/workflow/deploy.yml,内容如下[1]

(如果已经存在此文件,那就把第 11 到 55 行的内容作为一个单独的 job,添加到已存在的 deploy.yml

name: CI

# 只监听 master 分支的改动
on:
  push:
    branches:
      - master

# 每个 jobs 分别同时在独立的虚拟机中运行
jobs:  
  backup_source_code_to_gitee_&_coding:
    name: Backup source code to Gitee & CODING
    runs-on: ubuntu-latest
    steps:
      # 克隆
      - name: Clone
        env:
          GITHUB_SOURCE_REPO: Kukmoon/kukmoon_blog
          GIT_USER: Kukmoon
          GIT_EMAIL: kukmoon97@gmail.com
        run: |
          git init
          git remote add origin https://github.com/${GITHUB_SOURCE_REPO}.git
          git fetch --all
          for branch in `git branch -a | grep remotes | grep -v HEAD`; do
            git branch --track ${branch##*/} $branch
          done
          git config --global user.name $GIT_USER
          git config --global user.email $GIT_EMAIL          
          
      # 推送到码云      
      - name: Push to Gitee
        env:
          GITEE_USER: ${{ secrets.GITEE_USER }}
          GITEE_TOKEN: ${{ secrets.GITEE_TOKEN }}          
        run: |
          gitee_repo="https://${GITEE_USER}:${GITEE_TOKEN}@gitee.com/kukmoon/kukmoon_blog.git"
          git remote add gitee1 "${gitee_repo}"
          git show-ref
          git branch --verbose
          git push --all --force gitee1          
          git push --tags --force gitee1          
          
      # 推送到 CODING
      - name: Push to CODING
        env:
          CODING_USER: ${{ secrets.CODING_USER }}
          CODING_TOKEN: ${{ secrets.CODING_TOKEN }}
        run: |
          coding_repo="https://${CODING_USER}:${CODING_TOKEN}@e.coding.net/kukmoon/blog/source_code.git"
          git remote add coding1 "${coding_repo}"
          git show-ref
          git branch --verbose
          git push --all --force coding1          
          git push --tags --force coding1

5 参考文献