使用GithubActions自动部署Hexo

此教程来自:https://blog.anheyu.com/posts/asdx.html

常量名 常量释义
[Blogroot] 本地存放博客源码的文件夹路径
[SourceRepo] 存放博客源码的私有仓库名
[SiteBlogRepo] 存放编译好的博客页面的公有仓库名 Site 指站点,教程中会替换成 Github、Gitee、Coding
[SiteUsername] 用户名 Site 指站点,教程中会替换成 Github、Gitee、Coding
[SiteToken] 申请到的令牌码 Site 指站点,教程中会替换成 Github、Gitee、Coding
[GithubEmail] 与 github 绑定的主邮箱,建议使用 Gmail
[TokenUser] Coding 配置特有的令牌用户名

1.获取Token

访问 Github头像(右上角)-> Settings ->Developer Settings ->Personal access tokens->generate new token,创建的 Token 名称随意,但必须勾选 repo 项 和 workflows 项。

注意:token 只会显示一次,之后将无法查看,所以务必记录下了 Token。

image

image

2.创建存放Hexo源码的私有仓库

存放Hexo源码的私有仓库[^1]

3.配置 Github Action

1.在 D:\Hexo-Blog​ 新建文件.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
# 当有改动推送到master分支时,启动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: "v18.20.5" #action使用的node版本,建议大版本和本地保持一致。可以在本地用node -v查询版本号。

- 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: 部署 #此处master:master 指从本地的master分支提交到远程仓库的master分支,若远程仓库没有对应分支则新建一个。如有其他需要,可以根据自己的需求更改。
run: |
cd ./public
git init
git config --global user.name '${{ secrets.GITHUBUSERNAME }}'
git config --global user.email '${{ secrets.GITHUBEMAIL }}'
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:main

2.在仓库添加环境变量

之后需要自己到仓库的 Settings->Secrets->actions 下添加环境变量,变量名参考脚本中出现的,依次添加。

image

脚本中必要的变量为GITHUBUSERNAME​、GITHUBEMAIL​、GITHUBTOKEN​,因此添加这三条变量。

3.重新设置远程仓库和分支

1.打开 D:\Hexo-Blog\.gitignore​(也是隐藏文件),输入以下内容:

1
2
3
4
5
6
7
8
9
10
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
.deploy_git*/
.idea
themes/butterfly/.git

如果不是butterfly​​主题,记得替换最后一行内容为你自己当前使用的主题。

2.在博客根目录D:\Hexo-Blog​下启动终端,使用 git 指令重设仓库地址。这样在新建仓库,我们仍旧可以保留珍贵的 commit history,便于版本回滚。

1
2
3
4
5
6
git remote rm origin # 删除原有仓库链接
git remote add origin git@github.com:Somongbeom/blog.git #[SourceRepo]为新的存放源码的github私有仓库
git checkout -b main
git add .
git commit -m "github action update"
git push origin main

4.可能遇到的问题

4.1因为 butterfly 主题文件夹下的.git 文件夹的存在,那么主题文件夹会被识别子项目。

从而无法被上传到源码仓库。若是遇到添加屏蔽项,但是还是无法正常上传主题文件夹的情况。请先将本地源码中的 themes 文件夹移动到别的目录下。然后 commit 一次。接着将 themes 文件夹移动回来,再 commit 一次。

要是还不行,那就删了 butterfly 主题文件夹下的.git 文件夹,然后再重复上述的 commit 操作。

4.2 ! [rejected] main -> main (fetch first)

1
2
3
4
5
6
! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'github.com:Somongbeom/blog.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.

这意味着你的本地 main​ 分支与远程 main​ 分支之间存在差异,远程分支上有你本地没有的更改。Git 阻止了推送,以防止你覆盖远程分支上的更改。

要解决这个问题,你可以按照提示进行操作:

方法 1:使用 git pull​ 合并远程更改

你可以先将远程分支上的更改拉取到本地,然后解决任何可能的冲突,再进行推送。

1
git pull origin main

这会将远程 main​ 分支的更改合并到你的本地 main​ 分支。如果合并过程中出现冲突,你需要手动解决这些冲突,然后再次提交更改。

方法 2:使用 git fetch​ 和 git merge

如果你想要更细粒度地控制合并过程,可以使用 git fetch​ 和 git merge​:

1
2
git fetch origin
git merge origin/main

这同样会将远程 main​ 分支的更改合并到你的本地 main​ 分支。解决任何冲突后,再进行推送。

方法 3:强制推送(不推荐)

如果你确定你的本地更改是正确的,并且想要覆盖远程分支上的更改,可以使用强制推送。但请注意,这会丢失远程分支上的所有更改,因此请谨慎使用:

1
git push -f origin main

当你看到这样的提示时,Git 正在要求你输入一个提交信息来解释为什么需要合并远程分支 origin/main​。这通常发生在执行 git pull​ 或 git merge​ 命令后,Git 需要你确认合并的原因。

如何输入提交信息

  1. 打开合并信息文件

    • Git 会自动打开一个文本编辑器(通常是 Vim 或 Nano),让你输入合并信息。
  2. 输入合并信息

    • 在编辑器中,删除或修改以 #​ 开头的注释行。

    • 在第一行输入一个简短的合并信息,例如:

      1
      Merge remote-tracking branch 'origin/main' to resolve conflicts
    • 在接下来的几行中,可以添加更详细的解释,例如:

      1
      This merge is necessary to integrate the latest changes from the remote repository and resolve any conflicts that arose during development.
  3. 保存并退出编辑器

    • 如果你使用的是 Vim,按 Esc​ 键,输入 :wq​,然后按 Enter​ 键保存并退出。
    • 如果你使用的是 Nano,按 Ctrl+X​,然后按 Y​ 确认保存更改,最后按 Enter​ 键退出。

示例合并信息

1
2
3
Merge remote-tracking branch 'origin/main' to resolve conflicts

This merge is necessary to integrate the latest changes from the remote repository and resolve any conflicts that arose during development.

注意事项

  • 确保信息清晰:合并信息应该清晰地说明为什么需要合并,特别是当合并涉及到解决冲突时。
  • 避免空提交信息:如果提交信息为空,Git 会终止合并过程,你需要重新输入信息。

通过输入合适的合并信息,你可以帮助团队成员更好地理解代码历史和合并的原因。