使用Github的webhooks进行网站自动化部署


首先说说为什么要折腾这个webhook吧,原来是直接通过GitHub action直接发布到服务器的但是这样会造成一个问题,每次hexo d上传服务器是都会占用大量的时间,十几分钟甚至二十分钟,导致我上个月私库action时长都用尽了,十分的不nice,因为在我折腾下actions在我的网站承担了很重要的角色,这样平白无故的浪费时长很不值,所以之前就着手想办法解决了,我最初想到的方法其实是利用服务器定时脚本去拉取githubpage仓库代码,但是这样存在一些问题不能即时发布即时显示,非常不nice,直到前几天在糖果屋吹水的时候看到了群友说可以webhook让服务器自动拉取,我一下子就察觉到了这正是我需要的然后就问群友要了教程,(群友yyds),今天下午折腾了一下午,也遇到了一些问题,好在都面向搜索引擎解决了,记录下来方便下次安装。折腾之后的网站架构。

CentOS安装NodeJS

1.首先安装wget

yum install -y wget

如果已经安装了可以跳过该步

2.下载nodejs最新的bin包

可以在下载页面https://nodejs.org/en/download/中找到下载地址。然后执行指令

wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz

然后就是等着下载完毕。

另外你也可以在你喜欢的任意系统上下载最新的bin包,然后通过FTP上传到CentOS上。

3.解压包

依次执行

xz -d node-v9.3.0-linux-x64.tar.xz
tar -xf node-v9.3.0-linux-x64.tar

4.部署bin文件

先确认你nodejs的路径,我这里的路径为~/node-v9.3.0-linux-x64/bin。确认后依次执行

ln -s ~/node-v9.3.0-linux-x64/bin/node /usr/bin/node
ln -s ~/node-v9.3.0-linux-x64/bin/npm /usr/bin/npm

注意ln指令用于创建关联(类似与Windows的快捷方式)必须给全路径,否则可能关联错误。

5.测试

node -v
npm

如果正确输出版本号,则部署OK

这种安装的方法好处是比较干净,安装也比较快速。个人认为比较适合新手。但是如果遇到nodejs插件全局安装时,需要自行去创建关联。

这也是后面出问题的原因,当时没注意。

安装插件

在安装目录(以我的为例/webhook)下执行如下命令

npm init -f
npm i -S github-webhook-handler
npm i pm2 -g

添加关联

由于需要使用pm2命令进行进程守护,需要添加关联我之前忽略了这一步导致出现-bash: pm2: command not found报错。

执行如下命令即可添加

ln -s pm2安装路径 系统环境路径$PATH
echo $PATH即可查询系统环境路径/usr/local/sbin

构建 Webhook 服务

在服务器目录下创建webhook web两个文件夹备用,在webhook目录下新建webhook.js文件我使用vim webhook.js 创建并编辑写入以下内容:

var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/', secret: 'secret' })
// 上面的 secret 保持和 GitHub 后台设置的一致文章后面会提到。
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('gggggggggg')
  })
}).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) });
})

secret 字段为 Github 中设置的,需要与这里相对应

注意,在运行的时候如果提示 github-webhook-handler is not defined 未找到 ,可以在目录中执行 npm link github-webhook-handler

编写shell脚本

cd /web通过 git clone git page命令下载文件同时完成git 初始化。

然后在webhook目录下创建deploy.sh写入以下内容

#!/bin/bash
# 网站的根目录,用自己的目录。
WEB_PATH='/web/brqs.github.io'

echo “start deployment”
cd $WEB_PATH
echo “fetching from remote…”

为了避免冲突,强制更新本地文件

git fetch –all
git reset –hard origin/master
echo “done”

由于 Linux 文件权限问题,可能无法执行,建议先执行 chmod 777 ./deploy.sh

运行webhook.js

pm2 start webhook.js

进入Gtihub后台进行设置

进入需要自动部署的项目的github地址添加webhook,进入Settings设置页面,点击左侧的 Webhooks

按图中填写即可,你自己的服务器ip加端口(记得云服务器开放安全组狗头),secret是创建时自己填写的。

webhook记录


文章作者: 不染轻裳
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 不染轻裳 !
评论
 上一篇

阅读全文

shell学习笔记
shell学习笔记 shell学习笔记
你以为这是一篇正经的学习笔记?不!其实它是记录我瞎折腾sh脚本的文章,同样还是面向搜索引擎编程,昨晚写下了我自己的第一个sh脚本(自己用起来还行)。 sh上传脚本首先直接简单介绍一下这个脚本的功能。 1.获取百度统计数据2.记录上
2021-07-19
下一篇 

阅读全文

awbw万能群七月月赛总结
awbw万能群七月月赛总结 awbw万能群七月月赛总结
这个月赛是由exe大佬发起的,好像会持续举办吧,虽然自己明战很菜,但是重在参与嘛就报名了,于是就在昨晚我的七月月赛果然一轮游了,虽然对这个结果并不是很惊讶吧,毕竟对手是成名已久的国人明战大佬,我自己总共明战都没打多少把,正好借此作为契机开始
2021-07-02
  目录