zoukankan      html  css  js  c++  java
  • 使用webhook实现博客网站自动化部署

    接上文:传送门

    在使用hugo + nginx搭建好博客后,文章可以通过ftp上传到服务器,然后在服务器上再编译成网页,或者本地搭建的hugo环境,编译好网页再上传到服务器,这样做虽然也可以,但是很麻烦,如果每次都这么发布文章,肯定玩几次就不想弄了。

    使用webhook就能实现自动部署,其实原理很简单。理想状态就是我把我的myblog项目托管到github,然后每次我写完文章直接push到github仓库,webhook监听到我的push,给我的服务器发送一个http请求,服务器收到请求后执行本地shell脚本,自动拉取最新的仓库代码,然后执行hugo编译成网页。这样就实现自动部署啦!

    项目代码托管到github

    在常用的本地机器上安装git,myblog 目录作为 git 仓库,push 到 github 进行备份。由于 public 目录下的静态网页完全可由其余文件自动生成,因此仓库可以排除 public 目录。

    touch .gitignore && echo "/public" >> .gitignore
    git add .
    git commit -m "初次提交"
    git branch -m main
    git push -u origin main
    

    服务器安装node

    使用node可以很简单的启动一个web服务

    选择node版本

    node安装依次执行以下命令:

    cd ~
    wget https://nodejs.org/dist/v14.17.3/node-v14.17.3-linux-x64.tar.xz
    tar -xvf node-v14.17.3-linux-x64.tar.xz
    cd node-v14.17.3-linux-x64/bin
    ln -s /root/node-v14.17.3-linux-x64/bin/node /usr/bin/
    ln -s /root/node-v14.17.3-linux-x64/bin/npm /usr/bin/
    

    我是centos系统,直接安装编译好的二进制文件了,之前试过自己编译,要等好久就放弃了

    安装完后可以执行以下命令检查:

    node -v
    npm -v
    

    正确输出版本号即可

    npm安装成功后,再安装一下pm2,安装后管理进程十分好用

    npm install pm2@latest -g
    ln -s /root/node-v14.17.3-linux-x64/bin/pm2 /usr/bin/
    

    执行命令查看是否安装成功

    pm2 -v
    

    配置脚本

    新建一个目录webhook,脚本文件放在这里

    编写shell脚本

    cd ~
    mkdir webhook
    cd webhook
    touch hugo-deploy.sh
    vi hugo-deloy.sh
    

    按i进入编辑模式,我的脚本如下(我的仓库就是myblog,然后hugo生成的静态文件就在~/myblog/public下,也是我的网站根目录。如果网站根目录不在这里,hugo也可以指定生成的目录,使用hugo -d /dir

    #!/bin/bash
    
    cd ~/myblog
    git pull origin main
    hugo 
    echo "deploy success!"
    exit 0
    

    按下Esc键,并输入:wq保存退出文件。

    给文件添加可执行权限

    chmod +x hugo-deploy.sh
    

    Github配置SSH Key

    GitHub配置SSH Key的目的是为了帮助我们在通过git拉取代码时,不需要繁琐的验证用户名密码,如果需要验证,我们的自动脚本就挂了。

    首先检查是否存在sshkey

    cd ~/.ssh
    ls
    # 或者
    ll
    # 看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key
    

    如果没有则执行如下命令,然后回车到底

    ssh-keygen
    

    最后获取sshkey填入github配置中(点击右上角头像,settings,找到ssh点进去取个名字复制下即可。)

    cat ~/.ssh/id_rsa.pub
    

    最后检查下服务器仓库的.git文件夹config文件是否是ssh提交,如果不是可以改掉

    cat ~/.git/config
    

    输出

    [core]
    	repositoryformatversion = 0
    	filemode = true
    	bare = false
    	logallrefupdates = true
    [remote "origin"]
    	url = https://github.com/K1ngram4/myblog.git
    	fetch = +refs/heads/*:refs/remotes/origin/*
    

    这里url改为git@github.com:K1ngram4/myblog.git这个地址可以到仓库下载代码的地方选择ssh复制。

    最后执行命令查看是否链接成功

    ssh -T git@github.com
    

    编写js脚本

    先安装一个第三方插件github-webhook-handler

    npm install github-webhook-handler --save
    

    然后在webhook目录下创建一个github-webhook.js文件,写入以下内容,就是监听github的webhook请求

    var http = require('http')
    var createHandler = require('github-webhook-handler')
    var exec = require('child_process').exec
    var handler = createHandler({ path: '/webhook', secret: 'mysecret' })
    
    http.createServer(function (req, res) {
      handler(req, res, function (err) {
        res.statusCode = 404
        res.end('no such location')
      })
    }).listen(7777)
    
    console.log("github Hook Server running at http://0.0.0.0:7777/webhook");
    
    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)
        exec('sh ./hugo-deploy.sh', function (error, stdout, stderr) {
            if(error) {
                console.error('error:
    ' + error);
                return;
            }
            console.log('stdout:
    ' + stdout);
            console.log('stderr:
    ' + stderr);
        });
    })
    

    记住这个地址http://kingram.top:7777/webhook这就是webhook要发送过来的地址,下一步需要用到。

    启动脚本

    node github-webhook.js
    

    这样启动可以用来调试,如果调试没问题后,这样启动

    pm2 start github-webhook.js
    pm2 startup
    

    github配置webhook

    打开托管仓库github.com/K1ngram4/myblog点击右上角Settings按钮,选择Webhooks,点击右上角Add wehook

    Payload URL 填服务器端创建好的http://kingram.top:7777/webhook

    Content type选择application/json

    Secret填入mysecret

    到此,所有配置就结束了,可以在本机上push到仓库,服务器就会自动编译网站了。(#.#)

  • 相关阅读:
    Webpack安装及基础配置
    相机拍到了光源的灯珠图像
    面向对象特殊用法
    面向对象初始
    内置函数和必须的模块
    模块基本模式
    函数三
    函数二
    装饰器
    函数初识
  • 原文地址:https://www.cnblogs.com/Kingram/p/15013746.html
Copyright © 2011-2022 走看看