美文网首页
人/狗/码的日常 2021-07-08

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

作者: 启发禅悟 | 来源:发表于2021-07-08 18:52 被阅读0次

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

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

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

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

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

    早上的时间都花费在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博客:阿里云+github+域名+自动部署webhook

    当然这中间自己也添了不少坑,主要是自己服务器的功底不够,所以都是倒推着来测试的,流程大概是这样的:

    首先是git的配置,这个应该没有什么问题
    先确认git已经安装

    git -version
    

    配置github

    git config --global user.name “xxxxxx” # 自行替换
    git config --global user.email “xxxxxx@xx.com” # 自行替换
    

    生成密钥:

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 你的 GitHub邮箱地址
    

    一直enter即可,最后看到密钥的image即可
    此时~/.ssh文件夹下就会生成id_rsa(私有秘钥)和id_rsa.pub(公有密钥),将公钥复制带粘贴板
    进入github->setting->SSH and GPG keys->new SSH key粘贴进入,Title随意取

    完成后测试配置是否成功

    ssh -T git@github.com
    Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.
    

    在服务器端新建一个文件目录存放博客代码

    cd $HOME
    mkdir Blog 
    cd Blog
    git clone git@github.com: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

          本文链接:https://www.haomeiwen.com/subject/fcytpltx.html