每次部署Hexo都需要运行指令三件套,随着文章越来越多,编译的时间也随之越来越长,通过Github Action,我们只需要在每次完成博客的编写或修改以后,将改动直接push到远程仓库,之后的编译部署的工作统统交给CI来完成即可。

参考

使用Github Action实现全自动部署 | Akilarの糖果屋

说明

  • 准备二个仓库
    • hexo :私人仓库,用来存放源码
    • fulsun.github.io :公开仓库,用于部署 Github page
  • 下面所有的操作在 私人仓库中进行配置

获取Token

访问 Github->头像(右上角)->Settings->Developer Settings->Personal access tokens-> generate new token,创建的Token名称随意,但必须勾选repo项和workflows项。 token只会显示这一次,之后将无法查看,所以务必保证你已经记录下了Token。之后如果忘记了就只能重新生成重新配置了。

配置Github Action

在hexo博客目录新建.github文件夹,注意开头是有个.的。然后在.github内新建workflows文件夹,再在workflows文件夹内新建autodeploy.yml,在[root]/.github/workflows/autodeploy.yml里面输入

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
# 当有改动推送到main分支时,启动Action
name: 自动部署

on:
push:
branches:
- main #2020年10月后github新建仓库默认分支改为main,注意更改

release:
types:
- published

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 检查分支
uses: actions/checkout@v2
with:
ref: main #2020年10月后github新建仓库默认分支改为main,注意更改

- name: 安装 Node
uses: actions/setup-node@v1
with:
node-version: "18.x"

- name: 安装 Hexo
run: |
export TZ='Asia/Shanghai'
npm install hexo-cli -g

- name: 缓存 Hexo
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}

- name: 安装依赖
if: steps.cache.outputs.cache-hit != 'true'
run: |
npm install --save

- name: 生成静态文件
run: |
hexo clean
hexo generate

- name: 部署 #此处main:gh-pages 指从本地的main分支提交到远程仓库的gh-pagesmain分支,若远程仓库没有对应分支则新建一个。如有其他需要,可以根据自己的需求更改。
run: |
cd ./public
git config --global init.defaultBranch main
git config --global user.name '${{ secrets.GITHUBUSERNAME }}'
git config --global user.email '${{ secrets.GITHUBEMAIL }}'
git init
git add .
git commit -m "${{ github.event.head_commit.message }} $(date +"%Z %Y-%m-%d %A %H:%M:%S") Updated By Github Actions"
git push --force --quiet "https://${{ secrets.GITHUBUSERNAME }}:${{ secrets.GITHUBTOKEN }}@github.com/${{ secrets.GITHUBUSERNAME }}/${{ secrets.GITHUBUSERNAME }}.github.io.git" main:gh-pages

定义变量

变量名 常亮含义
GITHUBUSERNAME Github用户名
GITHUBEMAIL Github邮箱
GITHUBTOKEN Github申请秘钥
  • 到仓库的Settings->Secrets->actions 下添加环境变量,变量名参考脚本中出现的,依次添加。

查看部署情况

  • 此时,打开GIthub存放源码的私有仓库,找到action。

  • 点击自动部署,根据刚刚的Commit记录找到相应的任务,点击Deploy查看部署情况,若全部打钩,恭喜你,你现在可以享受自动部署的快感了。

同步到gitee

  • 同步 github的fulsun.github.io 到 gitee的fulsun

  • [root]/.github/workflows/autodeploy.yml里面添加输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #git push --force --quiet "https://${{ secrets.GITEEUSERNAME }}:${{ secrets.GITEETOKEN }}@gitee.com/${{ secrets.GITEEUSERNAME }}/${{ secrets.GITEEUSERNAME }}.git" master:master #gitee部署写法,需要的自行取消注释
    #同步到gitee这一步,如果上面写了推送到gitee仓库的git push指令了,那同步到 Gitee 这一块就不需要了。
    - name: 同步到 Gitee
    uses: wearerequired/git-mirror-action@master
    env:
    # 注意在github私有仓库的Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY
    SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
    with:
    # 注意替换为你的 GitHub 源仓库地址
    source-repo: "git@github.com:${{ secrets.GITHUBUSERNAME }}/${{ secrets.GITHUBUSERNAME }}.github.io.git"
    # 注意替换为你的 Gitee 目标仓库地址
    destination-repo: "git@gitee.com:${{ secrets.GITEEUSERNAME }}/${{ secrets.GITEEUSERNAME }}"
    # 这里就是模拟了一个点击更新网站按钮的动作。可以实现gitee page 自动更新。
    - name: 构建 Gitee Pages
    uses: yanglbme/gitee-pages-action@master
    with:
    # 注意替换为你的 Gitee 用户名
    gitee-username: ${{ secrets.GITEEUSERNAME }}
    # 注意在在github私有仓库的Settings->Secrets 配置 GITEE_PASSWORD
    gitee-password: ${{ secrets.GITEE_PASSWORD }}
    # 注意替换为你的 Gitee 仓库
    gitee-repo: ${{ secrets.GITEEUSERNAME }}/${{ secrets.GITEEUSERNAME }}
    branch: gh-pages
  • 添加变量

    变量名 常亮含义
    GITEE_RSA_PRIVATE_KEY 个人私钥,存放在C:\Users\userneme\.ssh\id_rsa
    GITEEUSERNAME Gitee 用户名
    GITEE_PASSWORD Gitee 密码
  • 可能遇到的bug:

    1. Gitee用github action自动部署更新收到短信,提示异地登录需要验证码。
      因为github action使用的是美国的服务器,所以,使用github action来远程更新gitee的站点部署时,会收到异地登陆的短信,提示需要验证码。这个在脚本作者的issues里有相应的解决方案:登陆失败 #6
      • 在微信上搜索Gitee微信公众号,在微信公众号内绑定自己的Gitee账号,这样虽然还是会有异地登录提示,但是发过来的消息不再需要填写验证码,而且提醒若不是你在操作,请及时修改密码。(某种意义上就是我在操作,所以我选择不改密码2333)
      • 使用VPN,通过美国IP登录一次Gitee。(一般第一步就能把问题解决了,用不到第二步。)
    2. Gitee部署失败
      脚本的原理是用程序代替人工去点击Gitee Pages的更新按钮。所以需要你先手动做一次页面部署,确保有那个更新按钮在,脚本才有生效的前提。