作者:_九酒_882 | 来源:互联网 | 2023-09-06 11:13
媒介之前断断续续在重构一个项目,然后发明功用一最先设想太多了,可以须要花大批时刻来增添,然则中心功用基本完成,因而想着能不能半上线状况,然后经由过程更新提交git,让效劳器布置自动
媒介
之前断断续续在重构一个项目,然后发明功用一最先设想太多了,可以须要花大批时刻来增添,然则中心功用基本完成,因而想着能不能半上线状况,然后经由过程更新提交git,让效劳器布置自动更新。这之前打仗过git hook
是可以完成的,因而这里纪录一篇文章边捣鼓边写。
正文
预备
起首肯定须要完成的内容,明白需求:
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
然后就可以在当地开发完以后推送,效劳器就可以自动拉取代码而且布置。