使用 WebHook 来自动部署 NodeJS 项目

1,853 阅读4分钟
原文链接: segmentfault.com

前言

在我们本地开发好一个 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 进入一个页面:

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

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

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

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

总结

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

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

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