博客自定义域名-为什么CNAME内容消失了
文章目录
现象是这样的:在static目录下新建了一个CNAME
文件,并填写了域名blog.l-qiang.xyz
。但是,使用Git将更改push到Github之后,发现gh-pages分支下的CNAME
的内容为空,blog.l-qiang.xyz
竟然消失了!!!
关于博客相关搭建的教程,见:
起因
之前博客一直使用的l-qiang.github.io,前段时间在NameSilo整了个域名l-qiang.xyz
,之前没整是因为阿里云太贵了。
然后,Github Pages设置域名的时候直接在界面上设置的。(ps:设置完其实就是在gh-pages分支的根目录添加了一个CNAME文件,内容就是你设置的域名)
今天早上访问博客的时候发现404了,然后上Github上一看,域名设置被清空了。
出现这个现象的原因是:gh-pages
分支的内容都是通过Wercker
生成的,所以,每次更新博客,CNAME就被干掉了。
但是,我不能每次更新博客都要重新设置域名吧,所以,我需要CNAME
文件也被Github托管起来。在Hugo的文档中,可以看到相关说明。
If you’d like to use a custom domain for your GitHub Pages site, create a file
static/CNAME
. Your custom domain name should be the only contents insideCNAME
. Since it’s insidestatic
, the published site will contain the CNAME file at the root of the published site, which is a requirement of GitHub Pages.
所以,我在static下创建了CNAME
文件且在里面写上了blog.l-qiang.xyz
。然后问题就出现了。
定位问题
CNAME
文件提交到Github上后,在main
分支的CNAME
文件中是有内容的,所以问题就出在Wercker
部署这一步。那么我就重点看wercker.yml
。
|
|
首先,我们在本地使用hugo进行build
肯定是没有问题的。所以问题出在deploy
这一部分,这部分就两个步骤。
install-packages
这是安装软件包。
这是wercker的Step store里面的步骤。所以出问题的原因,极有可能是这一步。
将lukevivier/gh-pages@0.2.1
的源码下载下来。
源码很简单,总共包含4个文件:
- README.md
- run.sh
- step.yml
- wercker-step.yml
从Wercker的文档Creating Steps中可以了解到,我重点需要关注的就是run.sh
和step.yml
run.sh
内容如下:
|
|
从上面的脚本中可以看到,这一段:
|
|
如果$WERCKER_GH_PAGES_DOMAIN
的字符串长度不为0,那么将会把$WERCKER_GH_PAGES_DOMAIN
写到CNAME
。
那么,$WERCKER_GH_PAGES_DOMAIN
这个变量哪来的呢?先看step.yml
。
step.yml
内容如下:
|
|
从官方文档对properties的解释了解到。
The
properties
field contains metadata describing the parameters that are available for the step. This is a map; the key is the name of the step, and the value is a object with the following properties:
name
- the name of the propertytype
- the type of the data of the parameter. Currently supported:string
.required
- boolean indicating if the parameter is required or not (currently not enforced).default
- value that gets used, if no parameter was provided through thewercker.yml
上面的properties
为空,所以参数都是从wercker.yml
提供的。
|
|
我这里提供了两个参数,根据官方文档会生成两个环境变量,WERCKER_GH_PAGES_BASEDIR
和WERCKER_GH_PAGES_TOKEN
。这对应了上面run.sh
中的WERCKER_GH_PAGES_
开头的变量。但是上面是没有配置domain
。所以WERCKER_GH_PAGES_DOMAIN
变量是不存在的。
那么,if [ -n $WERCKER_GH_PAGES_DOMAIN ]
应该不成立,不生成CNAME
才对呀。
咋一看,确实。
但是,如果$WERCKER_GH_PAGES_DOMAIN
不存在。那么if [ -n $WERCKER_GH_PAGES_DOMAIN ]
会变成if [ -n ]
,这会造成这个判断始终为true;
所以,如果在wercker.yml
中的lukevivier/gh-pages@0.2.1
没有配置domain
,那么CNAME
始终是空的,且覆盖了build之后的我们在static下的CNAME
文件。
解决办法
其中一种解决办法其实从上面已经知道了。
lukevivier/gh-pages@0.2.1
添加domain
为自定义域名。static
下添加CNAME
,但是不要使用lukevivier/gh-pages@0.2.1
。可以换一个steps,
Step store
有很多gh-pages步骤。修改
lukevivier/gh-pages@0.2.1
的代码,生成自己的步骤。只要修改
if [ -n $WERCKER_GH_PAGES_DOMAIN ]
为if [ -n "$WERCKER_GH_PAGES_DOMAIN" ]
即可。这就是告诉我们为什么要在变量外加双引号的原因。
注意
2022.11.03: 此时Wercker已经停服了,所以此文所述问题已经不复存在