hugo 简介

hugo 基础概念介绍

引言

hugo 是一个用 Go 语言实现的静态网站生成器。把符合规则的 markdown 文档转为静态网站的 html、css 等文件的工具, 即将 markdown 文档转为博客。

提供三个版本可供安装,版本区别如下所示,推荐安装 extend 版本。

版本说明
standard基础版本,适用于一般的静态网站生成
extend包含 standard 的所有功能,额外支持 SCSS/SASS 编译和 resources 处理功能
extended/deploy包含 extend 的所有功能,额外包含 hugo 内置的 hugo deploy 功能,可以将网站部署到云存储服务(AWS S3、Google Cloud Storage 等)

也可以直接从 GitHub 中下载压缩包后解压

注意:需要将解压后的路径地址添加到系统环境变量(PATH)!!!

创建站点

需要提前安装 hugoGit

  1. 初始化:在本地创建 quickstart 文件夹,并在文件夹中生成 hugo 模板和默认配置。

    1
    2
    
    hugo new site quickstart
    cd quickstart
    
  2. 修改内容:quickstart 设置为项目根目录并 git 初始化,通过 git submodule 方式将 gohugo-theme-ananke 主题下载到 quickstart/themes/ananke 路径下,修改 hugo.toml 文件设置主题为 ananke

    1
    2
    3
    
    git init
    git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
    echo "theme = 'ananke'" >> hugo.toml
    

    主题名需要与 themes 文件夹下的目录名称保持一致

    主题 ananke 文件夹结构与 quickstart 结构基本相同,可以理解为 quickstart 中为默认配置, 选择 ananke 主题后,ananke 中的配置替换掉默认配置,因此可以轻松替换网站主题

  3. 本地部署:运行如下命令后可以打开浏览器输入 localhost:1313 查看网站效果。

    1
    
    hugo server
    

    hugo server 运行后会生成 public 和 resources 目录,其中 public 才是网站的本体。

可以在 here 选择不同的 hugo 主题。

当然也可以自己设置主题,并将其发布。

自动化部署

写博客不仅仅是为方便自己,有时候也希望帮助他人。那么怎么样才能将博客分享到互联网上? 这里提供一个简单方便的做法:github pages(gh-pages)。

gh-pages

gh-pages 是 GitHub 推出的一项服务。它支持将 Git 仓库中的静态页面转为一个网站,完美契合我们的需求。

需要注册一个 GitHub 账号

  1. 创建仓库,仓库名为 {user}.github.io(user 为创建账号时填写的用户名,创建时要求此名称唯一)。
  2. git clone {user}.github.io 到本地。
  3. quickstart 项目生成的 public 文件夹复制到 {user}.github.io 项目中。
  4. {user}.github.io 中添加项目变更并推送到远程仓库。

回顾上述流程,不难发现操作过于复杂,且博客经常更新,有没有简单点的方式呢? 答案是可以,GitHub Actions 就能解决此问题。

GitHub Actions

GitHub Actions 是 GitHub 提供的 DevOps 功能,可以按需执行自动化流程。

上述操作简化如下:

  1. quickstart 中变更博客内容
  2. 提交 quickstart 项目,自动运行 hugo server 命令并生成 public 目录
  3. public 目录复制到 {user}.github.io 项目中

简化后我们只需要专心致志写博客即可(quickstart)。

要将 quickstart 中的 public 写入到 {user}.github.io 中,就要求获取 {user}.github.io 仓库的写权限。 因此需要配置 {user}.github.ioDeploy key。 即在 {user}.github.ioDeploy keys 中配置公钥,在 quickstartSecrets and variables/Actions 中配置私钥(变量名为 DEPLOY_PRIVATE_KEY)。

GitHub Actions 的 CI/CD 流程通过 YAML 文件配置,需要放在项目的 .github/workflows 目录中,下面是我配置的 deploy.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
name: Deploy to public repo # 流水线(流程)名称

on:         # 触发条件:仅在 master 分支上的 push 和 pull_request 操作才会运行
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:                         # 配置多个任务(这里只有 build 任务,即希望提交时自动运行 hugo server)
  build:
    runs-on: ubuntu-latest    # build 任务运行的基础环境,这里需要注意:以下所有步骤都是在 ubuntu-latest 的容器(虚拟机)中运行,不会影响项目仓库,且在执行完毕后销毁此容器(回收资源)

    steps:                        # 将任务拆分成多个步骤
      - name: Checkout repo       # 将项目 clone 到 ubuntu-latest
        uses: actions/checkout@v4

      - name: Cache Hugo resources # 缓存项目需要的依赖项,加快流程(其实此博客项目没什么好缓存的。。。)
        uses: actions/cache@v4
        env:
          cache-name: cache-hugo-resources
        with:
          path: resources
          key: ${{ env.cache-name }}

      - uses: actions/setup-go@v5   # 安装指定版本的 Go(hugo 运行需要 Go 环境)
        with:
          go-version: 1.22.12
      - run: go version

      - name: Cache Go Modules      # 拉取项目需要的依赖库(go.mod 中记录的依赖库信息)
        uses: actions/cache@v4
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-

      - name: Setup Hugo          # 安装指定版本的 hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: 0.145.0
          extended: true

      - name: Build               # 在容器中运行 hugo --minify --gc 命令生成 public 文件夹
        run: |
          hugo --minify --gc
          cp CNAME public
          cp README.md public

      - name: Deploy to public repo # 将生成的 public 目录推送到指定的仓库和分支中
        uses: s0/git-publish-subdir-action@develop
        env:
          REPO: [email protected]:haxung/haxung.github.io.git
          BRANCH: master
          FOLDER: public
          SSH_PRIVATE_KEY: ${{ secrets.DEPLOY_PRIVATE_KEY }} # 这里就是配置的 REPO 项目的私钥,通过变量名取值(切记不要明文配置,不然密钥泄露后谁都可以往 REPO 中推送一些奇奇怪怪的内容。。。)
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计