Github Actions自动部署Hexo博客至个人服务器

前端 · 2023-02-18
hexo作为一款优秀的静态博客生成器有着一些显著的优点如免费快速简洁轻量,但也存在一些明显的缺点例如更换电脑不便需要重新安装环境,无法在线写文章(修改文章),随着文章和插件的增加hexo三连的速度会越来越慢,使用github actions集成化部署再配合hexoplusplus可以在很大程度上改善hexo的使用体验。

 个人服务器是自建了 git 库,利用 hook 钩子发布到网站根目录。所以这篇教程最终是利用 hexo deploy 进行上传到服务器操作。

获取token

获取token是为了保证上传到GitHub公开的网站仓库(编译后的静态页面存放的仓库)有足够的权限可以上传,如果你只是要部署到服务器不同步到GitHub page可以忽略这一步。

登录GitHub点击该链接再点击generate new token,创建token名称可以随意填写,但是必须勾选全部的repo,其他权限不用勾选。

必须勾选全部的repo

必须勾选全部的repo

生成token后请复制保存到安全的地方确保已经正确记录token因为token只会显示这一次,如果忘记了只能重新生成,这样做也是为了保护账号安全防止被人盗取token为所欲为。

创建存放hexo源码的私有仓库

使用私有仓库是因为涉及到自己文章如果开源仓库可能会导致别人盗取文章的风险同时开源也会暴露站点yml里的token可能会被别有用心获取肆意操作你的github仓库。所以必须闭源。

修改站点_config.yml deploy

deploy:
  - type: git
    repo: https://GitHub用户名:上一步获取的token@github.com/GitHub用户名/GitHubpages对应的仓库.git
    branch: master #GitHubpages对应的仓库存放的分支2020年十二月以后默认分支为main注意修改
  - type: git
    repo: git@服务器ip:/home/git/blog.git #仓库地址
    branch: master

以我自己的配置为例,token、ip使用*号进行加密。

deploy:
  - type: git
    repo: https://brqs:ghp_fG8Z*****************bV1SR@github.com/brqs/brqs.github.io.git #开源页面仓库地址
    branch: master
  - type: git
    repo: git@49.***.72.57:/home/git/blog.git #服务器仓库地址
    branch: master

配置GitHub Action

GitHub Actions 的配置文件叫做 workflow 文件,存放在代码仓库的.github/workflows目录。

workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为.yml,比如foo.yml。一个库可以有多个 workflow 文件。GitHub 只要发现.github/workflows目录里面有.yml文件,就会自动运行该文件。

所以需要在本地站点目录新建文件夹.github注意前面有点在里面再新建workflows文件夹。目录结构如下所示

blog (repository)
└── .github
    └── workflows
        └── autodeploy.yml

新建autodeploy.yml里面输入如下内容这个yml来源于akilar我加了一点服务器验证内容用于验证连接的服务器。注意你需要修改其中GitHub用户名、邮箱、服务器ip 、token信息。

# 当有改动推送到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: '12.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: 服务器验证
        env:
          ACTION_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_PRI }}
        run: |
          sudo timedatectl set-timezone "Asia/Shanghai"
          mkdir -p ~/.ssh/
          echo "$ACTION_DEPLOY_KEY" > ~/.ssh/id_rsa
          chmod 600 ~/.ssh/id_rsa
          ssh-keyscan 49.***.72.57 >> ~/.ssh/known_hosts  #此处填写你的服务器IP
          git config --global user.name "brqs"
          git config --global user.email "3447851674@qq.com" #修改为你的GitHub用户名邮箱

      - name: 部署
        run: |
          git config --global user.name "brqs"
          git config --global user.email "3447851674@qq.com"
          git clone https://brqs:ghp_fG8*************CR2bV1SR@github.com/brqs/brqs.github.io.git .deploy_git
          #修改为你的GitHub用户名邮箱
          # 此处务必用HTTPS链接。SSH链接可能有权限报错的隐患,模仿
          # =====注意.deploy_git前面有个空格=====
          # 这行指令的目的是clone博客静态文件仓库,防止Hexo推送时覆盖整个静态文件仓库,而是只推送有更改的文件
          hexo deploy

前往私有仓库添加secrets密钥

登录GitHub进入私有仓库点击settings->secrets->new repository secret添加密钥name填HEXO_DEPLOY_PRI,Value填生成再c盘.ssh文件夹中id_rsa打开该文件全选内容复制粘贴即可.

添加屏蔽项

通常站点根目录下有很多文件夹但是他们中并不都需要上传到私有仓库,添加屏蔽项可以减少上传所需时间同时避免上传无意义的文件到仓库。新建.gitignore文本文件已有进入修改,写入以下内容。

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
.deploy_git*/

上传文件到私有仓库

第一次使用git管理博客源码,在根目录下git here运行如下指令

git init #初始化
git remote add origin git@github.com:github用户名/私有仓库名.git#可以从github仓库quick setup复制,连接github仓库
git branch -M main#切换到main分支
#以后每次上传内容的时候需要运行以下三条命令
git add . #添加目录下所有文件
git commit -m "github action update" #上传描述必须有
git push -u origin main #上传到github

如果已经管理过可以将根目录下.git文件夹(点击查看显示隐藏文件夹)删除,再进行上述操作.

新建上传脚本(可选)已升级

每次上传内容的时候我们都需要运行三条命令很繁琐容易把我们累死,所以我弄了一个上传脚本(如果你不在意每次的上传描述,就可以实现一键上传)当然更推荐你每次都添加描述手动上传。根目录下新建up.sh写入以下内容。

#!/bin/sh
#sluggard: brqs
#使用前请先在站点根目录新建一个version.txt文本文件
#在txt函数中即可修改初始版本号
echo "==========================================="
echo "       欢迎使用上传脚本!"
echo "==========================================="
function deploy()
{
printf "\033[32mINFO \033[0m 正在上传...请稍后\n"
git add .
git commit -m "$log"
git push origin main
git pull --rebase origin main
git push origin main
printf "\033[32mINFO \033[0m 上传完毕~~期待下次再见\n"
}
function txt()
{
version=$(awk '{print NR}' version.txt|tail -n1 )
time=$(date "+%Y-%m-%d %H: %M :%S")
echo "3.$version版本更新,日志:$log,更新时间 ${time} " >>version.txt
}
HexoPath=$(cd "$(dirname "$0")"; pwd)
cd ${HexoPath}
echo "[0] 退出上传"
echo "[1] 日常维护"
echo "[2] 开发调试"
echo "[3] 自定义输入"
echo " "
printf "请选择需要的日志内容"
echo " "
printf "选择:"
read answer
if [ "$answer" = "1" ] || [ "$answer" = "" ]; then
log="日常维护"
txt
deploy
else
if [ "$answer" = "2" ]; then
log="开发调试"
txt
deploy
else
if [ "$answer" = "3" ]; then
read  -p "更新日志 > " log
txt
deploy
else
if [ "$answer" = "0" ]; then
printf "\033[32mINFO \033[0m 已取消上传\n"
sleep 1s
exit 0
else
printf "\033[31mERROR \033[0m 输入错误,请返回重新选择...\n"
sleep 1s
exec ${HexoPath}/up.sh
fi
fi
fi
fi

然后以后每次上传你都只需要运行bash up.sh即可。

思考

到这里基本上就完成了集成部署,那么集成部署以后可以做什么呢?你可以通过github网页修改文章的错别字错误的图片路径,只要检测到main分支内文件发生变动action就会自动帮你完成部署。那么也可能会产生一个问题仓库修改内容以后会和本地仓库不一致导致出现问题可以利用拉取仓库文件覆盖本地文件来解决。

git pull --rebase origin main #拉取仓库文件覆盖本地文件,建议在开始写东西前先拉取一下避免不一致。

同时可以接入hexo plus plus这个项目来实现云端写作功能进行实时写作目前hpp项目支持的功能有云端写作图床管理,引用hpp首页一句话众所周知Hexo+HexoPlusPlus+Twikoo=Typecho而且以后hpp可能会推出更多功能。

hexoplusplus官网地址

hexo 服务器 git
  1. 大赵同学 2023-06-11

    get!

Theme Jasmine by Kent Liao