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

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

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

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

安装nodejs

在服务器上安装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系统
            const sh = spawn('sh', ['./mymud/update.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系统
            const bat = spawn('cmd.exe', ['/c', 'update.bat']);

            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(7777)

示例代码中针对linux和windows的代码,请根据自己服务器的操作系统选择使用,调用的脚本update.shupdate.bat是更新MUDLIB的脚本。

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

#!/bin/bash

cd mymud && git pull

而windows系统中则需要从update.bat中做一些处理,如下示例,是通过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运行服务,监听端口为7777,然后在github项目的settingsWebHooks中配置好监听地址即可。

如果是linux服务器,推荐使用pm2运行服务,如果对pm2不熟悉,可以百度或安装后运行pm2 examples查看示例说明。

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