人/狗/码的日常 2021-07-08

好好休息,天天向上,继续调整状态。

自从有了昨天进空调房睡午觉的经验之后,今天中午我打算进房间睡觉的时候,酷奇竟然已经提前在空调风口下等着了,真是机灵鬼啊。

然后就是睡的好好的,突然酷奇大叫起来,原来打雷了,呃,打雷没把我打醒,你这是把我弄醒了,好吧,那就起来吧,安抚了他几句,总算不闹腾了。

今天遇到了八楼的柯基姐姐,然后发现柯基姐姐竟然被剃毛了,然后主人大姐还一个劲的推荐我们也去把毛剃了,说狗狗太热了,剃了毛凉快,也不容易招惹虫子。我只能呵呵一笑了。

这里正好科普下,狗狗的毛有隔热,防虫的效果的,所以除非是皮肤病需要剔除,否则不建议剃毛哦。

早上的时间都花费在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上的配置

截屏2021-07-08 下午5.47.07.png

所有的通路就会打开

  • 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执行成功


    截屏2021-07-08 下午6.16.14.png
  • 同时,服务器端,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

你可能感兴趣的:(人/狗/码的日常 2021-07-08)