早就有想要写Blog做些积累的心了,今年终于抄起家伙动手了。作为第一篇有实际意义的博客,就来介绍一下这个博客的搭建过程,以及期间遇到的问题吧。
目标
通过username.github.io访问,将代码Push到GitHub后自动构建并部署博客。
博客架构 & 选择原因
经过了简单的搜索和对比,最后选择了用Markdown编写,Hexo + GitHub Pages + TravisCI 这种模式。
- Markdown - 作为博客编写的主要使用语言。简单易用。
- Hexo - 用来生成静态HTML。简单易用,网上有许多主题供选择。
- GItHub Pages - 提供博客服务。省去了搭建服务的工作,但是也有一个问题就是国内的访问不太友好。
- Travi CI - 提供构建部署服务。Hexo官方推荐~
搭建步骤
安装Hexo的准备
使用以下命令查看Node.js版本
1 | node -v |
使用以下命令查看Git版本
1 | git version |
如果没有安装以下工具请先安装
安装Hexo
确保安装前的准备已经完成,可以使用以下命令安装Hexo
1 | npm install -g hexo-cli |
安装完成后可以使用以下命令查看Hexo版本
1 | hexo -v |
Hexo使用
Hexo的使用可以参照官方文档,这里只介绍必要的功能。
首先创建Hexo项目。这里可以使用博客地址作为项目名。
1 | hexo init "username.github.io" |
安装好后,我们可以使用以下命令来创建新的Blog。这里以”test”为例。
1 | hexo new "test" |
Hexo会帮你在source/_posts文件夹下创建相应的Markdown文件test.md。随后就可以在test.md里写Blog的正文了。
随后,可以使用以下命令开启本地服务。
1 | hexo server |
开启成功后控制台会输出本地服务地址:http://localhost:4000。访问该地址就能进行本地预览。
创建博客主仓库
创建一个”username.github.io”作为仓库名的仓库,username为你的GitHub用户名。README,.ignore什么的都可以不用选。要注意的是一定要使用”username.github.io”来作为仓库名,之后就可以用”username.github.io”来访问你的Blog。
创建好后cd到Blog项目文件夹
初始化git
1 | git init |
创建hexo分支
1 | git checkout -b hexo |
这里把博客工程放入hexo分支是因为GitHub Pages规定,以username.github.io为名字的仓库,在使用GitHub Pages时只能选择master分支作为网页代码的source,也就是说username.github.io只能访问master分支上的网页代码。所以,只能把静态网页代码存放在master上,而源代码则必须放在除master外的其他分支上。
设置博客主仓库的remote
设置博客主仓库的remote为你的username.github.io仓库地址。(一定要用ssh的地址)
1 | git remote set-url origin git@github.com:username/username.github.io.git |
Hexo主题
Fork Hexo主题
在GitHub上fork一份你喜欢的主题,我这里选择了使用最为流行的主题之一next。
选择Fork是因为之后要用到git的submodule来管理主题,这样我们就可以把主题的修改推送到GitHub上。当然,直接选择把主题下载到本地,直接添加到博客主仓库里也可以,但是在之后主题官方有更新时要同步就比较麻烦了。
安装Hexo主题
cd到博客主仓库文件夹,输入以下命令,将仓库地址换成你Fork来的主题仓库地址。
1 | git clone "https://github.com/username/hexo-theme-next" themes/next |
cd到themes/next文件夹,替换主题仓库的remote。
1 | cd themes/next |
这里整这么复杂其实是因为我访问GitHub速度太慢,所以终端挂了HTTP的代理,如果用ssh的方式就没法使用代理了。
clone完成后再切回ssh,这样就能push了。
_config.yml是主题的配置文件,可以根据自己的需要自行修改。
添加主题submodule
cd回到博客主仓库,再添加submodule。
1 | git submodule add https://github.com/username/hexo-theme-next.git themes/next |
这里要注意,添加submodule时一定要用HTTPS的方式,因为之后Travis CI使用时如果用ssh的方式会遇到无权限访问的问题。
Travis CI
配置
这里可以参照Hexo官方文档 - 部署 - GitHub Pages里的教程,这里转述一下。
- 将 Travis CI 添加到你的 GitHub 账户中。
- 前往 GitHub 的 Applications Settings,配置 Travis CI 权限,使其能够访问你的 repository。
- 你应该会被重定向到 Travis CI 的页面。如果没有,请 手动前往。
在浏览器新建一个标签页,前往 GitHub 新建 Personal Access Token,只勾选 repo 的权限并生成一个新的 Token。Token 生成后请复制并保存好。 - 回到 Travis CI,前往你的 repository 的设置页面,在 Environment Variables 下新建一个环境变量,Name 为 GH_TOKEN,Value 为刚才你在 GitHub 生成的 Token。确保 DISPLAY VALUE IN BUILD LOG 保持 不被勾选 避免你的 Token 泄漏。点击 Add 保存。
创建 .travis.yml
在Blog项目文件夹下创建.travis.yml文件,并将以下内容复制进去。
1 | sudo: false |
修改完成后,提交commit,然后
1 | git push origin hexo |
不出意外,一会儿Travis CI就会帮你构建好静态网页并推送到你博客仓库的master分支上了。
期间想查看构建的进度或者报错信息也可以打开Travis CI的管理页查看。
之后有新的Blog或者修改,把代码推送到hexo分支,Travis CI就会帮你构建并发布。
总结一下搭建的过程
- 安装Hexo。
- 创建Hexo项目,添加Blog。
- 新建username.github.com仓库,将Hexo项目的remote设为它,并把源代码放在hexo分支,而不是master分支里。
- 选择GitHub上的Hexo主题,将主题设置为博客仓库的submodule。
- 配置Travis CI。
遇到的问题
Hexo官方教程的坑
Hexo官方教程是以username.github.com这种方式来教学,最后却让我选择Travis CI默认生成的gh-pages分支作为GitHub Pages的source,这违背了GitHub Pages的规则。
在经过了一系列的搜索,找到了Travis CI的GitHub Pages Provider的官方文档。
1 | target_branch: Branch to (force, see: keep_history) push local_dir contents to, defaults to gh-pages. |
通过更改:
1 | branches: |
来达到在hexo分支构建,并将产物推送到master分支的效果。
主题和submodule的问题
主题的存放问题
由于修改了主题且使用了Travis CI,因此肯定要把主题推送到Travis CI能访问的地方,这里刚开始想推到博客主仓库里,但想想还是不妥,之后要是主题有更新就不方便同步了。所以,最后采用了fork + submodule的形式。
NOLAYOUT
最开始使用submodule时,由于经验不足,以为只要在博客主仓库添加进去就好,这导致了Travis CI上hexo一直获取不到主题,报”NOLAYOUT”错误。最后发现是因为Travis CI上的主题submodule没有init导致,遂在.travis.yml里的scripts里,hexo generate
前,添加了git init submodule
。
submodule 无权限访问
起初submodule的URL添加到博客主仓库时用的是ssh的方式,导致Travis CI无权限拉取,最后换成了HTTPS的方式解决了。