流程实现

代码提交到码云,通过WebHooks设置请求到自己的服务器上. 自己服务器上通过webhook执行重构jekyll.

所需环境

  1. 个人服务器上的jekyll,参考 2017-09-23-jekyll在centeOS安装记录
  2. webhook
  3. 码云的公开仓库

安装go实现的一个webhook部署工具

  1. 安装go
    $ wget https://storage.googleapis.com/golang/go1.9.src.tar.gz
    $ sudo tar -C /usr/local -xzf go1.9.src.tar.gz
    $ vim /etc/profile
    

    /etc/profile中添加export PATH=$PATH:/usr/local/go/bin 然后执行go version查看版本.安装完成后版本信息为go version go1.9 linux/amd64.

  2. 安装git
    $ sudo yum install git
    $ git --version
    

    安装的git版本为git version 1.8.3.1

  3. 安装webhook 如果本地有代理,可以穿墙的话,可以按照说明做: 参考
    $ go get github.com/adnanh/webhook
    

    对于无法翻墙的小伙伴: 前往release tags下载

    $ wget https://github.com/adnanh/webhook/releases/download/2.6.5/webhook-linux-amd64.tar.gz
    $ tar -zxvf webhook-linux-amd64.tar.gz
    $ cd webhook-linux-amd64
    $ ./webhook -version
    

    安装的版本为webhook version 2.6.5 测试:

    $ cd webhook-linux-amd64
    $ vim hooks.json
    

    hooks.json中写入:

    [
      {
     "id": "redeploy-webhook",
     "execute-command": "./redeploy.sh",
     "command-working-directory": "./"
      }
    ]
    

    在当前路径添加文件redeploy.sh 启动

    $ ./webhook -hooks hooks.json -verbose
    [webhook] 2017/09/23 13:54:20 version 2.6.5 starting
    [webhook] 2017/09/23 13:54:20 setting up os signal watcher
    [webhook] 2017/09/23 13:54:20 attempting to load hooks from hooks.json
    [webhook] 2017/09/23 13:54:20 found 1 hook(s) in file
    [webhook] 2017/09/23 13:54:20   loaded: redeploy-webhook
    [webhook] 2017/09/23 13:54:20 serving hooks on http://0.0.0.0:9000/hooks/{id}
    

    测试 curl http://0.0.0.0:9000/hooks/redeploy-webhook 成功日志:

    [webhook] 2017/09/23 15:58:06 redeploy-webhook got matched
    [webhook] 2017/09/23 15:58:06 redeploy-webhook hook triggered successfully
    [webhook] 2017/09/23 15:58:06 200 | 111.582µs | 0.0.0.0:9000 | GET /hooks/redeploy-webhook 
    [webhook] 2017/09/23 15:58:06 executing ./redeploy.sh (./redeploy.sh) with arguments ["./redeploy.sh"] and environment [] using ./ as cwd
    [webhook] 2017/09/23 15:58:06 command output: success
    [webhook] 2017/09/23 15:58:06 finished handling redeploy-webhook
    

现在可以修改需要执行的脚本了

当有webhook请求过来,执行一下git clone 获取源码,然后通过jekyll进行编译 示例:

#!/bin/sh
echo 'start deploy ...'
GIT_REPO=https://gitee.com/eoekun/eoekun.git
TMP_GIT_CLONE=$HOME/tmp/eoekun-blog
PUBLIC_WWW=/data/blog/jekyll
mkdir -p $TMP_GIT_CLONE
git clone $GIT_REPO $TMP_GIT_CLONE
cd $TMP_GIT_CLONE && jekyll build $TMP_GIT_CLONE -d $PUBLIC_WWW
cd ~ && rm -rf $TMP_GIT_CLONE
exit

脚本参考Gitolite实现hook,Jekyll自动构建发布. 我的是用的nginx作为服务器的,配置如下:

server {
    listen 80;
    server_name eoekun.top;
    access_log  logs/jekyll-blog.access.log  main;
    location / {
	    if (!-e $request_filename){
	        rewrite ^(.*)$ /$1.html last;
	        break;
	    }
       root /data/blog/jekyll;
       index index.html;
    }
}

结束

webhook需要在后台运行,才能够监听到hooks 执行如下命令即可:

./webhook -hooks hooks.json -verbose >> ./start.log 2>&1 &

日志会打印到start.log中 最后在gitee的对应代码仓库的设置中设置好hooks就可以实现自动部署更新啦.

缺点

不支持密码之类的验证

遇到的问题

  1. webhook执行出错error occurred: fork/exec ./redeploy.sh
  2. jekyll详情页面404原因是请求链接都是没有后缀名的,所以需要静态化.nginx 伪静态,为没有后缀名的url添加html后缀