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

原理

利用Github在仓库进行操作时,可以通过配置webhook向服务器发送请求,在服务器端接到请求后,使用脚本来自动进行git pull操作。

image

图片来源:Github的webhook触发vps上的脚本

构建 Webhook 服务

通过执行

npm i -g github-webhook-handler

来安装 github-webhook-handler 中间件

新建文件 webhook.js

var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/', secret: 'root' })
// 上面的 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('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) });
})

其中

var handler = createHandler({ path: '/', secret: 'root' })

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

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

参考地址:利用Github的Webhook进行静态网站的自动化部署

同一服务多个 webhook

当你有多个仓库需要自动部署时,可以在一个服务上开启多个 webhook。

var http = require('http')
var createHandler = require('node-github-webhook')
var handler = createHandler([ // 多个仓库
  {
    path: '/app1',
    secret: 'CUSTOM'
  },
  {
    path: '/app2',
    secret: 'CUSTOM'
  }
])
// var handler = createHandler({ path: '/webhook1', secret: 'secret1' }) // 单个仓库

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
  )
  switch (event.path) {
    case '/app1':
      runCmd('sh', ['./app1_deploy.sh', event.payload.repository.name], function (text) { console.log(text) })
      break
    case '/app2':
      runCmd('sh', ['./app2_deploy.sh', event.payload.repository.name], function (text) { console.log(text) })
      break
    default:
      // 处理其他
      break
  }
})

function runCmd (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)
  })
}
同一服务多个webhook时,最终你的payload URL 则为:http:/yourdomain:7777/app1 或者 http:/yourdomain:7777/app2 ,注意我在实践过程中发现,不能使用 / 目录,会无法监听到 webhook。

参考地址:https://github.com/rvagg/gith...

完成 shell 脚本

在使用脚本之前,先要对网站根目录做一些处理

# 打开网站根目录
cd /home/wwwroot/domain.com
# 采用 Git 文件控制
git init
# 添加远程 Git 仓库地址
git remote add origin https://xx.git 

参考地址:
How do I force “git pull” to overwrite local files?

然后再创建 deploy.sh,与 webhook.js 在同一个目录下

#!/bin/bash
# 网站的根目录
WEB_PATH='/home/wwwroot/domain.com'
 
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

使用pm2进行进程守护

安装pm2:

npm i pm2 -g

运行webhook.js

pm2 start webhook.js

进入Gtihub后台进行设置

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

image

原文地址:使用Github的-WebHooks-进行网站自动化部署


52admin's Blog
52admin's Blog
901 声望
27 粉丝
0 条评论
推荐阅读
HTML 转 PDF 图文报表实践
导出 PDF 图文报表实践 方法一: jsPDF 使用 jsPDF 时,需要注意的是其默认单位为 mm,需要在 new jsPDF() 时传入配置 {代码...} 这个方法废了。这个鬼东西多行文本和多个图片,简直要人命! 方法二: wkhtmltopd...

52admln15阅读 5.7k

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木60阅读 5.9k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木39阅读 7k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木32阅读 6k评论 9

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木32阅读 4.4k评论 9

git+Github的正确姿势
前言此文章是笔者在 github 使用中的一些经验性总结,学习的新姿势会同步更新,记录。目录一、可访问性二、展示自己的项目三、专业指引四、其他物料五、参与开源贡献可访问性你可以正常访问 github.com 网页并且...

RainBow15阅读 6k评论 5

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木29阅读 3.8k评论 9

901 声望
27 粉丝
宣传栏