手机版

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

时间:2021-08-25 来源:互联网 编辑:宝哥软件园 浏览:

本文不是关于如何在线部署项目,而是如何在线自动化项目。

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

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

一、功能设计

9.9元的阿里巴巴云服务器确实慢,但还是够完成这个项目的。三个目录用于模拟不同的环境。

该目录存储了按项目存储的所有项目,如本系统的前端和后端代码。预目录预览环境,当然是用来测试的。Pro-dir生产环境,测试正常,部署在线。一幅画胜过千言万语

二、系统页面

我的任务/使命

收到新需求后,您可以创建新需求并创建开发分支。

发布队列

开发完成后,您可以进入发布队列,并将其部署到发布前环境中进行测试。测试可以通过指定Cookie来访问测试的代码。最后,将在线部署。

项目信息

二、技术栈

前端技术栈Vue elementUI,具体代码在Github,有兴趣的可以看一下,点击Starha ~ node . js(KOA 2)Mysql Redis Pm2,这在技术栈中非常常见。具体代码在Github,有兴趣可以看看,点个星~

三.Redis和会话配置

//utils/store . jsconst Redis=require(' ior edis ');const { Store }=require(' KOA-session 2 ');类RedisStore扩展了Store { constructor(){ super();this . Redis=new Redis();} async get(sid,ctx) {让数据=wait this . redis . get(` session : $ { sid } `);返回JSON.parse(数据);}异步集(会话,{ sid=this.getID(24),maxAge=1000 * 60 * 60 }={},CTX){ try { console . log(` session : $ { sid } `);//使用redis set EX自动丢弃过期会话wait this . redis . set(` session : $ { sid } `,JSON.stringify(session),' EX ',maxAge/1000);} catch (e) {}返回sid}异步销毁(sid,CTX){ return await this . redis . del(` session : $ { sid } `);} } module.exports=RedisStore//entry file const session=require(' KOA-session 2 ');const Store=require('。/utils/store . js ');//session configure app . use(session({ store : newstore(),key:' sessionid ',});四.路由器配置

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

//1.中间件配置文件const routers=require('./路由器');module.exports=(app)={ app.use(路由器());}//2,index.js条目文件const中间件=require('。/中间件');中间件(app);//3.路由器注册文件const router=require(' KOA-router ');const Router=new Router();const koaCompose=require(' KOA-compose ');//接口条目const {insertdemand}=require('./controller/demand/insert demand’);const {deleteDemand}=require('./controllers/demand/deletedmandbyd’);const {updateDemand}=require('./controllers/demand/updateDemandByDid’);//前缀router . prefix('/API ');module.exports=()={//添加需求路由器。get ('/insertdemand ',insert demand);//删除需求router.get ('/deletedemand ',delete demand);return koaCompose([router . routes()、router . allowedmethods()]);}五、nginx配置

最头疼的就是nginx的配置,因为不熟悉,一直在努力犯错踩坑。但幸运的是,它终于成功了!前端项目通过ningx提供服务,Node服务通过Nginx转发,主要是验证各种环境。如果不设置cookies,默认会访问在线环境,如果设置了cookies,会去发布前测试环境进行测试。

#饼干取试验赋值给$ proxy _ node map $ cookie _ TEST $ proxy _ node { default };'1' '1';'2' '2';'3' '3';}# 发布管理系统前端设置服务器{听80服务器名test.xue.com;if($ proxy _ node=' '){ set $ dollar '/data/pro-dir/蒲公英/dist/';} if($ proxy _ node=' 1 '){ set $ dollar '/data/pre-dir/蒲公英/dist/';}位置/{ root $ dollar;index.html指数;try _ files $ uri $ uri//index。html}}# 发布管理系统后端设置# 反向代理到结节服务服务器{听80服务器名m.xue.com;if($ proxy _ node=' '){ set $ dollar '/data/pro-dir/study-demo/';} if($ proxy _ node=' 2 '){ set $ dollar '/data/pre-dir/study-demo/';}位置/{ root $ dollar;index.html指数;}}#演示项目前端设置服务器{听80服务器名api.xue.com;location/{ if($ proxy _ node=' '){ set $ from 3001;proxy _ pass http://47。107 .188 .55:3001 } if($ proxy _ node=' 3 '){ set $ from 3002;proxy _ pass http://47。107 .188 .55:3002} }}六、一些中间件

常用的超文本传送协议设置

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

模块。导出=()={返回异步(CTX,下一个)={ CTX。设置('访问控制-允许-起源',' http://测试。薛。com’);' ctx.set('访问控制-允许-凭证,真);' ctx.set('访问控制-允许-标题','内容类型');' ctx.set('访问控制-允许-方法','选项,GET,HEAD,PUT,POST,DELETE,PATCH ').//这个响应头的意义在于,设置一个相对时间,在该非简单请求在服务器端通过检验的那一刻起, //当流逝的时间的毫秒数不足访问控制最大年龄时,就不需要再进行预检,可以直接发送一次请求' ctx.set('访问控制-最大年龄',3600 * 24);如果(CTX。方法==' OPTIONS '){ CTX。body=200} else { wait next();} }}登录

这个系统属于强制登录的,登录统一进行了处理。

const Store=require('././utils/Store’);const redis=new Store();模块。导出=()={返回异步(CTX,下一个)={ //白名单如果(CTX。请求。URL==='/API/log in '){返回等待下一个();} const SESSIONID=CTX。饼干。get(' SESSIONID ');if(!会话id){返回CTX。body={ mes : '没有携带SESSIONID~ ',data: ' ',err_code: 1,success: false,};} const redis data=await redis。get(SESSIONID);if(!redis数据){返回CTX。body={ mes : ' SESSIONID已经过期~ ',data: ' ',err_code: 1,success: false,};} if(redis数据redis数据。uid){控制台。日志(` s登录了,用户用户界面设计(用户界面设计的缩写)为$ { redis数据。uid } `);等待下一个();} }}七、操作壳脚本

举个例子,创建项目分支

让路径=' ';//项目路径//创建分支const branch _ name=` branch _ $ { new Date().getTime()} `;比较exec sync(`/data/蒲公英-服务器/外壳/创建分支。sh $ { path } $ { branch _ name } `);#!/bin/bash CD $ 1 git拉原点主git结账-b $ 2 git推集-上游产地2美元八、连接数据库

config.js配置文件

让dbConf=nullconst DEV={ database : '蒲公英',//数据库user: 'root ',//用户password: '123456 ',//密码端口: '3306 ',//端口host: '127.0.0.1' //服务互联网协议(互联网协议的缩写)地址}const PRO={ database: '蒲公英',//数据库user: 'root ',//用户password: '123456 ',//密码端口: '3306 ',//端口host: 'xx.xx.xx.xx' //服务互联网协议(互联网协议的缩写)地址} dbConf=PRO//这个可以通过判断区分开发环境module.exports=dbConf数据库连接文件

const MySQL=require(' MySQL ');const dbConf=require('。/./config/DBconf ');const pool=MySQL . createpool({ host : dbconf . host,user: dbConf.user,password: dbConf.password,database: dbConf.database,})让query=function(sql,values){ return new Promise((resolve,reject)={ pool . getconnection(function(err,connection) { if (err,connection){ reject(err)} else { connection . query(SQL,values,(err,Rows)={if (err) {reject (errrelease()})})})模块。导出={query,}可以在模型层调用~

const {query}=require('./common/MySQL’);class user model { constructor(){ }/* * * @ description :根据pid和did创建分支* @param {pid}项id * @param {did}要求id * @param {branch_name}分支名称* @return:分支信息*/async insert branch info(SQL params){ const SQL=' insert branch _ info(PID,bid,branch_name,pub _ time)值(?)';console.log(sql)让数据=wait query(SQL,sqlParams,(err,result)={ return result;});返回数据;}} IX。域名

如果您没有购买域名,请在本地修改主机(您可以直接使用工具)

47.107.188.xx是服务器IP

m.xue.com

摘要

第一次自己搭建一个完整的项目,从前端到后端。

尤其是后端,作为一个前端小白,从学习如何使用服务器到Linux/vim/shell/ningnx/PM2/redis/session/MySQL/KOA 2。我们不再像以前那样直接看其他项目,而是一步一步地学习。虽然都是表面文章,但我们觉得自己的知识体系丰富多了。我也学到了很多关于持续集成的知识。当然我做的小项目还是比较简单的~如果你喜欢,请点赞鼓励。(_ _)嘻嘻.详细用途在前端项目和后端项目。感兴趣的可以看看,点个星~

以上是边肖介绍的自动化部署项目的详细讲解和集成,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:如何自动部署项目?折腾服务器之旅~是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。