前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录

app/
├── container/
│   ├── init.sh
│   ├── nginx.conf.template
├── src/
├── .gitlab-ci.yml
└── deploy.sh
└── Dockerfile
└── Makefile

container目录是放nginx的配置文件,给nginx镜像使用
.gitlab-ci.yml和Makefile是cicd自动发版,适用于测试环境和生产环境
deploy.sh是使用shell手动发版,适用于开发环境

下面是以上配置文件

init.sh
主要作用是根据env环境变量替换nginx的反向代理地址

#!/bin/bash
BACKENDURL=$BACKENDURL
export "BACKENDURL"=$BACKENDURL
envsubst '$BACKENDURL' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf && nginx -g 'daemon off;'

nginx.conf.template

user root;
events {worker_connections  4096;  ## Default: 1024
}http {proxy_connect_timeout 300000;   #连接握手时间proxy_send_timeout 300000;     # 设置发送超时时间,proxy_read_timeout 300000;     # 设置读取超时时间。client_max_body_size 100M;include /etc/nginx/mime.types;sendfile on;server {listen 80;listen [::]:80;add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requested-With,access-token,Access-Token,Refresh-Token,Accept,Content-Type,User-Agent;add_header Access-Control-Allow-Methods GET,POST,OPTIONS;location / {root   /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html;}location ^~/api/ {proxy_set_header Host $host;proxy_set_header  X-Real-IP        $remote_addr;proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;proxy_set_header X-NginX-Proxy true;proxy_pass $BACKENDURL; #后端实际服务器地址add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requested-With,access-token,Access-Token,Refresh-Token,Accept,Content-Type,User-Agent;add_header Access-Control-Allow-Methods GET,POST,OPTIONS;}}
}

Dockerfile
镜像内编译打包,因为服务器上可能有多个node项目版本会有兼容问题,直接容器内编译

# 编译打包
FROM node:18-alpine as builder
WORKDIR /app
COPY package.json .
ENV NODE_OPTIONS=--openssl-legacy-provider
RUN npm install
COPY . .
RUN npm run build# 运行应用
FROM nginx:latest
COPY --from=builder /app/dist /usr/share/nginx/html
COPY container/nginx.conf.template /etc/nginx/nginx.conf.template
COPY container/init.sh /init.sh
RUN chmod 777 init.sh
EXPOSE 80CMD ["/bin/bash", "/init.sh"]

deploy.sh
人工发版时运行脚本
部署脚本里面打包命令、项目名字、端口、后端地址记得更换

#!/bin/bash
set -xfunction show_help {echo "Usage: $0 [OPTIONS]"echo "Options:"echo "  --mode=<mode>   Set the mode (local, dev, test, prod)"
}
# 保存输入的参数
args=("$@")
# 使用 shift 命令去除已处理的位置参数
shift
# 处理命令行参数
for ((i = 0; i < "${#args[@]}"; i++)); docase "${args[$i]}" in--mode=* | -mode=*)mode="${args[$i]#*=}";;--mode | -mode)mode="${args[$((i + 1))]}";;--help)show_helpexit 0;;esac
done
# 如果 mode 不在合法的模式值中,则输出错误信息
if ! $valid; thenecho "mode值只能是:空值 local, dev, test, prod."exit 1
fi
# 根据 mode 设置不同的 BACKENDURL 地址
if [ "$mode" == "dev" ]; thenBACKENDURL="http://xxxx"
elif [ "$mode" == "test" ]; thenBACKENDURL="http://xxxx"
elif [ "$mode" == "prod" ]; thenBACKENDURL="-"
elseBACKENDURL="http://xxxx"
finame="project"
port=8080
version="latest"
current_user=$(whoami)
echo "当前用户:${current_user}"
# 拉代码和打包镜像
git pull
# 设置 node_modules 为当前用户
sudo chown -R $current_user:$current_user ./
sudo docker build -f Dockerfile -t $name:$version .
# 停止并删除容器
sudo docker stop "$name"
sudo docker rm "$name" -f
# 启动容器
sudo docker run --restart=always --name $name -p $port:80 -e BACKENDURL="$BACKENDURL" -d $name:$version

人工发版

运行命令

# 记得先给部署脚本+执行权限
chmod +x ./deploy.sh
./deploy.sh --mode dev

运行截图
在这里插入图片描述
在这里插入图片描述
项目成功运行
然后浏览器访问:http://xxx.xxx.com:21000

gitlab-cicd的下一篇文章写叭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云 EMR Serverless Spark 版开启免费公测

阿里云 EMR Serverless Spark 版是一款云原生&#xff0c;专为大规模数据处理和分析而设计的全托管 Serverless 产品。它为企业提供了一站式的数据平台服务&#xff0c;包括任务开发、调试、调度和运维等&#xff0c;极大地简化了数据处理的全生命周期工作流程。使用 EMR Serve…

LayUI使用(一)点击树组件的右边空白区域也可响应事件

前提&#xff1a; 如下&#xff0c;希望能够点击右边的空白区域也能够响应&#xff0c;而不仅仅是点击文本才响应 分析流程 一开始问了chatgpt&#xff0c;但它给的方案太麻烦了&#xff0c;而且还有错误&#xff0c;因此自己上手F12进入调试模式&#xff0c;点击查看最终渲…

工作流之节点回退, 回退到上一个节点

工作流审批流程会遇到, 审批不通过, 回退到指定节点, 或者回退到上一个节点. 回退到指定节点, 通过moveTo 实现 回退到上一个节点, 假如当前节点流入得分支有很多, 该如何判断上个节点是谁呢? 上一个节点是谁 根据流程的节点记录判断, 按照时间倒序, 找到上一个办理节点. …

文件外发审核是数据防泄漏的重要手段,那该怎么落地?

企业在日常经营中&#xff0c;无可避免地会产生文件外发的需求&#xff0c;文件发送对象包括但不限于合作方、供应商、客户、公关媒体、慈善组织等等&#xff0c;不一而足。而由于外发的对象不同&#xff0c;所涉及的文件类型也多种多样&#xff1a; 商业合作合同&#xff1a;…

STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位(三)

STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位&#xff08;三&#xff09; 文章目录 STM32开发学习——使用 Cortex-M3M4M7 故障异常原因与定位&#xff08;三&#xff09;文档说明&#xff1a;官方参考文档线上链接&#xff08;可在线阅读与下载&#xff09;&#…

AWS数据库之Amazon RDS

Amazon RDS 是一种 Web 服务&#xff0c;它让用户能够在云中轻松设置、运行和扩展关系数据库。它在承担耗时的数据库管理任务的同时&#xff0c;又可提供经济高效的可调容量&#xff0c;使您能够腾出时间专注于应用程序和业务。 Amazon RDS - AWS 定价的工作原理

【Python脚本随手笔记】-- 将 “庆余年2” 等信息写入 Txt 文件中

&#x1f48c; 所属专栏&#xff1a;【Python脚本随手笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

《Effective Objective-C 2.0》读书笔记——接口与API设计

目录 第三章&#xff1a;接口与API设计第15条&#xff1a;用前缀避免命名空间冲突第16条&#xff1a;提供“全能初始化方法”第17条&#xff1a;实现description方法第18条&#xff1a;尽量使用不可变对象第19条&#xff1a;使用清晰而协调的命名方式第20条&#xff1a;为私有方…

Altair® Squeak and Rattle Director™ 品质认知度解决方案

Altair Squeak and Rattle Director™ 品质认知度解决方案 借助 Altair 的 Squeak and Rattle Director&#xff0c;计算机辅助工程 (CAE) 的工程专业人士和初学者都能在早期设计阶段快速识别并消除产品中的异响。通过在简化的半自动化流程&#xff08;已完全集成到 Altair Hy…

【ELK日志收集过程】

文章目录 为什么要使用ELK收集日志ELK具体应用场景ELK日志收集的流程 为什么要使用ELK收集日志 使用 ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;进行日志收集和分析有多种原因。ELK 堆栈提供了强大、灵活且可扩展的工具集&#xff0c;能够满足现代 IT 系统对…

在Spring Boot中Redis实现事务有哪些方式?

在Spring Boot中操作Redis并实现事务有多种方式&#xff0c;常见的有以下几种&#xff1a; 1. 使用Spring Data Redis的SessionCallback Spring Data Redis提供了SessionCallback接口&#xff0c;允许你在一个会话中执行多个Redis操作&#xff0c;从而实现事务。具体步骤如下…

VMware ESXI 7.0安装部署

1、为什么要虚拟化&#xff1f; 目前&#xff0c;物理服务器存在以下几个问题&#xff1a; 1&#xff09;硬件资源利用率低&#xff1b; 2&#xff09;可靠性不足&#xff0c;物理服务器宕机即可造成整体业务停摆&#xff1b; 3&#xff09;维护量大&#xff0c;无法实现统…

7个常见的SQL慢查询问题及其解决方法

大家好&#xff0c;得益于摩尔定律&#xff0c;计算机性能已大幅提升&#xff0c;加上数据库的进步以及微服务所倡导的各种反模式设计&#xff0c;因此现在编写复杂SQL查询的机会越来越少。业界已经开始提倡不要进行专门的SQL优化&#xff0c;因为节省下来的资源并不足以抵消员…

人工智能的明天:机器学习与自动化的演进之旅

方向一&#xff1a;技术革新与行业应用 现状分析&#xff1a; 当前的IT行业正处于一个技术革新的高峰期。量子计算虽然还处于研究和开发阶段&#xff0c;但其潜力巨大&#xff0c;未来可能在药物发现、材料科学和复杂系统模拟等领域带来突破。虚拟现实&#xff08;VR&#xff…

JAVA面试题大全(九)

1、为什么要使用 spring&#xff1f; 方便解耦&#xff0c;便于开发支持aop编程声明式事务的支持方便程序的测试方便集成各种优秀的框架降低JavaEE API的使用难度 2、解释一下什么是 aop&#xff1f; AOP 是 Aspect-Oriented Programming 的缩写&#xff0c;中文翻译为“面向…

HTML5表单控件:新时代的交互魔法手册

&#x1f680;HTML5表单控件&#xff1a;新时代的交互魔法手册 &#x1f3af;HTML5表单控件速览&#xff1a;新面孔&#xff0c;新功能1. 日期时间选择器&#xff08;Date & Time Picker&#xff09;2. 数字输入框&#xff08;Number Input&#xff09;3. 搜索框&#xff0…

argparse.ArgumentParser()用法举例

1. 应用场景 我们在玩深度学习&#xff0c;训练模型的时候&#xff0c;会涉及到很多的参数&#xff0c;这个时候就需要用到argparse.ArgumentParser()方法&#xff0c;它的优点是方便在命令行调用的时候修改参数&#xff0c;为了快速了解该方法的应用&#xff0c;这里举例说明…

如何通过LoadRunner进行全链路压测

LoadRunner是Micro Focus公司开发的一款性能测试工具&#xff0c;广泛应用于企业级应用的性能和负载测试。全链路压测&#xff08;End-to-End Load Testing&#xff09;是对整个系统在真实负载下的表现进行测试&#xff0c;涵盖前端、后端和所有中间组件。以下是通过LoadRunner…

深度学习之Tensorflow卷积神经网络手势识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手势识别是计算机视觉和人工智能领域的重要应用之一&#xff0c;具有广泛的应用前景&#xff…

日用百货元宇宙 牛奶、羊奶、骆驼奶……到底哪个奶营养价值更高?

如今生活水平高了&#xff0c;奶的营养价值日益受到重视。从开始只有牛奶&#xff0c;到现在市面上羊奶、马奶、骆驼奶……花样变得越来越多。但同时很多疑问也随之而来&#xff0c;到底哪种奶营养价值更高&#xff1f;牛奶、羊奶、马奶……有什么区别&#xff1f; 牛奶&#x…