在平常个人开发的过程中是不是有这样的烦恼:

项目开发完结,Push之后

登录服务器,手动git pull,然后运转布置命令

这真的很烦诶!

那么能不能Git push之后,远端服务器主动 Git pull 然后运转布置命令呢?

答案当然是能够的!

这就要请出我们的秘密武器啦!

剖析

先剖析一波,主动化布置需要完成以下功用:

  • 监听代码库房的变动。
  • 当检测到代码更新时,主动拉取最新代码。
  • 运转必要的构建和测验脚本。
  • 将构建产物布置到服务器。

而完成这全部的前提,便是GitHub 供给的WebHook。

怎么完成Git Push之后主动布置到服务器?

img

WebkHook供给了一种告诉web服务器有关库房变更有关的事情,你能够简略理解为:

git库房发生了改变,包含但不限于push、pull、fork等等

git官方服务器会发送一个恳求到你设置webHook链接

你依据这个恳求对应的事情进行操作。**

着手

第一步:装备Webhooks

直接上手吧,在repo-setting设置webHook,例如:http://your-server-ip:3000/webhook

怎么完成Git Push之后主动布置到服务器?

img

在你的Git库房(如GitHub)中,找到Webhooks设置,增加一个新的Webhook。Payload URL设置为你服务器上的一个URL,例如http://your-server-ip:3000/webhook

第二步:创立监听服务

(你也能够使用python、php、golang,anyway)

在服务器上创立一个Node.js应用来监听Webhook的POST恳求。创立一个webhook-listener.js文件,并写入以下内容:

const express = require('express');
const bodyParser = require('body-parser');
const cmd = require('node-cmd');
const app = express();
const port = 3000; // Webhook监听端口
app.use(bodyParser.json());
app.post('/webhook', (req, res) => {
  // 这里需要验证Webhook的secret,这个示例中省略了验证步骤
  if (req.headers['x-github-event'] === 'push') {
    cmd.get('git pull', (err, data) => {
      if (err) {
        console.error(err);
        res.status(500).send('Server Error');
        return;
      }
      cmd.get('yarn install', (err, data) => {
        if (err) {
          console.error(err);
          res.status(500).send('Server Error');
          return;
        }
        cmd.get('yarn run build', (err, data) => {
          if (err) {
            console.error(err);
            res.status(500).send('Server Error');
            return;
          }
          cmd.run('serve -s build -l 3003');
          console.log('Deployment completed');
          res.status(200).send('OK');
        });
      });
    });
  } else {
    res.status(200).send('Received');
  }
});
app.listen(port, () => {
  console.log(`Webhook listener running on port ${port}`);
});

运转该脚本:

node webhook-listener.js

这将启动一个监听3000端口的服务,等待GitHub的Webhook告诉。

(端口你能够自行指定)

第五步:测验Webhook

推送代码到你的Git库房,以测验Webhook是否正确触发了主动布置脚本。

假如全部设置正确,你应该能够在服务器上看到主动拉取代码并履行构建和布置的过程。

完结

你,学废了吗?

本文使用 mdnice 排版