流程实现
代码提交到码云,通过WebHooks
设置请求到自己的服务器上.
自己服务器上通过webhook执行重构jekyll
.
所需环境
- 个人服务器上的
jekyll
,参考 2017-09-23-jekyll在centeOS安装记录 webhook
- 码云的公开仓库
安装go
实现的一个webhook
部署工具
- 安装
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
. - 安装
git
$ sudo yum install git $ git --version
安装的git版本为
git version 1.8.3.1
- 安装
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
就可以实现自动部署更新啦.
缺点
不支持密码之类的验证
遇到的问题
webhook
执行出错error occurred: fork/exec ./redeploy.shjekyll
详情页面404
原因是请求链接都是没有后缀名的,所以需要静态化.nginx 伪静态,为没有后缀名的url添加html后缀