如何自动化部署项目?折腾服务器之旅~

本篇文章讲的不是如何把一个项目部署上线,而是如何自动化上线。

开发了一个需求管理和发布系统。

通过这个系统,可以创建需求、创建发布计划、创建分支、部署到测试环境、部署到生产环境、正式上线、合并代码等。

一、功能设计

9.9元的阿里云服务器真的很慢,但还是足够折腾完这个项目。
用3个目录来模拟不同的环境。

目录 存放
project   存放所有的项目,比如本系统的前后端代码。  
pre-dir   预发环境,当然是用来测试的。  
pro-dir   生产环境,测试没问题,部署上线。  

一图胜千言。

如何自动化部署项目?折腾服务器之旅~

二、系统页面

我的任务

接到一个新的需求,可以新建一个需求,并创建开发分支。

如何自动化部署项目?折腾服务器之旅~

发布队列

开发结束之后,便可以到发布队列中,部署到预发环境进行测试。 测试通过指定Cookie 就可以访问到测试的代码。最终再进行线上部署。

如何自动化部署项目?折腾服务器之旅~

项目信息

如何自动化部署项目?折腾服务器之旅~

 

二、技术栈

前端技术栈
Vue + elementUI,具体代码在Github,感兴趣的可以看下并点个star哈~✨
服务端技术栈
非常常见的Node.js(Koa2) + Mysql + Redis + Pm2。
具体代码在Github,感兴趣的可以看下并点个star哈~✨

三、Redis和Session配置

// utils/Store.js const Redis = require("ioredis"); const { Store } = require("koa-session2"); class RedisStore extends Store { constructor() { super(); this.redis = new Redis(); } async get(sid, ctx) { let data = await this.redis.get(`SESSION:${sid}`); return JSON.parse(data); } async set(session, { sid = this.getID(24), maxAge = 1000 * 60 * 60 } = {}, ctx) { try { console.log(`SESSION:${sid}`); // Use redis set EX to automatically drop expired sessions await this.redis.set(`SESSION:${sid}`, JSON.stringify(session), 'EX', maxAge / 1000); } catch (e) {} return sid; } async destroy(sid, ctx) { return await this.redis.del(`SESSION:${sid}`); } } module.exports = RedisStore;

// 入口文件 const session = require("koa-session2"); const Store = require("./utils/Store.js"); // session配置 app.use(session({ store: new Store(), key: "SESSIONID", }));

 四、Router配置

为了Router看起来更优雅,也是通过中间件

// 1、middleware配置文件 const routers = require('../routers'); module.exports = (app) => { app.use(routers()); } // 2、index.js入口文件 const middleware = require('./middleware'); middleware(app); // 3、routers 注册文件 const Router = require('koa-router'); const router = new Router(); const koaCompose = require('koa-compose'); // 接口入口 const {insertDemand} = require('../controllers/demand/insertDemand'); const {deleteDemand} = require('../controllers/demand/deleteDemandByDid'); const {updateDemand} = require('../controllers/demand/updateDemandByDid'); // 加前缀 router.prefix('/api'); module.exports = () => { // 新增需求 router.get('/insertDemand', insertDemand); // 删除需求 router.get('/deleteDemand', deleteDemand); return koaCompose([router.routes(), router.allowedMethods()]); }

五、nginx配置

最头痛的就是nginx配置了,因为不是很熟悉,一直在试错、踩坑。不过还好终于成功了!
前后端项目通过Nignx提供服务,Node服务通过Nginx转发,主要是为了验证各种环境。
如果不设置Cookie,默认访问的就是线上环境,设置Cookie 就会走到预发布测试环境,用于测试。

# cookie 取TEST 赋值给$proxy_node map $cookie_TEST $proxy_node { default ""; "1" "1"; "2" "2"; "3" "3"; } # 发布管理系统前端设置 server { listen 80; server_name test.xue.com; if ($proxy_node = ''){ set $dollar "/data/pro-dir/dandelion/dist/"; } if ($proxy_node = "1") { set $dollar "/data/pre-dir/dandelion/dist/"; } location / { root $dollar; index index.html; try_files $uri $uri/ /index.html; } } # 发布管理系统后端设置 # 反向代理到node服务 server { listen 80; server_name m.xue.com; if ($proxy_node = ''){ set $dollar "/data/pro-dir/study-demo/"; } if ($proxy_node = "2") { set $dollar "/data/pre-dir/study-demo/"; } location / { root $dollar; index index.html; } } # demo项目前端设置 server { listen 80; server_name api.xue.com; location / { if ($proxy_node = "") { set $from 3001; proxy_pass :3001; } if ($proxy_node = "3") { set $from 3002; proxy_pass :3002; } } }

六、一些中间件

常用的HTTP设置

解决跨域,OPTIONS请求,携带Cookie凭证等问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8f5ee86e7d735c5b523eb4406b0b433e.html