搭建jekyll博客

搭建jekyll博客,并实现自动化创建发布流程

Posted on 2019-02-06

配置server

搭建 jekyll 博客前,你需要拥有一台自有的server。我目前使用的是腾讯云。 对于这台server,你可以通过 ssh username@ip并输入密码的的形式去登录。但每次都需要这样不免繁琐。所以首先需要做的就是配置ssh的免密登录。

在配置免密登录前你需要在本地生成秘钥和私钥, 使用如下命令

$ cd ~/.ssh
$ ssh-keygen -t rsa

之后会让你输入文件名,默认是id_rsa,如果你的本机有此文件了,为了不影响连接其他的server,你可以起另一个名字,我这里叫做tx_rsa, 之后一路回车,会在你的/Users/username/.ssh目录下会生产两个文件tx_rsatx_rsa.pub

$ cat tx_rsa.pub

查看公钥文件的内容并拷贝到下图所示区域

完成后并绑定到已有的server,在本地通过下面的命令去测试

$ ssh -i ~/.ssh/tx_rsa username@ip

虽然免除了输入密码的这一过程,但每次却需要指定秘钥的形式,却也很麻烦。 为了解决这个问题我们可以在.ssh目录下创建一个config文件

$ vi config

写入如下内容

HOST tx
HostName your server ip
User root
IdentityFile ~/.ssh/tx_rsa

这时便可以通过 ssh tx去登录server了,当然config文件里也可以写其他server的配置

server配置

依次执行以下的命令

$ ssh tx # 进入server
$ cd /opt
$ mkdir bnotes.git
$ cd bnotes.git
$ git --bare init
$ cd hooks #进入git钩子脚本目录
$ touch post-receive #创建post-receive
$ chmod +x post-receive #增加可执行权限

post-receive文件是当接收到git提交的数据后会执行的钩子脚本,接下来需要编辑该文件。

$ vi post-receive #编辑post-receive文件

内容如下, 具体信息请看注释

#! /bin/bash
echo "接收到提交"
GIT_REPO=/opt/bnotes.git # git仓库地址
TMP_GIT_CLONE=/tmp/bnotes # git clone的暂存地址
PUBLIC_WWW=/srv/bnotes # 发布的地址

git clone $GIT_REPO $TMP_GIT_CLONE
jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW
rm -rf $TMP_GIT_CLONE
exit

执行 jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW 可能会出错,需要你在server上安装jekyll

完成上述内容后就可以配置nginx

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /srv/bnotes;
        index  index.html;
    }
}

重新加载 nginx

$ nginx -s reload

本地配置

在本地,首先就是需要从serverclone自己创建的仓库

$ git clone tx:/opt/bnotes.git

之后根据jekyll官网的步骤去创建我们的博客网站

$ gem install bundler jekyll
$ jekyll new my-awesome-site

完成后,拷贝文件夹my-awesome-site的内容到克隆下来的仓库中后提交git

$ cd bnotes
$ git add .
$ git commit -m 'publish'
$ git push

此时通过你server的ip和或者网站的域名访问就可以看到网站内容了

自动化

自动化的过程主要是依据nodejs实现

$ cd bnotes
$ mkdir script

在script文件夹中加入两个文件 newdeploay,内容如下, 当然实现这个流程,你本地还需要安装个nodejs

new文件内容如下:

#! /usr/bin/env node

const fs = require('fs')
const exec = require('child_process').exec
let title = process.argv[2]
// 当前日期格式化
let today = new Date()
let day = today.getDate()
let month = today.getMonth() + 1
let year = today.getFullYear()
if (day < 10) {
  day = '0' + day
} 
if (month < 10) {
  month = '0' + month
} 
today = year + '-' + month + '-' + day

// 文件模板
let template = `---
layout: post
title: ${title}
subtitle: ${title}
date: ${today}
author: "lybenson"
header-img: "img/home-bg.png"
---
`
let file_path = `./_posts/${today}-${title}.md`
// 创建文件
fs.appendFile(file_path, template, function (e) {
  if (e) {
    console.error('创建失败')
  }
})
// 打开文件 (此处我使用的是 Typora markdown软件打开)
const command = `open -a Typora ${file_path}`
exec(command, function(err, stdout, stderr) {
  if (err) throw err
})

deploy文件内容如下:

#! /usr/bin/env node
const exec = require('child_process').exec
const commands = `git add . && git commit -m 'blog' && git push`
exec(commands, function(err, stdout, stderr) {
  console.log(err)
  if (err) throw err
})

有了这两个文件后,在package.json文件加入bin字段

{
    "name": "xx",
    "title": "xxx",
    "version": "1.0.0",
    "author": "xxx",
    "scripts": {
        ....
    },
    "bin": {
        "new": "script/new",
        "deploy": "script/deploy"
    }
}

之后执行npm link命令

这时候我们就可以通过下面的命令去创建一篇博客

$ new "博客名称"

之后会打开 Typora 或者是你指定的其他的编辑软件 编辑好之后通过deploy命令发布即可