通过webhook自动更新服务器mudlib代码示例

虽然MUD带有·ed·这个函数可以在线编辑代码,但是本人是强烈不推荐这种做法的,养成好的习惯是通过·git·来管理项目,在本机编辑代码并测试通过后·git push·上传到githubgitee,然后在服务器上通过·git pull·更新游戏代码。

如果不方便或不想每次push代码后都到服务器上pull,可以通过git的webhook实现自动更新。

最新Webhook项目代码:https://gitee.com/oiuv/webhook

安装nodejs

在服务器上安装nodejs,这个网站有大量的教程,这里不再重复。

# windows
choco install nvs

# Ubuntu
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - &&\
sudo apt-get install -y nodejs

开启webhook服务

我们写一个脚本·webhook.js·,代码如下:

const http = require('http');
const { spawn } = require('child_process') // 子进程, 用来执行脚本

http.createServer((req, res) => {
    console.log(`--- ${req.method} --- ${req.url} ---`);
    // console.log(`--- headers : ${JSON.stringify(req.headers)} ---`)
    // console.log(`--- ${JSON.stringify(req.trailers)} ---`)
    res.setHeader("Content-Type", "application/json");
    // request
    if (req.method === 'POST') {
        // 获取body
        let body = '';
        req.on('data', (data) => {
            // console.log(`--- data: ${data} ---`);
            body += data;
        });
        req.on('end', () => {
            let payload = JSON.parse(body);
            console.log(`--- ${payload.repository.url} ---`);
            //* linux和macOS
            if (process.platform === 'linux' || process.platform === 'darwin') {
                const sh = spawn('sh', [`./sh/${payload.repository.name}.sh`]);

                sh.stdout.on('data', (data) => {
                    console.log(`stdout: ${data}`);
                });
                sh.stdout.on('end', () => {
                    console.log('Mission Complete!')
                });

                sh.stderr.on('data', (data) => {
                    console.error(`stderr: ${data}`);
                });

                sh.on('close', (code) => {
                    console.log(`child process exited with code ${code}`);
                });
            }
            //* windows系统
            if (process.platform === 'win32') {
                const bat = spawn('cmd.exe', ['/c', `bat\\${payload.repository.name}.cmd`]);

                bat.stdout.on('data', (data) => {
                    console.log(data.toString());
                });
                bat.stdout.on('end', () => {
                    console.log('Mission Complete!')
                });

                bat.stderr.on('data', (data) => {
                    console.error(data.toString());
                });

                bat.on('exit', (code) => {
                    console.log(`Child exited with code ${code}`);
                });
            }

            // response
            let json = JSON.stringify({
                status: "success",
                code: 200
            });
            res.end(json);
        });
    }
    else {
        let json = JSON.stringify({
            status: "OK",
            code: 200
        });
        res.end(json);
    }

}).listen(8008)

默认监听端口8008,支持linux和windows,请根据自己服务器的操作系统选择使用,调用的脚本*.sh*.bat是更新MUDLIB的脚本,默认和你git仓库同名。

其中linux系统中直接调用脚本更新代码:

#!/bin/bash

cd mymud && git pull

而windows系统中则需要从xxx.bat中做处理,使用bat文件调用和linux系统一直都sh文件。如下示例,是通过git提供的bash.exe执行update.sh脚本:

@echo off
echo --- Git-Bash ---
C:
chdir C:\Program Files\Git\bin
bash --login -i /d/WebHooks/update.sh

这里/d/WebHooks/update.sh是·git-bash中的路径,对应电脑·D:\WebHooks\update.sh·脚本,update.sh中也要使用绝对路径进入mudlib目录:

#!/bin/bash

cd /c/MyMud && git pull

示例中·/c/MyMud·是电脑上C:\MyMud目录。

如果电脑上有安装Cygwin,也可以直接使用Cygwin终端:

@echo off
echo --- Cygwin-Terminal ---
C:
chdir C:\cygwin64\bin
bash --login -i ./update.sh

这个update.sh文件位置放在Cygwin的~目录中,脚本写法则和linux系统下一样。


配置好脚本后,使用node webhook.js运行服务,监听端口为8008,输入http://你的服务器IP:8008看能否正常响应,没问题后我们在github项目的settingsWebHooks中配置这个监听地址即可生效了。

提示:对webhook.js服务推荐使用pm2运行管理,如果对pm2不熟悉,可以百度或安装后运行pm2 examples查看示例说明。

npm i -g pm2
pm2 plus
pm2 start webhook.js
京ICP备13031296号-4