Contents

使用Github Actions部署Hugo Blog

Contents

前言

这是第三次搭博客了,第一次用hexo构建的,要求机子上必须有nodejs环境,跨设备能力较差,放弃了,第二次使用hugo构建的,hugo本身只有可执行文件,跨设备能力很好,但是其构建时也要维护一个静态资源的环境,也是一堆文件,于是又放弃了。当然前面这两点都是为我不想写博客找借口🤣。

这次构建使用的还是hugo,但是为了拜托环境的依赖,我把构建工作放到Github actions上进行了,现在本地理论上只需要保存原始的markdown文件即可,push到远程仓库之后,由GitHub Action自动完成构建并发布到Github Page上,个人仅需要完成写作工作,构建发布的事情完全自动化了,这下“理论上”也没有拖着不写的理由了。

Hugo配置

Hugo本身是用go编写的,最后构建出来是一个binary文件,相较于脚本语言,一个binary的便携性大大增强,不需要像nodejs一样先配置node环境。

Hugo的工作比较像编译器,把markdown源文件转换成带样式的html网页。具体的样式也就是主题是可以配置的,有大量的第三方主题可供我们使用,这里使用的主题是LoveIt,比较简洁,支持公式,配置文档写的也还不错。Hugo使用前需要使用hugo init创建一个工作目录,在里面我们会放置各类静态文件和主题文件,同时把markdown文件放置到content文件夹下,随后调用hugo,Hugo就会根据目录下的各类文件构建出html文件,并把生成的结果放置到public文件夹下。我们把public文件夹下的内容push到Github Page仓库中,访问Github Page就能看到自己的博客了。本地想要直接预览的话可以使用hugo server,他会检测文件变化的情况,实时进行构建,比较方便测试时使用。

Hugo在构建网页时会根据工作目录下的config.toml进行定制化配置,比如指定主题,网页中作者的信息等等,所以我们在使用构建网页前要先配置一下config.toml文件,详细的配置信息可以去你使用的第三方主题文档中找,大部分主题会给一个模板,照着改改就可以了。

使用Github Actions自动部署

Github Actions是Github推出的一个免费的持续集成服务,可以理解为Github免费给我们一台小服务器,供我们执行一些简单的任务。至于Github Actions的具体内容,这里就不详细讲了,详见Actions

我想要的就是本地只有原始的markdown文件,Hugo以及其相应的工作目录都不应该存储在本地上,当我把本地的markdown文件push到Github上时,Github Actions会自动使用Hugo进行构建,并发布到Github Page上。

我们需要三个仓库实现整件事情,分别是blog仓库用于存放原始的markdown文件,hugo_blog_env仓库用于存放hugo的工作目录和第三方主题,最后一个是存放Github Page的仓库。blog仓库仅存储原始的markdown文件,其作为一个submodule链接到hugo_blog_env仓库的content文件夹下。首先在blog仓库中开一个action,其要在发生push之后,向hugo_blog_env仓库发送repository dispatch信号,告诉hugo_blog_env仓库自己被更新了,hugo_blog_env仓库在收到repository dispatch之后开始构建工作,首先把最新的blog仓库最新的内容拉下来到content文件夹下,然后拉去hugo的binary,开始构建,并将构建的结果部署到Github Page的仓库中,最后把最新的结果提交到hugo_blog_env中。这里面很多脚本都是使用其他人写好的,所以实现起来比较简单。这里把脚本记录一下

blog -> hugo_blog_env

name: DeployGitHubPages

on:
  push:
    branches:
      - main  # Set a branch to deploy

jobs:
  update:
    runs-on: ubuntu-18.04
    steps:
      - name: Repository Dispatch
        uses: peter-evans/repository-dispatch@v2
        with:
          token: ${{ secrets.REPO_ACCESS_TOKEN }}
          repository: xyfuture/hugo_blog_env
          event-type: blog_update

hugo_blog_env -> Github Page

name: DeployGitHubPages

on:
  repository_dispatch:
    types: [blog_update]
#  push:
#    branches:
#      - main  # Set a branch to deploy

jobs:
  deploy:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive  # Fetch Hugo themes (true OR recursive)
          fetch-depth: 0    # Fetch all history for .GitInfo and .Lastmod
      
      - name: Pull Content
        run: |
          cd ./content
          git pull origin main          
      
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          # hugo-version: '${{ steps.hugo-version.outputs.HUGO_VERSION }}'
          hugo-version: '0.101.0'
          extended: true
          
      - name: Build
        run: hugo --minify

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
          external_repository: xyfuture/xyfuture.github.io
          publish_branch: main
          publish_dir: ./public

      - uses: stefanzweifel/git-auto-commit-action@v4

这里面还有几个需要配置的信息,首先发送Repository Dispatch请求需要申请一个Github PAT(Personal Access Token),然后从一个仓库提交到另一个仓库需要一个Deploy Key(RSA key)。

最后所有这些都完成后,测试一下看看能不能通,如果可以的话构建部署就完全自动了,本地仅同步blog仓库,写了新的markdown就push上去,然后在hugo_blog_env中自动构建出新的网页并发布到Github Page上,速度的话感觉也还行,整个一套跑下来2min之内基本上也就完成了。

后记

经过这一番折腾,大致了解了Github Actions的运作流程,也实现了博客的自动部署,以后不更博客的理由可能真的只有懒了,虽然之前也是hhhh。