首页
论坛
社团
我的

ADSKN论坛

 找回密码
立即注册

扫一扫,微信登陆

开启左侧

git push后,服务器自动拉取项目的更新版本

[复制链接]
 楼主| Chao_Bei 发表于2022-9-3 16:36:46 | 显示全部楼层 |阅读模式 | 来自 河北省廊坊市 电信

马上注册加入论坛,获取更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在公共项目的开发过程中,最好自己先从main分支创建一个新的分支,在其中进行开发调试,完成后提交合并到main分支的请求,即pull request,最后由项目管理员审核后确认合并。下文完成的操作是当main分支受到push(包括merge pull request)之后,部署项目的服务器会调用shell脚本,自动拉取更新之后的项目。
添加GitHub仓库设置
首先要在远程仓库中设置,这里以项目托管在GitHub中为例。在仓库的settings中可以找到Webhooks的设置,添加好新的webhook设置,具体要求如图,这要与后文的js文件相对应。
WebHook 是一种 HTTP 回调:通过 HTTP POST 发送的简单事件通知。[1] 就是此WebHook 会在push事件发生时把消息发送给我们设置的 URL。
对服务器配置
为了获取webhook发送的http请求,我们需要在服务器防火墙放行端口,之后用运行Nodejs的方式监听该端口,方法来自于残梦a的博客园。[2]
在新建的文件夹中创建webhooks.js文件:
[JavaScript] 纯文本查看 复制代码
var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/postreceive', secret: '123' })
// 上面的 path和 secret保持和 GitHub后台设置的一致

function run_cmd(cmd, args, callback) {
  var spawn = require('child_process').spawn;
  var child = spawn(cmd, args);
  var resp = "";

  child.stdout.on('data', function (buffer) { resp += buffer.toString(); });
  child.stderr.on('data', function (data) {
    console.log('stderr: ' + data);
  });
  child.stdout.on('end', function () { callback(resp) });
}

http.createServer(function (req, res) {

  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(6000, () => { //监听的端口,对应 GitHub设置
  console.log('WebHooks Listern at 6000');
})
handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref);
  // 判断是否为 main分支,也可以自行修改
  if (event.payload.ref === 'refs/heads/main') {
    console.log('deploy main..')
    run_cmd('sh', ['./deploy.sh'], function (text) { console.log(text) });
  }
})

同时创建package.json文件:
[JavaScript] 纯文本查看 复制代码
{
  "name": "webhook",
  "version": "1.0.0",
  "main": "webhooks.js",
  "scripts": {
    "start": "node webhooks.js"
  },
  "license": "ISC",
  "dependencies": {
    "child-process": "^1.0.2",
    "github-webhook-handler": "^1.0.0",
    "http": "^0.0.1-security"
  }
}

还有deploy.sh文件:
[Bash shell] 纯文本查看 复制代码
# 进入部署上线项目的文件夹
cd your_folder;
# 进行拉取操作
git pull origin main:main;
# 如必要还需让项目重启
# 我是采用pm2 restart some_id的方式

服务器需要安装好npm和pm2,这里就不对安装过程进行介绍了。
之后在创建的文件夹打开终端运行以下命令即可:
[Bash shell] 纯文本查看 复制代码
$ npm i
$ pm2 start webhooks.js

解释:npm i安装好依赖的模块;pm2 start webhooks.js启动了这个node进程,做到了监听端口、当触发main分支的push事件后调用sh文件脚本的作用。
最后得到以下结果即说明成功配置。注:运行 pm2 logs 或者 pm2 logs some_id 可以实时查看所有日志或指定进程日志,方便查找问题。

公告
  • 问题反馈请扫码加入一期核心用户群
  • [学生认证] 认证后获取生活类板块发帖权限
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

QQ|Archiver|手机版|小黑屋|ADSKN短链接收益平台 ( 冀ICP备2021002162号 )

GMT+8, 2022-10-5 16:00 , Processed in 0.334089 second(s), 23 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表