本文主要和大家分享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. 切换数据库到 abc 2. 指定了数据库 abc ,拥有权限: userAdmin db.createUser( { user: "123", pwd: "123", roles: [ { role: "userAdmin", db: "abc" } ] } ) 3. 验证下上面创建的账号 123 db.auth('123','123') => 1
配置webhook
这个其实是最简单的,只要在你的github对应的项目仓库右侧选择settings
然后选择webhooks
选择add 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.js const 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(); // logger app.use(morgan(':remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] :response-time ms')); // static assets app.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/bash cd ./ 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/bash cd ./ echo 'server start' kill -9 $(lsof -i:8866 |awk '{print $2}' | tail -n 2) yarn run start
同样我们需要在执行监听之前结束上一个端口的进程。
然后我们来看clean.sh
这个shell脚本是用来清理client
目录下build
文件夹。
#! /bin/bash rm rf ./client/build git reset --hard origin/master git clean -f git pull
可以看到 先清理了缓存然后再向服务器拉取代码.
最后我们来看部署的脚本deploy/index.js
var spawn = require('child_process').spawn var http = require('http') var spawn = require('child_process').spawn var 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 、Git 、Webhook自动化部署实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具