Hugo是一个用Go语言编写的静态站点生成器,运行速度快,而且拥有相当丰富的主题。本博客就是基于hugo搭建,使用 hugo-thme-jane 主题,部署于阿里云。发布博客一般本地编辑好博客文章,然后部署到服务器上,本人是使用webhook实现的自动化部署。

快速搭建

安装hugo

使用Homebrew安装hugo,Mac用户安装 Homebrew ,Linux用户可以参考 Homebrew-on-Linux

1
brew install hugo

创建博客

创建博客站点很简单,直接运行 hugo new site kxcsblog 即生成站点目录。生成的站点目录结构如下:

1
2
3
4
5
6
7
8
9
kxcsblog/
├── archetypes
   └── default.md
├── config.toml
├── content
├── data
├── layouts
├── static
└── themes

设置主题

本博客使用的主题为 hugo-thme-jane,到themes目录,将主题clone到该目录。

1
2
cd themes
git clone https://github.com/xianmin/hugo-theme-jane.git jane

创建文章

hugo使用Markdown作为书写标记语言,然后将Markdown渲染成html。下面的命令将在content/post/目录下生成 welcome.md 文件,编辑该文件输入您的内容。

1
hugo new post/welcome.md

测试博客

使用 hugo server 就会在本地 1313 端口起一个 http server,浏览器打开 http://localhost:1313 就能看到自己博客的效果。

博客部署

一般书写博客都是在本地编辑完成,然后部署到服务器。这里介绍使用github webhooks来实现网站的自动化部署。

  1. 在github新建一个repo,将博客目录托管到github,代码仓库可以为private。
  2. 在服务器上运行一个接收webhooks的服务,这里我是用golang写的,使用的第三方webhooks library,参考下面的代码,比较简单。
  3. 在github kxcsblog 仓库添加webhooks,本人设置的只监听push event,这样当有更新push到仓库时,github将发送POST请求到webhooks提供的url地址,如下图。
  4. 服务器上运行的服务接收到webhooks事件,从github pull最新代码,执行hugo生成最新的博客页面。
  5. hugo生成的页面位于public目录,将该目录的内容copy到nginx server location即可,或者直接从nginx server location 建一个软连接到public目录。
  6. 验证,下图Recent Deliveries是github webhooks发送结果,可以看到已经正确返回。

github-webhooks.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func main() {
    hook, _ := github.New(github.Options.Secret("MyGitHubSuperSecretSecrect..."))

    http.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
        payload, err := hook.Parse(r, github.PushEvent)
        if err != nil {
            if err == github.ErrEventNotFound {
                // ok event wasn;t one of the ones asked to be parsed
            }
        }
        switch payload.(type) {

        case github.PushPayload:
            push := payload.(github.PushPayload)
            fullname := push.Repository.FullName
            // deploy()部署博客,启动 exec 启动 ./deploy.sh (git pull, hugo)
            result := deploy()
            log.Info("deploy %s result:\n%s", fullname, result)
        }
    })
    http.ListenAndServe(":3111", nil)
}

webhooks-deliveries.png

参考

使用 Hugo 快速搭建个人博客记录

https://github.com/go-playground/webhooks

以上,欢迎学习交流 lzhujian#gmail.com