人
好好休息,天天向上,继续调整状态。
狗
自从有了昨天进空调房睡午觉的经验之后,今天中午我打算进房间睡觉的时候,酷奇竟然已经提前在空调风口下等着了,真是机灵鬼啊。
然后就是睡的好好的,突然酷奇大叫起来,原来打雷了,呃,打雷没把我打醒,你这是把我弄醒了,好吧,那就起来吧,安抚了他几句,总算不闹腾了。
今天遇到了八楼的柯基姐姐,然后发现柯基姐姐竟然被剃毛了,然后主人大姐还一个劲的推荐我们也去把毛剃了,说狗狗太热了,剃了毛凉快,也不容易招惹虫子。我只能呵呵一笑了。
这里正好科普下,狗狗的毛有隔热,防虫的效果的,所以除非是皮肤病需要剔除,否则不建议剃毛哦。
码
早上的时间都花费在hexo如何自动部署到自己的服务器了。
之前用hexo+github搞了一个博客,不过有今年没有更新了。正好,隐私政策/用户协议这些放在上不太合适,所以就决定把这些内容放到自己的网站上去。
hexo+github的环境是OK的。所以,现在新发布一篇博客是非常容易的。
博客本地的开发目录在:/Users/xuefengchen/inspirelifedaily/
那么新建一篇博客并发布大致就是如下:
cd /Users/xuefengchen/inspirelifedaily/inspirelife96.github.io
hexo new '文件名,不用包含后缀MD' // 创建文件,然后编辑
hexo g // 生成
hexo d // 部署
那么访问inspirelife96.github.io自然能查看到更新后的内容。
不过服务器上并没有更新,由于之前没有做自动部署,每次都是手动更新的。
大致的思路就是,在服务器端,重新下载github的网站的代码。
cd /home/inspirelife/blog
git clone https://github.com/Inspirelife96/inspirelife96.github.io.git
rm -rf ./blog
sudo cp -r inspirelife96.github.io/* ./public/
nginx的配置在这里,目前http都直接转https,https的root设置了/home/inspirelife/blog/public
cd /etc/nginx/sites-enabled/default
今天尝试做的就是利用github的webhook实现自动部署。
原理很简单。
首先我们看最终的目的:就是每当客户端执行hexo -d之后,提交所有的修改到Github,而服务器端的仓库能够执行git pull来自动更新。而工具就是github提供的webhook。
github提供的webhook原理上就是当接受到一个push之后,去触发某一个URL调用。
所以服务器这边需要提供一个URL调用的服务,而这个服务最终是要调用git pull来实现代码的自动更新。
//webhook.js
var http = require('http')
var createHandler = require('/usr/lib/node_modules/github-webhook-handler')
var handler = createHandler({ path: '/', secret: '226713' })
function run_cmd(cmd, args, callback) {
var spawn = require('child_process').spawn;
var child = spawn(cmd, args);
var resp = "";
child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
child.stdout.on('end', function() { callback (resp) });
}
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)
handler.on('error', function (err) {
console.error('Error:', err.message)
})
handler.on('push', function (event) {
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
run_cmd('sh', ['./deploy.sh',event.payload.repository.name], function(text){ console.log(text) });
})
这段代码的意思,大致就是创建了一个http://inspirelife2017.com:7777的服务,当为push时,执行当前目录下deploy.sh的脚本。
来看看deploy.sh的脚本
#!/bin/bash
# 网站的根目录
WEB_PATH='/home/inspirelife/blog/inspirelife96.github.io'
echo "start deployment"
cd $WEB_PATH
echo $(pwd) echo $(date) echo $(whoami)
echo "fetching from remote..."
#echo $(git fetch --all)
#echo $(git reset --hard origin/master)
echo $(git pull)
echo "done"
目的也很明确,就是到/home/inspirelife/blog/inspirelife96.github.io的目录下,执行git pull命令更新仓库。
所以,当服务器端执行 node webhook.js
激活服务之后,再配上Github上的配置
所有的通路就会打开
- hexo -d部署到github
- github触发webhook,调用http://inspirelife2017.com:7777
- 服务器端,接受到http://inspirelife2017.com:7777的调用,判断类型为Push,调用deploy.sh脚本。
- 执行脚本,调用git pull更新服务器端仓库,此时网站的最新内容得到更新。
具体如何配置,可以参考这篇文章的服务器配置部分搭建hexo博客:阿里云+github+域名+自动部署webhook
当然这中间自己也添了不少坑,主要是自己服务器的功底不够,所以都是倒推着来测试的,流程大概是这样的:
首先是git的配置,这个应该没有什么问题
先确认git已经安装
git -version
配置github
git config --global user.name “xxxxxx” # 自行替换
git config --global user.email “[email protected]” # 自行替换
生成密钥:
ssh-keygen -t rsa -b 4096 -C "[email protected]" # 你的 GitHub邮箱地址
一直enter即可,最后看到密钥的image即可
此时~/.ssh文件夹下就会生成id_rsa(私有秘钥)和id_rsa.pub(公有密钥),将公钥复制带粘贴板
进入github->setting->SSH and GPG keys->new SSH key粘贴进入,Title随意取
完成后测试配置是否成功
ssh -T [email protected]
Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.
在服务器端新建一个文件目录存放博客代码
cd $HOME
mkdir Blog
cd Blog
git clone [email protected]:yourname/hexo.git # 自行替换为用于存放博客代码的仓库ssh地址
Nginx的配置目录
/etc/nginx/sites-enabled/
在配置文件中,需要将root设置为刚git clone的目录,例如
server {
listen 443;
server_name inspirelife2017.com;
root /home/inspirelife/blog/inspirelife96.github.io;
index index.html index.htm;
ssl on;
# Use certificate and key provided by Let's Encrypt:
ssl_certificate /etc/letsencrypt/live/inspirelife2017.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/inspirelife2017.com/privkey.pem;
...
修改完后需要重启nginx
sudo service nginx stop
sudo service nginx start
调试的过程
- 服务器端确认git pull能够执行成功
- 服务器端确认执行 . deply.sh能够成功更新仓库
- 服务器端执行 node webhook.js,
- 客户端执行下面脚本,触发webhook
hexo new '文件名,不用包含后缀MD' // 创建文件,然后编辑
hexo g // 生成
hexo d // 部署
-
确认github仓库对应的setting/webhook中,对应的Deliveries执行成功
- 同时,服务器端,node执行界面会出现相应的log内容
最后再考虑PM2的问题
pm2 start webhook.js
这边今天遇到一个大坑,执行pm2失败,看上去是权限问题,所以我就简单的用了
sudo pm2 start webhook.js
pm2执行成功,且deply.sh也执行了,唯独奇怪的是,git pull执行之后没有反应,服务器端端仓库并没有更新。
这个问题花费了我大概一个小时,也没查出来是啥原因。
后面是重启了服务器
就执行成功了。
所以,如果有奇怪的问题,或许重启也是一种解决方案。
此外,如果遇到类似这种github无法访问的问题,再尝试几次吧,多数是网络的问题。
Error: fatal: 无法访问 'https://github.com/xxxxx/':LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 60