Node 、Git 、Webhook自动化部署实例详解

本文主要和大家分享node 、git 、webhook自动化部署实例详解,希望能帮助到大家。

准备

首先确定需要完成的内容,明确需求:

1.监听指定 git 提交2.执行指定多个脚本

登录后复制

而且因为我这边是需要分别对client 和server 目录分别执行部署命令。所以需要特别处理。

首先去域名管理那边增加一条A记录指向新的项目名称.因为Webhooks是需要外网域名的,因此先提前加一条。new.xxx.com

然后就是需要对服务器上Nginx做转发配置。

我的nginx是很久之前配置的

在etc/nginx/conf/vhost里增加一个文件,里面写入如下内容:

server        {                listen 80;                server_name new.xxx.com;                index index.html index.htm index.php default.html default.htm default.php;                location / {                        proxy_pass http://127.0.0.1:8801;                }                access_log off;        }

登录后复制

将本地的8801转发出去。

然后重启一下Nginx nginx -s reload

然后git clone 仓库

因为项目用了mongodb数据库:
需要创建一个对应的数据库并添加权限。

1. 切换数据库到 abc2. 指定了数据库 abc ,拥有权限: userAdmin db.createUser(   {     user: "123",     pwd: "123",     roles: [ { role: "userAdmin", db: "abc" } ]   } ) 3. 验证下上面创建的账号 123 db.auth('123','123') => 1

登录后复制

配置webhook

这个其实是最简单的,只要在你的github对应的项目仓库右侧选择settings

然后选择webhooks

Node 、Git 、Webhook自动化部署实例详解

选择add webhook

然后按照如下配置即可:

Node 、Git 、Webhook自动化部署实例详解

这里需要记住你自己设置的secret 以及你定义的推送动作,我这里是pushCode 。

开始写脚本

写之前先来看下最终的目录结构:

├── README.md├── clean.sh // 清理缓存,并且执行git命令├── client│   ├── autoClient.sh // client端自动监听│   ├── build│   ├── config│   ├── package.json│   ├── public│   ├── scripts│   ├── src│   ├── tsconfig.json│   ├── tsconfig.test.json│   ├── tslint.json│   ├── www│   ├── yarn.lock├── deploy│   └── index.js // 监听webhook事件然后依次执行 clean.sh autoClient.sh autoServer.sh├── package.json├── server│   ├── autoServer.sh // server端自动监听│   ├── dist│   ├── package.json│   ├── src│   ├── tsconfig.json│   ├── tslint.json│   └── yarn.lock

登录后复制

因为项目原因,脚本还需要做一些定制。
首先是client端,因为前端是用了typescript + React全家桶 所以打包起来特别慢,当在服务器build的时候,因为阿里云内存给的不够,所以会很卡。基于这个考虑,是打算本地bulid完之后,推送到git上,服务器去git pull。

而且前端还有个考虑是用什么跑前端代码。因为服务器没装类似服务,因此打算用node框架koa起一个HTTP服务来跑。

代码如下:

www目录中

app.jsconst Koa = require('koa')const morgan = require('koa-morgan')const path = require('path');const static = require('koa-static')const fs = require('fs')const app = new Koa();// loggerapp.use(morgan(':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms'));// static assetsapp.use(static(path.join(__dirname,'../build')));//异步读取文件的形式// app.use(async (ctx,next) =>{//     ctx.type = 'html';//     ctx.body = await fs.createReadStream(path.resolve(__dirname, '..', './build', 'index.html'));// })module.exports = app;

登录后复制

index.js'use strict';const app = require('./app');const PORT = process.env.PORT || 8801;console.log('client start')app.listen(PORT, () => {  console.log(`App listening on port ${PORT}!`);});

登录后复制

这样通过命令node ./www/index.js能够监听同级build目录。

当然这比较粗暴,还需要慢慢改进。

我们需要在client目录下建立autoClient.sh

#! /bin/bashcd ./echo 'client build'kill -9 $(lsof -i:8801 |awk '{print $2}' | tail -n 2) node ./www/index.js

登录后复制

用来自动执行监听动作。

因为多次推送监听的前端端口一致,如果不处理会报错。需要先根据端口号8801结束进程然后重新开启服务。

然后是server端,因为整个后端是用koa完成的,项目比较小,在服务端即时编译花费不了多少时间,因此直接执行yarn start( “start”: “yarn run build && yarn run watch”,)用来编译和监听。

在server目录里建立autoServer.sh

#! /bin/bashcd ./echo 'server start'kill -9 $(lsof -i:8866 |awk '{print $2}' | tail -n 2) yarn run start

登录后复制

同样我们需要在执行监听之前结束上一个端口的进程。

然后我们来看clean.sh 这个shell脚本是用来清理client目录下build文件夹。

#! /bin/bashrm rf ./client/buildgit reset --hard origin/mastergit clean -fgit pull

登录后复制

可以看到 先清理了缓存然后再向服务器拉取代码.

最后我们来看部署的脚本deploy/index.js

var spawn = require('child_process').spawnvar http = require('http')var spawn = require('child_process').spawnvar createHandler = require('github-webhook-handler')var handler = createHandler({ path: '/pushCode', secret: 'xxx' }) // 根据git上webhook的配置填写http.createServer(function (req, res) {  handler(req, res, function (err) {    res.statusCode = 404;    res.end('no such location')  })}).listen(7777)handler.on('error', function (err) {  console.error('Error:', err.message)})// 监听 push 事件handler.on('push', function (event) {  console.log('Received a push event for %s to %s',    event.payload.repository.name,    event.payload.ref)    init() // 每次拉取都重新监听})function rumCommand( cmd, args, cwd, callback ) {  var child = spawn( cmd, args, {cwd: cwd} )  var response = ''  child.stdout.on('data', function( buffer ){ response += buffer.toString(); })  child.stdout.on('end', function(){ callback( response ) })}function init() {  rumCommand('sh', ['../clean.sh'], './' ,function( result ) { // 清理缓存    console.log(result)  })  rumCommand('sh', ['../server/autoServer.sh'], '../server' ,function( result ) { // cLient端更新    console.log(result)  })    rumCommand('sh', ['../client/autoClient.sh'], '../client' ,function( result ) { // server端更新    console.log(result)  })}init() // 脚本运行第一次默认指向一次

登录后复制

这里需要声明的是因为多目录下执行脚本需要对应的环境。因此才把脚本都分开放。

部署

部署我们只需要对pm2 start deploy/index.js

然后就可以在本地开发完之后推送,服务器就能自动拉取代码并且部署。

相关推荐:

Node自动化部署的方法详解

以上就是Node 、Git 、Webhook自动化部署实例详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2787290.html

(0)
上一篇 2025年3月8日 18:05:59
下一篇 2025年3月8日 18:06:05

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Webpack服务器端代码打包实例详解

    环境变量 之前,我们在项目里会经常使用 process.env.NODE_ENV, 但这个变量对于 webpack打包是有影响的, 在 production 的时候是有优化的.本文主要和大家介绍Webpack 服务器端代码打包的示例代码,小…

    编程技术 2025年3月8日
    200
  • vue-cli与webpack处理静态资源的方法

    处理静态资源 你也许会注意到vue-cli与webpack结合的项目中,我们通常会有两个静态资源的路径:src/assets和static/,他们两者的区别是什么呢?本文主要和大家介绍了vue-cli与webpack结合如何处理静态资源,小…

    编程技术 2025年3月8日
    200
  • 如何实现web前端页面生成exe可执行文件

    在 html5的崛起、javascript要一统天下之际,有一个名为【跨平台】的技术越来越火。为什么会这么火?因为软件开发者只需一次编写程序,即可在 windows、linux、mac、ios、android 等平台运行,大大降低了程序员的…

    2025年3月8日
    200
  • 几个免费的web前端开发工具

    本文主要和大家介绍十个免费的web前端开发工具详细整理的相关资料,希望通过本文大家能够理解使用免费web开发工具,需要的朋友可以参考下,希望能帮助到大家。 十个免费的web前端开发工具 网络技术发展迅速,部分技术难以保持 立即学习“前端免费…

    2025年3月8日 编程技术
    200
  • Web技术如何实现移动监测

    本文主要和大家介绍web技术如何实现移动监测,移动侦测,一般也叫运动检测,常用于无人值守监控录像和自动报警。通过摄像头按照不同帧率采集得到的图像会被 cpu 按照一定算法进行计算和比较,当画面有变化时,如有人走过,镜头被移动,计算比较结果得…

    2025年3月8日 编程技术
    200
  • 详解webpack模块及webpack3新特性

    本文从简单的例子入手,从打包文件去分析以下三个问题:webpack打包文件是怎样的?如何做到兼容各大模块化方案的?webpack3带来的新特性又是什么?webpack是一个强大的模块打包工具,在处理依赖、模块上都很优秀,本文从bundle.…

    编程技术 2025年3月8日
    200
  • web前端页面生成exe可执行文件实例

    在 html5的崛起、javascript要一统天下之际,有一个名为【跨平台】的技术越来越火。为什么会这么火?因为软件开发者只需一次编写程序,即可在 windows、linux、mac、ios、android 等平台运行,大大降低了程序员的…

    2025年3月8日
    200
  • Node调用Java的示例代码分享

    java 端作为服务提供者,基于dubbo 实现服务并通过 dubbo hessian 扩展暴露服务;node 端作为服务消费者,通过node-hessian 调用 java 端的服务。本文主要和大家介绍了node调用java的示例代码,小…

    2025年3月8日
    200
  • Vue+webpack基础配置分享

    最近在学习webpack,跟着课程一个单页面应用,在这里记录一下。这个部分主要讲了如何配置webpack的环境,以及webpack dev的配置。记录比较粗略,后续会更新。本文主要和大家介绍了vue+webpack项目基础配置教程,需要的朋…

    2025年3月8日 编程技术
    200
  • webpack无法通过IP地址访问localhost的问题

    1、问题描述: 今天用 webpack (v1.14.0)配置本地服务,为了能在移动端预览开发效果,需要通过 IP 地址生存二维码然后手机扫描访问。却发现不能通过 ip 访问 localhost。 2、解决方案: 经多方查询,在 npm r…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论