纯前端实现自动部署功能

原文转载 - 简书 - https://www.jianshu.com/p/d0d601af3797

只是为了方便后期自己查找所以转载过来。可以直接点击查看原作者原文,如果有侵权请联系删除。

webhook的原理图

WechatIMG2071

图片上演示是php代码。但是同理可以使用其他后端语言实现 java node均可

使用gitlab / github / gitee + node 纯前端实现自动化部署代码功能。

可以直接放置在服务器新建个目录,来用pm2运行。 也可以放置在项目根目录上。。 跟着项目一起走方便管理。

文件创建时注意文件格式。sh脚本文件是需要脚本格式文件类型。不建议在sh文件中书写注释。只是为了方便所以才加上。 有应用到项目中建议删除注释,要不然node运行有可能报错

//deploy.sh

#! /bin/bash
WEB_PATH=你的项目服务器路径
cd $WEB_PATH
git reset --hard master //需要pull代码的分支
git clean -f //清除一下服务器本地代码
git pull //开始pull代码
#git checkout master //可要可不要  没啥意义

#存一下日志。。但是无大意义。都是成功的日志
echo $(date) " --- git pull success " >> ./deploy.log
//deploy.js

"use strict";
const http = require('http');
const url = require('url');
const webhook = require('./webhook');

const path = '/webhook';
function resText(res, args) {

res.writeHead(args.stateCode, {'Content-Type': 'text/plain; charset=utf-8'});    
res.end(args.msg);

}
http.createServer(function(req, res) {
    if(path !== url.parse(req.url, true).pathname) {
        resText(res, {
            stateCode: 404,
            msg: '404 Not found.'
        });
        return;
    }
    let post = '';
    let headers = req.headers;
    req.on('data', function(chunk) {
        post += chunk;
    });
    req.on('end', function(){
        try{
            post = JSON.parse(post);
        } catch(e) {
            resText(res, {
                stateCode: 400,
                msg: 'Bad request.'
            });
            return;
        }
        webhook({headers, post}, function(result){
            if(!result) {
                resText(res, {
                    stateCode: 400,
                    msg: 'Bad request.'
                });
                return;
            }
        });
        res.end('done');
    });
}).listen(7777);
//webhook.js
'use strict';

const exec = require('child_process').exec;

const cmd = './deploy.sh';
const token = 'webhook Secret Token';
function webhook(args, callback) {
    let header = args.headers;
    let body = args.post;
    let allowEvent = {
        push: true, 
        merge_request: true
    }
    if(!header['x-gitlab-event'] || header['x-gitlab-token'] !== token) {
        console.error('wrong x-gitlab-event OR x-gitlab-token');
        callback(null);
        return;
    }
    if(!allowEvent[body['object_kind']]) {
        callback(null);
        return;
    }
    if(
        body['object_kind'] === 'push' && 
        body.ref.split('/').pop() !== 'master'
    ) {
        callback(null);
        return;
    }
    if(
        body['object_kind'] === 'merge_request' &&
        body['object_attributes']['state'] !== 'merged'
    ) {
        console.error(
            'merge_request state: ',
            body['object_attributes']['state']
        )
        callback(null);
        return;
    }
    exec(cmd, function(err, stdout, stderr) {
        if(err) {
            console.error(err);
            callback(null);
            return;
        }
        console.log('stdout----->', stdout);
        console.log('stderr----->', stderr);
    });
}

module.exports = webhook;
发表新评论