CI 实战:使用 Github Action 跨仓库部署个人博客

使用两个仓库,一个为公开,另一个为私有

私有的仓库存放 Hexo 博客项目,方便对笔记进行版本控制,另一方面,之后如果换电脑也方便迁移撰写环境。而公开的仓库专门存放生成的静态文件

本地推送代码到私有仓库,之后触发 Github Actions,自动部署到公开仓库

1 准备仓库

准备两个仓库,一个用来存 Hexo 博客项目,另一个用来存输出的静态文件

  • my-blog
  • <your-name>.github.io

2 生成密钥对

ssh-keygen 是一个认证密钥的生成、管理和转换工具,生成的密钥对可用于远程服务器的连接

在本地执行以下命令:

1
ssh-keygen -f github-deploy-key

执行后,本地会生成两个文件:

  • github-deploy-key
  • github-deploy-key.pub

3 配置密钥

3.1 配置私钥

私钥配置在 my-blog 仓库中

首先,进入 New repository secret 添加页面:Settings => Secrets and variables => Actions,点击 New repository secret 添加私钥

image-20240720000649412

3.2 配置公钥

公钥配置在 <your-name>.github.io 仓库中

进入 Deploy keys 的添加页面:Settings => Deploy keys,点击 Add deploy key 添加公钥

PS. 添加时需要勾选 Allow write access 选框

4 编写 Github Actions

Github Actions 的配置文件是一个 yaml 文件,放置在 .github 下的 workflows 目录下

首先,创建一个 yaml 文件,取名为 deploy.yml,在 deploy.yml 中添加以下内容:

env 中替换成自己的,然后需要注意的是分支名,根据自己情况填写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
name: CI

on:
push:
branches:
- main

env:
GIT_USER: your-name
GIT_EMAIL: your-email
THEME_REPO: theme-next/hexo-theme-next
THEME_BRANCH: master
DEPLOY_REPO: your-name/your-name.github.io
DEPLOY_BRANCH: main

jobs:
build:
name: Build on node ${{ matrix.node_version }} and ${{ matrix.os }}
runs-on: ubuntu-latest
strategy:
matrix:
os: [ubuntu-latest]
node_version: [18.18.0]

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Checkout theme repo
uses: actions/checkout@v4
with:
repository: ${{ env.THEME_REPO }}
ref: ${{ env.THEME_BRANCH }}
path: themes/next

- name: Use Node.js ${{ matrix.node_version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node_version }}

- name: Configuration environment
env:
HEXO_DEPLOY_PRI: ${{secrets.HEXO_DEPLOY_PRI}}
run: |
sudo timedatectl set-timezone "Asia/Shanghai"
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRI" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
git config --global user.name $GIT_USER
git config --global user.email $GIT_EMAIL
cp _config.next.yml themes/next/_config.yml

- name: Install dependencies
run: |
yarn install

- name: Deploy hexo
run: |
npm run deploy

上述的 yaml.yml 文件需要根据自己的实际情况编写,上面大体上做了以下几件事:

  • 创建 ubuntu + node 环境
  • 从 my-blog 拉取代码
  • 拉取子模块主题项目的代码
  • 执行脚本。包括 git 的初始设置、私钥的设置以及主题配置文件的替换等
  • 安装依赖
  • 部署项目。这个是已经在 Hexo 配置文件中配置了 your-name.github.io 的 SSH 链接的,实际部署和本地的执行效果一样

从本地到 your-name.github.io 仓库部署完成实际上有两个代码推送的过程,第一个是本地到 my-blog 仓库,另一个是从 Github Actions 临时构建的环境到 your-name.github.io 仓库

至于为什么需要密钥对,其实就是为了能够通过 SSH 的方式去推送代码,好像还有一个 token 也可以实现类似的效果,不过我没试过,以后试试

5 参考