使用 WebHook 来自动部署 NodeJS 项目!

前言在我们本地开发好一个 NodeJS 项目,如果想要给别人看的话一般来说都是需要部署到服务器上面的。如果你使用 github 或者 coding 这里代码托管的服务,只需要在服务器安装好环境且安装好 git 之后,把项目 clone 下来然后使用 pm2 来启动自己的 NodeJS 项目就行了。但是,如果我更新了代码到了远程仓库去了,而服务器还是以前的老代码,你还是需要登

前言

在我们本地开发好一个 NodeJS 项目,如果想要给别人看的话一般来说都是需要部署到服务器上面的。如果你使用 github 或者 coding 这里代码托管的服务,只需要在服务器安装好环境且安装好 git 之后,把项目 clone 下来然后使用 pm2 来启动自己的 NodeJS 项目就行了。

但是,如果我更新了代码到了远程仓库去了,而服务器还是以前的老代码,你还是需要登录到服务器上面并且用 git 命令把最新的代码拉下来,在重启一次项目。久而久之,如果更改代码频繁的话,每次都是需要自己登录到服务器上手动部署也不是一个好办法。

刚好我们又用到了一些代码托管的服务,且有 WebHook 这种好东西,怎么不拿来用一用呢!

编写自动部署脚本

在我们确定使用 WebHook 来实现自动部署后,我们需要一个脚本去执行一些命令。在使用 Linux 的服务器下我们可以使用 shell 来写这个自动部署脚本,这里我把文件命名为auto_build.sh:

! /bin/bash

git reset --hard origin/master
git clean -f
git pull origin master
npm install
npm run test
npm run start
上面的 shell 脚本会运行我们写好的命令,这样的话第一步编写自动部署脚本就搞定了,如果对 shell 不熟悉的同学可以看看:Shell脚本编程30分钟入门

处理 WebHook

如果要使用 WebHook 的话,我们还需要在自己项目里多启动一个 http 服务专门用来处理接受请求,这里假设我们使用的是 Coding 来管理我们的代码,我们可以使用到coding-webhook-handler这个包。

首先安装好coding-webhook-handler:

npm i -S coding-webhook-handler

然后我们新建一个 js 文件命名为webhook.js,代码如上。这个就是使用到 coding-webhook-handler 这个模块了,且为它单独启动 http 服务,然后我们就监听如果有push操作的话,就执行回调函数:

const http = require('http')
const createHandler = require('coding-webhook-handler')
const handler = createHandler({
path: '/',
token: '' // 在 coding 上面可以填写一个 token
})

http.createServer((req, res) => {
handler(req, res, function(err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)

handler.on('error', err => {
console.error('Error:', err.message)
})

handler.on('push', event => {
console.log(event)
})
把最基础的代码写好了,然后我们需要运行我们.sh 文件来实现自动部署。先写一个能够运行命令的函数,函数也是写在webhook.js里:

...
const rumCommand = (cmd, args, callback) => {
const child = spawn(cmd, args)
let response = ''
child.stdout.on('data', buffer => response += buffer.toString())
child.stdout.on('end', () => callback(response))
}
...
接着修改handler.on('push', event => {...})的回调函数:

handler.on('push', event => {
rumCommand('sh', ['./auto_build.sh'], txt => {
console.log(txt)
})
})
好了,我们把webhook.js的代码都写好,之后就需要用 nginx 把端口转发出去。然后在 Coding 上面配置好 webhook 既可。

配置 Coding 的 WebHook 设置:

首先我们需要进入到你的 coding 仓库的页面,然后我们在左边的侧边栏里点击设置进入项目设置页面,你就可以看到 WebHook 这个按钮,然后在点击去到设置 WebHook 的页面。

接着我们可以在右面看到:

然后点击新建 Hook 进入一个页面:

  1. url:就是访问你webhook.js启动服务的域名。

  2. token:非必要,如果使用了需要在createHandler里面也对应的填写上。

然后下面你可以选你需要监听哪些事件,这里我们只是用来自动部署项目,就只监听push就行了。

确认设置好项目的 WebHook 之后,你最好也把部署公钥也给设置了,免得到时候pull代码的时候需要输入帐号密码,然后用 ssh 的方式把仓库 clone 到服务器上。然后启动项目的服务和启动 webhook.js 的服务。

总结

如果你不想每次更新了代码都要手动登录服务器上去手动部署的话,而且也用到了一些代码托管服务,你可以使用 WebHook 来实现一个简单的自动部署功能,这样的话就剩下了很多手动部署的时间了。

上面演示的都是在 Coding 上的,如果你是使用 github 来管理的代码的话,可以使用github-webhook-handler,然后进去 github 项目的设置里找到 Webhook 设置既可!

如果你还有更好的方案,不妨在留言告知我!!!

关键字:node.js, webhooks, webhook, 代码