hugo博客github action部署后文章更新时间异常修复

警告
本文最后更新于 2022-08-14,文中内容可能已过时。

困扰的问题

hugo博客搭建好后,陆陆续续发现一些问题。大都成功进行了处理。

其中一个最头大的问题就是:文章更新时间异常。

文章更新时间异常
文章更新时间,本地和远程部署的不同,远程通过github action|vecel部署,远程部署后的时间不对,会把所有文章时间都更为最新。

每次更新文章后,本地显示所有文章更新时间正常,没有修改的还是保留旧的更新日期,而通过github action|vecel自动部署后,所有文章更新时间都会改为最新此次更新时间,那些此次没有做修改的文章也一并全部更新。

注意,不是发表时间,发表时间没有问题。

https://s2.loli.net/2022/08/16/Mt2EKIVY5ai8zmv.png
https://s2.loli.net/2022/08/16/jgeDwLyHtzUpFY4.png

这个bug,花费了我很多时间精力才找到原因,终于解决了这个问题。

hugo时间字段

解决这个问题,我们先说hugo博客的几个时间字段说起。

hugo全局配置文件为config.toml/yaml/json

在hugo中日期(时间)是非常重要的字段,hugo的官方配置文档configuration(https://gohugo.io/getting-started/configuration/#configure-dates)提供一个配置日期的section [frontmatter]

1
2
3
4
5
6
7
[frontmatter]

  # 左边意为,变量 .Date 将会被赋值为右边数组中最先找到的的日期值
  date = ['date', 'publishDate', 'lastmod'] 
  expiryDate = ['expiryDate']
  lastmod = [':git', 'lastmod', 'date', 'publishDate']
  publishDate = ['publishDate', 'date']
  • publishDate: 变量,发表日期
  • expiryDate:变量,有效期
  • lastmod:变量,最后修改日期
  • :git:git文件提交修改时间

这是官方列举的字段和基本配置,不过说明不是很详细。

这里说明一下,=左边的是变量,右边中括号的是变量值,需要在对应模板里添加后才生效。

最后更新时间

这里我们只探讨最后更新时间 lastmod

一般主题里的配置方式是这样:

1
2
[frontmatter]
  lastmod = [":git", ":fileModTime", "lastmod", ":defalut"]
  • :git:git文件提交修改时间
  • :fileModTime:文件修改时间
  • lastmod:文章里lastmod字段
  • :defalut:默认时间

这里lastmod变量获取,以git文件提交修改时间,文件修改时间这样排,文章里"lastmod“字段可不加,这样是没问题的。

我的博客就是以此配置为准,本地运行时,更新时间显示正常


  1. 如果要加”lastmod“字段,在创建文章模板里添加以下一行。添加”lastmod",有个好处就是可自由修改这个字段的时间。

hugo默认位置为archetypes/default.md或者主题下目录下xx主题/archetypes/posts.md,主题目录下如果有增加模板,创建时会以主题目录下的模板来创建。

1
lastmod: {{ .Date }}
  1. 然后再去config.toml/yaml/json

调整这里顺序即可:

1
2
[frontmatter]
  lastmod = [":git", "lastmod", ":fileModTime", ":defalut"]

问题解决

好了,按以上配置,本地运行时,更新时间显示正常,这没有任何问题。

问题来了,通过GitHub action 部署后(我的verccel从GitHub直接同步过去),就出现问题了,每次一提交更新,会把所有文章时间都更为最新。

本地端没问题,说明问题就出在GitHub action 部署过程了。

补充提示一下,有一个坑 : GitHub action的Schedule 运行不准时

GitHub action上的默认配置时间有个坑,设定的 schedule 是UCT时间的08:00,比北京时间快8个小时。因此运行环境要改为北京时间。

解决方法:

0. 填坑

.github/workflows/xx.yml

yml文件中添加 2行设置当前环境时区

1
2
3
4
5
6
name: Hugo build and deploy
on:
	push:

env:
	TZ: Asia/Shanghai # 设置当前环境时区

1. 开启gitinfo

config.toml/yaml/json

1
2
#获取git信息
enableGitInfo = true  #设为true

2.  gihutb action里yaml上配置

建构前新增以下配置,主要是quotePath,默认情况下,文件名包含中文时,git会使用引号吧文件名括起来,这会导致action中无法读取:GitInfo变量,所以要设置Disable quotePath[^1]

1
2
3
4
5
6
- name: Git Configuration
        run: |
          git config --global core.quotePath false
          git config --global core.autocrlf false
          git config --global core.safecrlf true
          git config --global core.ignorecase false

使用checkout的话 fetch-depth 需要设为0,depth默认是为1,默认只拉取分支最近一次commit,可能会导致一些文章的GitInfo变量无法获取,设为0代表拉去所有分支所有提交。

1
2
	uses: actions/checkout@v2
		  fetch-depth: 0   #设为0

以下是我最终的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

name: Hugo build and deploy
on:
  push:

env:
  TZ: Asia/Shanghai # 设置当前环境时区

jobs:
  Actions-Hugo-Deploy:
    runs-on: ubuntu-latest
    steps:

      - name: Check out repository code
        uses: actions/checkout@v2
        with:
          submodules: recursive  # Fetch Hugo themes (true OR recursive)
          fetch-depth: 0         # Fetch all history for .GitInfo and .Lastmod

      - name: Git Configuration
        run: |
          git config --global core.quotePath false
          git config --global core.autocrlf false
          git config --global core.safecrlf true
          git config --global core.ignorecase false          
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: latest
          extended: true
      - name: Build Hugo static files
        run: hugo -v --gc --minify
      - name: Deploy to Github Pages
        uses: peaceiris/actions-gh-pages@v3
        with:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
          external_repository: Charlie-king/Charlie-king.github.io
          publish_branch: main
          publish_dir: ./public

  
      - name: NPM install
        run: npm install
      - name: Update Algolia index
        env:
          ALGOLIA_APP_ID: B6R922P6DD
          ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}
          ALGOLIA_INDEX_NAME: 'dev_hugo'
          ALGOLIA_INDEX_FILE: './public/index.json'
        run: npm run algolia
  

参考:

# Github Action 自动修改文章的更新日期

# [BUG] 目录所有文章-最近更新,本地与远程打包不同,数据不对

0%