热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Node+Git+Webhook自动化布置

媒介之前断断续续在重构一个项目,然后发明功用一最先设想太多了,可以须要花大批时刻来增添,然则中心功用基本完成,因而想着能不能半上线状况,然后经由过程更新提交git,让效劳器布置自动

媒介

之前断断续续在重构一个项目,然后发明功用一最先设想太多了,可以须要花大批时刻来增添,然则中心功用基本完成,因而想着能不能半上线状况,然后经由过程更新提交git,让效劳器布置自动更新。这之前打仗过git hook是可以完成的,因而这里纪录一篇文章边捣鼓边写。

正文

预备

起首肯定须要完成的内容,明白需求:


1.监听指定 git 提交
2.实行指定多个剧本

而且由于我这边是须要离别对clientserver 目次离别实行布置敕令。所以须要迥殊处置惩罚。

起首去域名治理那里增添一条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

《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.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

然后就可以在当地开发完以后推送,效劳器就可以自动拉取代码而且布置。


推荐阅读
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 业务:Payments&Risk大数据/AI/数据可视化时间要求:至少实习6个月,每周5天,入职时间4-5月 ... [详细]
  • 本文整理了Java中net.minecraft.entity.ai.EntityAITasks.onUpdateTasks()方法的一些代码示例,展示了En ... [详细]
  • HTTP请求响应的步骤第一步:第二步:第三步:第四步:第五步第一步:1.客户端连接到Web服务器⼀个HTTP ... [详细]
  • kafkamanager(cmak)安装及使用
    1.软件下载kafka-manager工具目前改名为cmak,下载地址为:https:github.comyahooCMAKreleasestag3.0.0.5现在 ... [详细]
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • 目录结构如下:Nginx基础知识NginxHTTP服务器的特色及优点Nginx的主要企业功能Nginx作为web服务器的主要应用场景包括:Nginx的安装安装环境 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
  • Flow 生态案例学习 | Emerald City为Flow上DAO、教育和开发铺平道路
    原文链接:https://www.onflow.org/post/emer ... [详细]
  • 小编给大家分享一下TypeScript2.7有什么改进,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收 ... [详细]
  • 《从零构建前后星散的web项目》:前端相识过关了吗?
    #前端基本架构和硬核引见手艺栈的挑选起首我们构建前端架构须要对前端生态圈有统统相识,而且最好带有肯定的手艺前瞻性,好的手艺架构能够日后会轻易的扩大,削减重构的次数,纵然重构也不须要 ... [详细]
author-avatar
_九酒_882
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有