Jenkins 自动打包项目镜像部署到服务器 ---(前端项目)

Jenkins 新增前端项目Job

指定运行的节点

选择部署运行的节点标签,dev标签对应开发环境
在这里插入图片描述
在这里插入图片描述
节点的远程命令执行配置
jenkins完整流程

配置源码 拉取

在这里插入图片描述

Credentials添加

触发远程构建

配置后可以支持远程触发jenkins构建(比如自建的CICD自动化发布平台),不需要远程构建的可以不配置
在这里插入图片描述
token生成配置

Build Steps

采用shell脚本模式

# jenkins服务Job运行的工作空间项目存放地址
codeRootDir="/data/jenkins/workspace/Dev.xx.Web"
# 项目部署远程服务器地址
remoteHost="10.30.222.11"
# 远程部署服务器存放镜像地址
remoteRootDir="/data/websites/images"
# 生成的项目镜像名称
dockerImageName="img.xx.web.dev"
# 运行的容器名称
containerName="xx.web.dev"# 确保工作空间拥有该目录
mkdir -p ${codeRootDir}
# 切换到工作目录
cd ${codeRootDir}echo build start
#指定镜像地址
npm config set registry https://registry.npmmirror.com/
#安装Vue项目依赖
npm install @vue/cli-plugin-eslint@latest --legacy-peer-deps
# 打包(根据Vue项目中的配置来)
npm run build
echo build endecho "Building Docker image..."
# 开始构建镜像(注意dockerfile 要在codeRootDir目录下)
docker build -t "${dockerImageName}:latest" "${codeRootDir}"
echo "Docker image built successfully."#压缩保存镜像到codeRootDir目录下
echo "Saving Docker image to file..."
docker save "${dockerImageName}:latest" | gzip > "${codeRootDir}/${dockerImageName}.tar.gz"
echo "Docker image saved successfully."# 远程传输到目标服务器
echo "Uploading Docker image to server..."
# 确保远程服务有此目录
ssh root@"${remoteHost}" "mkdir -p ${remoteRootDir}"
# 传输镜像到远程目录
scp -C "${codeRootDir}/${dockerImageName}.tar.gz" root@"${remoteHost}":"${remoteRootDir}/"
echo "Upload completed."# 远程执行命令
echo "Deploying on remote server..."
ssh root@"${remoteHost}" "
cd ${remoteRootDir} &&
# 解压镜像,并加载镜像到本地
gunzip -c ${dockerImageName}.tar.gz | docker load &&
# 查询当前是否有该镜像服务运行,有则删除该镜像后从新运行镜像
docker ps -q --filter 'name=${containerName}' | grep -q . && docker rm -f ${containerName} || true &&
docker run -d --name ${containerName} --privileged=true --restart=always -p 8090:80 ${dockerImageName}:latest
"
echo "Deployment completed."

Vue项目代码对应改造

在这里插入图片描述
在项目package.json同级目录下创建 Dockerfile、nginx.conf、nginx.default.config 文件

package.json

定义的install 、 bulid 、run命令

"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","build:report": "vue-cli-service build --report","globle": "npm install -g cnpm --registry=https://registry.npm.taobao.org&&cnpm i rimraf npm-check-updates nrm -g&&rimraf node_modules&&cnpm i","lint": "eslint --fix --ext .js,.vue src","lint:style": "stylelint-config-prettier-check","inspect": "vue-cli-service inspect","template": "plop","clear": "rimraf node_modules&&npm install --registry=https://registry.npm.taobao.org","use:npm": "nrm use npm","use:taobao": "nrm use taobao","update": "ncu -u --reject sass-loader,sass,screenfull,eslint&&cnpm i","update:globle": "ncu -g --concurrency 10 --timeout 80000","push": "start ./push.sh","deploy": "start ./deploy.sh"},

Dockerfile

FROM nginxMAINTAINER vue-admin-beautiful
LABEL description=本项目基于vue-admin-beautiful开源版构建
LABEL qq=783963206# 环境变量
ENV TZ=Asia/Shanghai \RUN_USER=nginx \RUN_GROUP=nginx \DATA_DIR=/data/web \LOG_DIR=/data/log/nginx# 工作目录
WORKDIR ${DATA_DIR}# 日志输出
RUN ["echo","vue-admin-beautiful - UI building..."]# 切换为上海时区
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime \&& echo $TZ > /etc/timezone# 创建日志文件夹
RUN mkdir ${LOG_DIR} -p
RUN chown nginx.nginx -R ${LOG_DIR}# 拷贝dist包文件
COPY ./dist ./# 拷贝nginx配置文件
ADD nginx.conf /etc/nginx/nginx.conf
ADD nginx.default.conf /etc/nginx/conf.d/default.confEXPOSE 80
ENTRYPOINT nginx -g "daemon off;"

nginx.conf

user  nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;events {use epoll;worker_connections 51200;multi_accept on;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server_names_hash_bucket_size 512;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 50m;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;tcp_nopush     on;tcp_nodelay on;keepalive_timeout  65;# gzip 压缩gzip on;gzip_min_length  1k;gzip_buffers     4 16k;gzip_http_version 1.1;gzip_comp_level 2;gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;gzip_vary on;gzip_proxied   expired no-cache no-store private auth;gzip_disable   "MSIE [1-6]\.";limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn_zone $server_name zone=perserver:10m;include /etc/nginx/conf.d/*.conf;
}

nginx.default.conf

server {listen       80;server_name  localhost;access_log  /data/log/nginx/access.log  main;error_log   /data/log/nginx/error.log;# 静态资源location / {root   /data/web;index  index.html index.htm;try_files $uri $uri/ /index.html;}# 前端代理(注意这里需要填写 真实后端ip)location /api/ {//注意 http:ip:8090/ 和http:ip:8090的区别// http:ip:8090/会去掉/api这一层 // http:ip:8090 不会去掉/api这一层proxy_pass http://~~真实后端ip:8090~~ ;add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Credentials: true;add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE;proxy_http_version 1.1;# 连接延时proxy_connect_timeout 3600s;proxy_read_timeout 3600s;proxy_send_timeout 3600s;# IP 穿透proxy_set_header        Host $proxy_host;proxy_set_header        X-Real-IP $remote_addr;proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;# WebSocket 穿透proxy_set_header Origin "";proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}

网络请求路径

部署前端项目地址
remoteHost=“10.30.222.11”
在这里插入图片描述

// 服务的地址+8090 根据nginx配置对应转发到真实的ip中

vue项目默认请求前缀
http://10.30.222.11:8090/api
在这里插入图片描述

构建部署

在这里插入图片描述

部署成功日志

在这里插入图片描述

访问路径

10.30.222.11:8090
在这里插入图片描述

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

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

相关文章

7.2 - 定时器之计算脉冲宽度实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过CPU私有定时器来计算按键按下的时间长短。 2 系统框图 参见7.1。 3 软件设计 注意事项: 定时器是递减计数的,需要考虑StartCount<EndCount的情况。 /***********…

双机热备旁挂组网实验

1拓扑图 2.要求 1 、 SW3 的流量 正常情况下: SW1_VRF-->FW1--->SW1_Public--->R5 故障情况下: SW2_VRF-->FW2--->SW2_Public--->R6 2 、 SW4 的流量 正常情况下: SW2_VRF-->FW2--->SW2_Public--->R6 故障情…

2025春新生培训数据结构(树,图)

教学目标: 1,清楚什么是树和图,了解基本概念,并且理解其应用场景 2,掌握一种建图(树)方法 3,掌握图的dfs和树的前中后序遍历 例题与习题 2025NENU新生培训(树&#…

HTML 日常开发常用标签

文章目录 HTML 日常开发常用标签1、基本结构标签2、内容标签3、多媒体标签4、表单标签5、列表和定义标签6、表格标签7、链接和图像8、元数据9、语义化标签(HTML5新增)10、框架和内联11、交互12、过时或不推荐使用的标签 HTML 日常开发常用标签 1、基本结…

7.1.1 计算机网络的组成

文章目录 物理组成功能组成工作方式完整导图 物理组成 计算机网络是将分布在不同地域的计算机组织成系统,便于相互之间资源共享、传递信息。 计算机网络的物理组成包括硬件和软件。硬件中包含主机、前端处理器、连接设备、通信线路。软件中包含协议和应用软件。 功…

【AI论文】MedVLM-R1:通过强化学习激励视觉语言模型(VLMs)的医疗推理能力

摘要:推理是推进医学影像分析的关键前沿领域,其中透明度和可信度对于赢得临床医生信任和获得监管批准起着核心作用。尽管医学视觉语言模型(VLMs)在放射学任务中展现出巨大潜力,但大多数现有VLM仅给出最终答案&#xff…

国产RISCV64 也能跑AI

Banana Pi BPI-F3 进控时空 K1开发板 AI人工智能AI 部署工具使用手册_bianbu software-CSDN博客 文章置顶了 有兴趣的可以一起留言探索,非常有意思: 我最近接触到了进迭时空研发的 Spacengine™,这是一套能在进迭时空 RISC-V 系列芯片上部署…

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口: 配置路由 通过apisix 的API管理接口来创建(此路由,直接…

【WPF】绑定报错:双向绑定需要 Path 或 XPath

背景 最开始使用的是 TextBlock: <ItemsControl ItemsSource"{Binding CameraList}"><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel Orientation"Horizontal"/></ItemsPanelTemplate></ItemsControl.Item…

Kotlin协变与逆变区别

在Kotlin中&#xff0c;协变和逆变是泛型编程中的两个重要概念&#xff0c;它们允许我们在类型系统中更加灵活地处理类型关系。 1.协变&#xff1a;协变允许我们使用比原始类型更具体的类型。在kotlin中&#xff0c;通过在类型参数上加out关键字来表示协变,生产者&#xff0c;例…

如何调试Linux内核?

通过创建一个最小的根文件系统&#xff0c;并使用QEMU和GDB进行调试。 1.准备工作环境 确保系统上安装了所有必要的工具和依赖项。 sudo apt-get update //更新一下软件包 sudo apt-get install build-essential git libncurses-dev bison flex libssl-dev qemu-system-x…

Java 调试模式下 Redisson 看门狗失效

一、场景分析 前几天在做分布式锁测试&#xff1a; 在调试模式下&#xff0c;lock.lock() 之后打上断点&#xff0c;想测试一下在当前线程放弃锁之前&#xff0c;别的线程能否获取得到锁。 发现调试模式下&#xff0c;看门狗机制失效了&#xff0c;Redis 上 30 秒后&#xff0…

GPT-4.5震撼登场,AI世界再掀波澜!(3)

GPT-4.5震撼登场&#xff0c;AI世界再掀波澜! GPT-4.5震撼登场&#xff0c;AI世界再掀波澜!(2) &#xff08;一&#xff09;伦理困境&#xff1a;如何抉择 GPT-4.5 的强大功能在为我们带来诸多便利的同时&#xff0c;也引发了一系列深刻的伦理问题&#xff0c;这些问题犹如高…

【数据挖掘】Pandas

Pandas 是 Python 进行 数据挖掘 和 数据分析 的核心库之一&#xff0c;提供了强大的 数据清洗、预处理、转换、分析 和 可视化 功能。它通常与 NumPy、Matplotlib、Seaborn、Scikit-Learn 等库结合使用&#xff0c;帮助构建高效的数据挖掘流程。 &#x1f4cc; 1. 读取数据 P…

七、JOIN 语法详解与实战示例

一、JOIN 的作用与分类 JOIN 操作用于合并两个或多个表的行&#xff0c;基于表之间的关联字段。以下是常见的 JOIN 类型&#xff1a; JOIN 类型描述INNER JOIN返回两个表匹配的记录LEFT JOIN返回左表所有记录 右表匹配记录&#xff08;右表无匹配则为NULL&#xff09;RIGHT …

2019年01月全国POI数据分享(同源历史POI分享系列)

2019年01月全国范围POI数据 2019年01月份全国范围历史POI数据&#xff0c;全国范围所有类别共59336781个POI 2019年01月全国范围POI数据按大类统计 大类代码大类名称2019年01月该类POI数量010000汽车服务1151164020000汽车销售213647030000汽车维修517367040000摩托车服务1800…

Spring Boot + MyBatis 实现 RESTful API 的完整流程

后端开发&#xff1a;Spring Boot 快速开发实战 引言 在现代后端开发中&#xff0c;Spring Boot 因其轻量级、快速开发的特性而备受开发者青睐。本文将带你从零开始&#xff0c;使用 Spring Boot MyBatis 实现一个完整的 RESTful API&#xff0c;并深入探讨如何优雅地处理异…

使用Python开发以太坊智能合约:轻松入门与深度探索

使用Python开发以太坊智能合约&#xff1a;轻松入门与深度探索 随着区块链技术的快速发展&#xff0c;以太坊作为最为成熟和广泛使用的智能合约平台&#xff0c;成为了开发去中心化应用&#xff08;DApp&#xff09;的核心工具。智能合约不仅是区块链技术的基础&#xff0c;更…

ES scroll=1m:表示快照的有效时间为1分钟。怎么理解

在Elasticsearch中&#xff0c;scroll1m 表示你创建的 scroll 上下文 的有效时间为 1分钟。这个参数控制了你可以在多长时间内继续使用这个 scroll_id 来获取更多的数据。 什么是 Scroll 上下文&#xff1f; 当你使用 scroll API 时&#xff0c;Elasticsearch 会为你的查询创…

Linux与UDP应用1:翻译软件

UDP应用1&#xff1a;翻译软件 本篇介绍 本篇基于UDP编程接口基本使用中封装的服务器和客户端进行改写&#xff0c;基本功能如下&#xff1a; 从配置文件dict.txt读取到所有的单词和意思客户端向服务端发送英文服务端向客户端发送英文对应的中文意思 配置文件内容 下面的内…