简单了解了一下现有的自建博客,主流是在自己的服务器或者 PaaS 平台中搭建运行 WordPress、Typecho 等 PHP 博客
系统。前几年前端开发火起来后,又有使用 Node.js 等技术开发各类博客系统,其中静态博客系统因为其不依赖
数据库、执行环境,有响应快、成本低且较难被侵入的优势,还可以在免费的页面托管服务上搭建博客。
最终我选择从零开始在 GitHub Pages 托管服务上搭建一个 Hexo 博客系统,在进行搭建开始前,你需要先准备的工作:
- 拥有自己的 GitHub 帐号;
- 安装 Node.js 和 NPM(也可以使用其它包管理,本文以 NPM 为例);
- 安装 Git
- 创建一个名为
[自己的 GitHub 名字].github.io
的仓库。
安装 Hexo
打开终端,运行下列命令安装 Hexo 命令行工具:
1 | npm i -g hexo-cli |
新建 Hexo 博客
在自己存放代码的目录中执行新建命令:
1 | hexo init [博客文件夹名] |
例如我输入的是 ringoblog
,执行完毕后可以 cd ringoblog
进入刚刚创建好的博客文件夹,可以看到 Hexo 自动生成了很多文件和文件夹用来存放博客配置和页面数据:
1 | . |
了解详情可跳转至 Hexo 官方文档查看:hexo.io/zh-cn/docs/setup
完成新建之后,在 _config.yml
修改博客一些必要的基本参数:
title
: 博客标题author
: 博客作者名称language
: 语言,支持的语言取决于当前使用的主题timezone
: 时区,中国可以填Asia/Shanghai
url
: 博客地址,本例使用 GitHub Pages 应填[自己的 GitHub 名字].github.io
要想看到预览效果,可以在博客项目目录内执行下列命令启动 Hexo 演示服务器:
1 | hexo server |
也可以生成静态文件然后用浏览器直接打开预览:
1 | hexo generate |
第一次的手动部署
完成一次 GitHub Pages 页面部署,你需要安装 Git 并掌握一些基本使用方法。
在博客目录下进行初始化:
1 | git init |
但不要立即将文件提交到 master
分支,因为 GitHub 要求用户页面的仓库([用户名].github.io
) 只能以 master
分支作为 Pages 页面存放的分支。
我们的代码在生成前只是一些仅对开发者可读的文档、配置,没有 index.html 入口,我们可以命名一个新分支为 raw
(自由选择),在上面完成初始化后执行下行代码创建新分支:
1 | git checkout -b raw |
随后将我们的内容提交到 raw
分支并 Push 到在线仓库:
1 | # Commit all files |
此时因为 master
分支还是空的,我推荐使用 Hexo 的 Git 部署插件来完成 “生成-复制-提交” 这一系列部署步骤。
首先通过 NPM 安装插件:
1 | npm i hexo-deployer-git |
随后打开项目根目录下的 _config.yml
来配置我们的部署选项,默认生成的配置文件有 deploy
的键,注意不要写重复了:
1 | # Deployment |
这一段的意思就是,执行 hexo deploy
命令时,将会使用 hexo-deployer-git
插件来部署生成好的博客页面到指定的 Git 仓库,并且推送到 master
分支中, repo
为自己的实际仓库地址。
使用 SSH 方式推送需要事先配置好 SSH 密钥,具体不多介绍。
一切就绪之后,执行下列代码进行一键部署:
1 | hexo generate && hexo deploy |
终端提示成功后,查看我们远端的 master
分支是否已经有页面文件,然后打开 [用户名].github.io
来查看效果。
现在我的这个博客就是通过本文教程步骤完成搭建:rin9o.github.io
配置 GitHub Actions 完成自动部署
GitHub Actions 也是一种免费的 CI/CD 服务,对开源项目是完全免费,测试期间私有项目免费,这篇文章最后一次更新时还在 Beta 阶段,第一次使用要在 github.com/features/actions 申请加入 Beta 计划。
GitHub Actions 允许开发者将自己写好的脚本发布到公共 Marketplace 中,方便其他人使用,GitHub 官方也提供了一些 Actions,源码存放在:github.com/actions
首先,我们在自己的博客目录下创建 .github/workflow
目录,然后在该目录下创建一个文件命名为 deploy.yml
。
复制以下内容粘贴到里面:
1 | name: Deploy GitHub Pages on push event |
简单解释一下这段 YAML 的意思是:
- 当
raw
分支有 Push 操作时,开始执行这个 Action,包含一个 build 工作- 这个 build 工作在
ubuntu-18.04
系统环境下执行,包含以下步骤- 使用 GitHub 中的
actions/checkout@v1
在环境中 Checkout Git 默认分支的代码 - 使用 GitHub 中的
actions/setup-node@v1
初始化10.x
版本的 Node.js - 从 NPM 安装依赖
- 准备构建环境,从仓库 Secret 中获取
GH_ACTION_DEPLOY_KEY
作为环境变量,将部署用的 SSH 私钥保存在运行环境中以便后续 Commit 用。 - 执行 Hexo 命令行工具生成并部署到 Git,这一步执行等于我们前面的手动部署
- 使用 GitHub 中的
- 这个 build 工作在
检查是否需要根据自己需求修改 Action 内容,提交改动之后,先别急着 Push 到 GitHub 上,我们还有一些工作要做:
上面的 Action 流程依赖了仓库 Secret 中的 GH_ACTION_DEPLOY_KEY
键来获取 SSH 密钥内容,我们需要将拥有对博客远端仓库拥有写入权限的 SSH 私钥填到仓库 Settings - Secrets 中,点击“Add a new secret”添加一个名为 GH_ACTION_DEPLOY_KEY
的数据,然后将私钥数据粘贴到 Value 中保存。
因为 Action 运行环境是由 GitHub 提供,而且第三方的脚本可能存在风险,这一步我建议新建一个专门用于提交博客仓库的 SSH 密钥而不是使用帐户在用的密钥,创建好新的密钥后,将公钥添加到仓库 Settings - Deploy keys 中(记得勾上 Push 权限)。
添加完密钥后,就可以 Push 这一次在 raw
分支上添加 GitHub Actions Workflow
的改动了。
完成 Push 后,你应该就能在自己仓库的 Actions 页看到自动执行的 Workflow 记录。
例如我的博客执行记录:Actions - rin9o.github.io
总结
Hexo 博客搭建起来还是比较简单的,编写文章需要学习一下 Markdown 语法,配合一个带预览甚至是可见即可得的编辑器,体验也是非常不错的,只是如果在手机上编写提交文章的话配置 Git 和 Node.js 环境会比较麻烦。
通过 CI 服务自动构建 Hexo 博客的静态页面已经减少了每次提交文章时部署的麻烦,正好 GitHub Actions 语法比较简洁而且也是对开源项目免费,看了一下执行记录平均时长只需 45 秒,提交源码后很快就能查看到在线效果。
另外感谢一位不愿透露姓名的童鞋帮我检查了代码上的笔误,自己花了很多时间没看出来的问题给他一眼就看出来了~