记使用 GitHub Actions 构建博客的一个奇怪问题

因为疫情的原因闲在家里实在无聊,抱着折腾的心态给博客换到 GitHub Actions 来自动构建了。

但在这个折腾过程中发现了一个奇怪的问题,差点使我放弃 GitHub Actions 换回 Travis CI 了,所幸最后找到了导致问题的原因并成功解决了,在这里记录一下。

问题描述

最开始发现的问题是文章“博客正式启用 Travis CI 自动部署”从标题点进去之后打开的是另一篇文章的页面。

分析发现这篇文章的页面文件根本没有生成出来,文章列表中这一标题所绑定的链接直接就是另一篇文章的,正常情况下应该是 /2019/826-1.html,但在这里却变成了 /2019/825-1.html

由于我订阅了自己博客的 RSS,在测试时通过 RSS 发现还有两篇文章的链接也发生了改变,一篇由 2019/619-1.html 变成了 2019/618-1.html,另一篇由 2020/103-1.html 变成了 2020/102-1.html

问题分析

我的博客文章链接是按 :year/:i_month:day-:id.html 的格式组织的,从上面的问题描述中不难发现所有出问题的文章都是“日期”往前推移了一天。

进一步检查这些出问题的文章的源文件,发现发布时间基本都是凌晨,这很容易让我们联想到时区问题。

由于我在提交到 GitHub Pages 仓库的 commit 信息中包含了本次提交的时间,所以可以查看一下提交记录来确认当前时区(下图第一行是我解决问题后的提交记录,第二行是解决问题之前的),注意到该时间比北京时间早了 8 小时,基本能确定 CI 在提交 commit 信息时的时区不是北京时间所用的时区(Asia/Shanghai)。

然而比较诡异的一点是,我的 GitHub Actions 配置文件是对照 之前 Travis CI 的配置文件 改的,整个 build 流程包括 7 个步骤(steps),依次是检出代码、设置 node 环境、设置时区、安装依赖、生成文件、执行 gulp 任务、部署博客。可以看到,我是有设置时区的,对应 step 的配置如下:

1
2
- name: Set time zone
run: export TZ='Asia/Shanghai'

现在的问题就是我们设置了时区,但是这一设置在“部署博客”(commit 信息是在这一步提交的)这个 step 中并没有生效,进一步推测,在“生成文件”这一 step 中时区设置是否也没有生效呢?

解决问题

经过多次测试总结,发现问题确实是由于当前环境时区和 Hexo 配置文件中设置的时区不一致导致的。

而对于上述设置了时区却没有生效的情况,个人怀疑是由于 GitHub Actions 的每个 step 互相独立导致的,在 step 中设置的环境变量可能仅在当前 step 有效。

已确认上述时区设置没有生效的情况是由于环境变量作用域导致的,在 step 中设置的环境变量仅在当前 step 中有效。话说我为什么要用 export 来设置环境变量啊?GitHub Actions 有 env 参数的啊!!!

详情参考:https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#env

GitHub Actions 文档对 env 参数的说明

原解决方案已废弃,现在采用的办法是在配置文件中添加一个全局的 env 参数来设置时区环境变量:

1
2
env:
TZ: Asia/Shanghai

本博客使用的完整 GitHub Actions 配置文件可移步 使用 GitHub Actions 自动构建 Hexo 博客 查看。