Github Actions:通过 SSH 自动备份代码到托管网站


需求

每次像把源码放在不同平台都要进行如下操作:

  • 准备一台物理机,创建密钥并配置对应网站的公钥
  • 多平台需要多次 clone、pull、push
  • 换物理机还要重新配置密钥,是所有网站的密钥
  • 不用物理机用 docker 也要安装 docker 环境

通过 Github Actions 持续集成可实现:

  • 一次 clone、pull、push,多平台同布
  • 配置对应网站的公钥只需配置一次
  • 换设备只需配置 Github 和本机的密钥

说明

前一阵玩docker的时候用docker搭建了Hexo环境,感觉像Hexo的环境搭建使用docker好笨重

本次使用的是 Github Actions,就是因为其简单、无需 VPS、公有仓库免费、私有仓库每个月 2000 分钟、还能体验这个新功能。本文主要来使得 github 仓库的内容备份到其他代码托管平台,可以是 github page、gitlab、coding、gitee、vps 等等,这里以 coding、gitee 举例。

环境准备

  • Github 仓库:blog

这里是存放源码的

  • Coding 仓库:blog

这里是用来存放备份的源码,要求仓库,没有初始化及任何操作的

  • Gitee 仓库: blog

这里是用来存放备份的源码,要求仓库,没有初始化及任何操作的

密钥准备

为了方便运行 GitHub Actions 时登录 GitHub 账号,我们使用 SSH 方式登录。就是要把设备的私钥交给 GitHub Actions,公钥交给 GitHub,需要去 Settings 里去配置。

使用 ssh-keygen 生成一组公私秘钥对

ssh-keygen -t rsa -C "Github 的邮箱地址"

如 ssh-keygen -t rsa -C "123123123@gmail.com"

生成的密钥一定要保存好了,最重要的是私钥

  • 配置公钥,应该已经配好,不然如何上到的项目资源,配置路径:github 网站–>Settings–>SSH and GPG keys
  • 配置仓库私钥,blog 私有仓库的 Settings –> Secrets 里添加私钥Secrets,以下面名称命名,输入对应的值,这个值就是私钥
  • token_Private_Keys

配置 GitHub Actions

GitHub Actions 有一些自己的术语。

  • workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。
  • job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。
  • step(步骤):每个 job 由多个 step 构成,一步步完成。
  • action (动作):每个 step 可以依次执行一个或多个命令(action)。

在 blog 仓库的 Actions 选项卡下点击新建 workflow,名称默认或者自定义修改,编写如下配置。

这里分为两次,区别只有分支操作的区别,这也是为什么前面说要创建空仓库!!

  • git checkout master:切换分支
  • git checkout -b master:创建并切换分支

第一次运行

我的GithubCodinggit信息一样,如果你不一样,请分开写

# workflow name
name: CI Backup First

# master branch on push, auto run
on:
  push:
    branches:
      - master

jobs:
  Backup:
    name: Backup To Private Project
    runs-on: ubuntu-latest

    steps:
      # check it to your workflow can access it
      # from: https://github.com/actions/checkout
      - name: Checkout Repository master branch
        uses: actions/checkout@master

      - name: Setup Git Infomation
        run: |
          git config --global user.name '用户名' 
          git config --global user.email '邮箱'

      - name: Setup SSH Private Key
        env:
          token_Private_Keys: ${{ secrets.token_Private_Keys }}
        run: |
          mkdir -p ~/.ssh/
          echo "$token_Private_Keys" > ~/.ssh/id_rsa 
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan gitee.com >> ~/.ssh/known_hosts
          ssh-keyscan e.coding.net >> ~/.ssh/known_hosts

      - name: Get Latest Commit Message
        run: |
          git log --pretty=format:"%s from Github Actions at `date +"%Y-%m-%d %H:%M:%S"`" --date=short -n 1  > commit-message.log

      - name: Backup To Gitee Private Project
        env:
          Gitee_Blog: gitee.com:用户名/blog.git
        run: |
          git clone git@${Gitee_Blog} .gitee_blog
          cd .gitee_blog
          git checkout -b master
          cd ../
          \cp -rf ./* ./.gitee_blog/
          cd .gitee_blog
          git add .
          git commit -F ../commit-message.log
          git push --force --quiet "git@${Gitee_Blog}" master:master

      - name: Backup To Coding Private Project
        env:
          Coding_Blog: e.coding.net:用户名/blog.git
        run: |
          git clone git@${Coding_Blog} .coding_blog
          cd .coding_blog
          git checkout -b master
          cd ../
          \cp -rf ./* ./.coding_blog/
          cd .coding_blog
          git add .
          git commit -F ../commit-message.log
          git push --force --quiet "git@${Coding_Blog}" master:master

老版本的 coding 与新版本的区别:

  • 老:ssh-keyscan git.coding.net >> ~/.ssh/known_hosts
  • 新:ssh-keyscan e.coding.net >> ~/.ssh/known_hosts

第二次及以后运行

# workflow name
name: CI Backup LTS

# master branch on push, auto run
on:
  push:
    branches:
      - master

jobs:
  Backup:
    name: Backup To Private Project
    runs-on: ubuntu-latest

    steps:
      # check it to your workflow can access it
      # from: https://github.com/actions/checkout
      - name: Checkout Repository master branch
        uses: actions/checkout@master

      - name: Setup Git Infomation
        run: |
          git config --global user.name '用户名' 
          git config --global user.email '邮箱'

      - name: Setup SSH Private Key
        env:
          token_Private_Keys: ${{ secrets.token_Private_Keys }}
        run: |
          mkdir -p ~/.ssh/
          echo "$token_Private_Keys" > ~/.ssh/id_rsa 
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan gitee.com >> ~/.ssh/known_hosts
          ssh-keyscan e.coding.net >> ~/.ssh/known_hosts

      - name: Get Latest Commit Message
        run: |
          git log --pretty=format:"%s from Github Actions at `date +"%Y-%m-%d %H:%M:%S"`" --date=short -n 1  > commit-message.log

      - name: Backup To Gitee Private Project
        env:
          Gitee_Blog: gitee.com:用户名/blog.git
        run: |
          git clone git@${Gitee_Blog} .gitee_blog
          cd .gitee_blog
          git checkout master
          cd ../
          \cp -rf ./* ./.gitee_blog/
          cd .gitee_blog
          git add .
          git commit -F ../commit-message.log
          git push --force --quiet "git@${Gitee_Blog}" master:master

      - name: Backup To Coding Private Project
        env:
          Coding_Blog: e.coding.net:用户名/blog.git
        run: |
          git clone git@${Coding_Blog} .coding_blog
          cd .coding_blog
          git checkout master
          cd ../
          \cp -rf ./* ./.coding_blog/
          cd .coding_blog
          git add .
          git commit -F ../commit-message.log
          git push --force --quiet "git@${Coding_Blog}" master:master

文章作者:   hongwei
版权声明:   本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hongwei !
评论
  目录