技术博客搭建记录

方案概要

jenkins+hexo+内测服务器

我们新建一个仓库用来维护团队博客源文件,然后jenkins实例监测这个仓库的提交记录,在服务器中生成静态博客并且发布。

搭建Jenkins Hexo服务器

这一步,网络有教程,具体搭建省略。

Jenkins hexo没有使用docker镜像,是因为这两个服务需要交互,也就是构建产物要push到hexo的public目录下。所以直接搭建在宿主服务器了,当然可能数据卷可以实现这个交互,太麻烦了。怎么简单怎么来。

启动Hexo

服务器新建一个hexo文件夹用来存放hexo的主题配置和产物目录。

启动命令 hexo s

PS:因为这个静态博客服务需要长期运行所以命令还需要后台挂起

1
2
> setsid  hexo s//保证后台挂起状态
>

以上步骤的前提是,你hexo 完成了初始化,具体的一个项目的初始化,生成,发布等参考文档可以看这里

启动Jenkins 新建构建项目

  • Jenkins完成了搭建安装后,新建一个项目 ,安装一个gitbucket的插件

image

gitbucket 插件是可以检测 gitbucket的提交记录,在gitbucket设置了service hook之后,可以监听仓库提交的时候执行构建。但是。。。我一直配置不成功,所以构建的触发条件改成了定时触发。

  • 配置构建目录

    image

    这里直接把gitbucket的工作目录设置为我们hexo的初始化目录下,后续执行shell脚本就比计较简单

    如果jenkins没有权限,需要把jenkins用户加入root权限用户组

  • 配置gitbucket项目地址和账号

    image

    配置这个,是为了拉取代码输入密码用的~

  • 配置触发条件

    image

    触发的规则是五分钟检查一次,如果有代码变动执行构建

  • 构建脚本

    图片

    构建的脚本很简单,g代表生成,d代表发布。

在线博客地址

博客地址

其他理想方案

gitbucket支持page,也就是自带的hexo的博客服务器功能,但是目前有点问题,这边我也已经搭建进去了

地址这里

可以看到可以加载文字,但是css却找不到,等到解决这个问题,那么方案可以改为gitbucket page+gitbucket CI来完成自动化部署。

后记

这个地址有很多有用的插件用在gitbucket,包括提交记录图表,邮件通知等等或者简单的CI

这边搭建的hexo和jenkins都是我自己的服务器,测试环境其实也有我搭建的Jenkins,点击这里

后续md文件直接放在source 的post目录,仓库地址点这里

再后记

后面发现再新增得内容没有及时发布到hexo服务器中,即便执行了生成部署命令,也还是似乎有缓存在hexo服务器中,并且hexo没有重启服务得命令,于是写了一个shell脚本用来完成一系列事情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
# set -x
function get_pid_by_listened_port(){
[[ $# -lt 1 ]] && { echo 'param error: must have one param(port)'; return -1; }
[[ $# -gt 1 ]] && { echo 'param error: only support one param(port)'; return -1; }
pattern_str="*:$1\\b"
pid=$(ss -n -t -l -p | grep "$pattern_str" | column -t | awk -F ',' '{print $(NF-1)}')
# 当版本号为 "ss utility, iproute2-ss161009" 时, ss 命令输出格式为:
# LISTEN 0 5 *:8000 *:* users:(("python2.7",pid=7130,fd=3))
# 此时需要进一步处理, 只获取进程 PID 值.
[[ $pid =~ "pid" ]] && pid=$(echo $pid | awk -F '=' '{print $NF}')
echo $pid
}
function kill_pid_by_listened_port() {
pid=$(get_pid_by_listened_port $1)
[[ -n "$pid" ]] && { echo "find pid: $pid, kill it..."; kill $pid; }
[[ -n "$pid" ]] || { echo "not found listened port: $1"; }
}
kill_pid_by_listened_port 4001
hexo g -d
nohup hexo -p 4001 s &

看出,是根据端口找到pid并且杀死pid进程,然后再以后台挂起得形式启动hexo服务

最后,如果这个脚本执行有毛病。那就指定bash去执行它

1
bash ./hexorestart.sh