使用Jenkins部署前端Vue项目和后端Java服务
Jenkins安装相关插件,供后续使用(Dashboard - Manage Jenkins - Plugins)
Maven Integration plugin
https://plugins.jenkins.io/maven-plugin
CloudBees Docker Build and Publish plugin
https://plugins.jenkins.io/docker-build-publishNodeJS Plugin
https://plugins.jenkins.io/nodejs
配置内置的工具及其版本 (Dashboard - Manage Jenkins - Tools)
比如 Maven JDK Git NodeJS Docker等
添加凭据,如SSH Private Key 用于拉取远程代码(Dashboard - Manage Jenkins - Credentials)
一、基础版本
(1)Java项目
# Build# Root POM
pom.xml# Goals and options
clean package -U -Dmaven.test.skip=true
Post Steps - Execute shell
#!/bin/bash
source /etc/profileAppHome=/app/api/
AppName=api.jar
LogPath=logs/sys-info.logecho "应用程序 $AppName 执行停止"PID=""
query(){PID=`ps -ef | grep java | grep $AppName | grep -v grep | awk '{print $2}'`
}query
if [ x"$PID" != x"" ]; thenkill -TERM $PIDwhile [ x"$PID" != x"" ]doecho "应用程序 $AppName (pid:$PID) 正在停止"sleep 1querydoneecho "应用程序 $AppName 停止成功"
elseecho "应用程序 $AppName 已经停止"
fisleep 1echo "应用程序 $AppName [test] 执行启动"if [ ! -d $AppHome ]; thenecho "创建目录 $AppHome"mkdir $AppHome
fiif [ ! -d ${AppHome}logs ]; thenecho "创建目录 ${AppHome}logs"mkdir ${AppHome}logsecho "创建文件 $AppHome$LogPath"touch $AppHome$LogPath
fimv $WORKSPACE/target/*.jar $AppHome$AppNameecho "正在启动"
if [ -f $AppHome$AppName ]; then BUILD_ID=KeepAlivenohup java -jar $AppHome$AppName --spring.profiles.active=prod --server.port=$port > /dev/null 2>&1 &sleep 5tail -50 $AppHome$LogPathsleep 5tail -50 $AppHome$LogPathsleep 5tail -50 $AppHome$LogPath
elseecho "应用程序 $AppName 启动失败:文件不存在"
fi
(2)Vue项目
Post Steps - Execute shell
#!/bin/bash
source /etc/profileAppHome=/app/ui/echo "开始重新打包"
npm installecho "清理工作区缓存"
rm -rf $WORKSPACE/dist/*echo "开始打包:prod"
npm run build:prodecho "删除上次复制的文件"
rm -rf $AppHomeif [ ! -d $AppHome ]; thenecho "创建目录 $AppHome"mkdir $AppHome
fiecho "开始重新复制"
cp -rf $WORKSPACE/dist/* $AppHome echo "部署成功"
二、使用Docker + Pipline
Dockerfile参考上文。
(1)Java项目
流水线 Pipeline script
pipeline {agent anyenvironment {// 在 Jenkins 全局工具配置中定义的插件安装的名称MAVEN_HOME = tool 'maven3.8.7'PATH="${MAVEN_HOME}/bin:${env.PATH}"GIT_SSH_COMMAND = 'ssh -i /var/lib/jenkins/.ssh/id_rsa'}stages {stage('MAVEN Versions') {steps {echo 'MAVEN version:'sh 'mvn -v'}}stage('Clone Repository') {steps {script {// 使用指定的私钥克隆仓库并切换到分支checkout([$class: 'GitSCM', branches: [[name: 'pc']], userRemoteConfigs: [[credentialsId: 'f2564736-xxxx-xx-xx', url: 'git@xxxxxx.git']]])}}}stage('Build War') {steps {sh 'mvn clean package -U -Dmaven.test.skip=true'}}stage('Docker Build and Deploy') {steps {script {def imageName = 'api'def ctName = 'api-ct'// Stop and remove the previous containersh "docker stop ${ctName} || true"sh "docker rm ${ctName} || true"sh "docker rmi ${imageName} || true"// Build Docker imagesh "docker build -f Dockerfile -t ${imageName} ."// Start a new containersh "docker run --restart always -d -p 9008:9008 -e ACTIVE_PROFILE='pc' -e SERVICE_PORT='9008' --name $ctName --ulimit nofile=1024 --network host $imageName"}}} }post {success {echo 'Deployment successful!'}failure {echo 'Deployment failed!'}}
}
(2)Vue项目
流水线 Pipeline script
pipeline {agent anyenvironment {// 在 Jenkins 全局工具配置中定义的 Node.js 安装的名称NODEJS_HOME = tool 'node16.3.0'PATH="${NODEJS_HOME}/bin:${env.PATH}"GIT_SSH_COMMAND = 'ssh -i /var/lib/jenkins/.ssh/id_rsa'}stages {stage('Set npm Registry') {steps {script {sh 'npm config set registry https://registry.npmmirror.com'sh 'npm config get registry'}}}stage('Node and NPM Versions') {steps {echo 'Node version:'sh 'node -v'echo 'NPM version:'sh 'npm -v'}}stage('Clone Repository') {steps {script {// 使用指定的私钥克隆仓库并切换到 pc 分支checkout([$class: 'GitSCM', branches: [[name: 'pc']], userRemoteConfigs: [[credentialsId: 'f2564736-xx-x-xx-xxx', url: 'git@xxxxx.git']]])}}}stage('Install Dependencies') {steps {sh 'npm install --verbose --legacy-peer-deps'}}stage('Build') {steps {sh 'npm run build:hylt-pc'}}stage('Docker Build and Deploy') {steps {script {def imageName = 'ui'def ctName = 'ui-ct'// Stop and remove the previous containersh "docker stop ${ctName} || true"sh "docker rm ${ctName} || true"sh "docker rmi ${imageName} || true"// Build Docker imagesh "docker build -f Dockerfile -t ${imageName} ."// Start a new containersh "docker run --restart always -d -p 1908:1908 --name ${ctName} --network host ${imageName}"}}} }post {success {echo 'Deployment successful!'}failure {echo 'Deployment failed!'}}
}
注意此处使用的jenkins内置的nodejs和npm,Vue项目在部署过程中使用到了项目根目录下的Dockerfile和nginx.conf两个文件
相关文章:
使用Jenkins部署前端Vue项目和后端Java服务
Jenkins安装相关插件,供后续使用(Dashboard - Manage Jenkins - Plugins) Maven Integration plugin https://plugins.jenkins.io/maven-plugin CloudBees Docker Build and Publish pluginhttps://plugins.jenkins.io/docker-build-publish…...
刷题——显示屏
目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 解 题目描述 液晶屏上,每个阿拉伯数字都是可以显示成 35 的点阵的(其中 X 表示亮点,. 表示暗点)。现在给出数字位数(不超过 100100)和一串数…...
WEB服务器-Tomcat(黑马学习笔记)
简介 服务器概述 服务器硬件 ● 指的也是计算机,只不过服务器要比我们日常使用的计算机大很多。 服务器,也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障…...
第五节:Vben Admin权限-前端控制方式
系列文章目录 第一节:Vben Admin介绍和初次运行 第二节:Vben Admin 登录逻辑梳理和对接后端准备 第三节:Vben Admin登录对接后端login接口 第四节:Vben Admin登录对接后端getUserInfo接口 第五节:Vben Admin权限-前端控制方式 文章目录 系列文章目录前言一、Vben Admin权…...
蓝桥杯备赛第二篇(背包问题)
1. 01 背包(采用状态压缩) public static void main(String[] args) {Scanner scanner new Scanner(System.in);int M scanner.nextInt();int N scanner.nextInt();int[] value new int[N 1];int[] weight new int[N 1];int[] dp new int[M 1];…...
【postgresql 基础入门】带过滤条件的查询,where子句中的操作符介绍,案例展示,索引失效的大坑就在这里
查询数据-过滤数据 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&#…...
vue项目打包获取git commit信息并输出到打包后的指定文件夹中
需求背景: 前端项目经常打包,发包部署,为了方便测试及运维发现问题时与正确commit信息对比 实现方式: 使用Node.js的child_process模块来执行git命令 实现步骤: 1.在package.json的同级目录下新建一个version.js文件。…...
vue 移动端app预览和保存pdf踩坑
需求 使用Vue开发h5,嵌套到Android和IOS的Webview里,需要实现pdf预览和保存功能,预览pdf的功能,我这边使用了三个库,pdf5,pdf.js,vue.pdf,现在把这三个库在app端的坑分享一下。先说…...
Vueuse:打造高效的 Vue.js 开发利器
Vueuse:打造高效的 Vue.js 开发利器 Vueuse 是一个功能强大的 Vue.js 生态系统工具库,它提供了一系列的可重用的 Vue 组件和函数,帮助开发者更轻松地构建复杂的应用程序。本文将介绍 Vueuse 的主要特点和用法,以及它在 Vue.js 开发…...
mysql锁的创建方式
在 MySQL 中,锁是用来控制多个用户对同一数据的访问。主要有两种类型的锁:表级锁和行级锁。MySQL 的锁定机制主要是通过 SQL 语句来实现的,而不是通过特定的锁定命令。下面是一些常见的锁相关的 SQL 操作方式:表级锁 MySQL 中,表级锁是最基本的锁策略,它会锁定整个表。一…...
5.WEB渗透测试-前置基础知识-常用的dos命令
内容参考于: 易锦网校会员专享课 上一篇内容:4.WEB渗透测试-前置基础知识-快速搭建渗透环境(下)-CSDN博客 常用的100个CMD指令 1.gpedit.msc—–组策略 2. sndrec32——-录音机 3. Nslookup——-IP地址侦测器 ,是一个…...
解决:code ERESOLVE:ERESOLVE could not resolve 的报错问题
报错实例 报错原因 是我执行npm i xxx-xx的时候会出现这个错误 查了资料表示是node.js的问题 或者的依赖本身的问题 解决 1.在后面加上 --legacy-peer-deps 示例:npm i sass-loader7.3.1 --legacy-peer-deps 2,检查node版本,更改node版本 …...
Dockerfile(3) - WORKDIR 指令详解
WORKDIR 切换到镜像中的指定路径,设置工作目录在 WORKDIR 中需要使用绝对路径,如果镜像中对应的路径不存在,会自动创建此目录一般用 WORKDIR 来替代 切换目录进行操作的指令 RUN cd <path> && <do something> WORKDIR…...
2024万元投影仪怎么选?极米RS10 Ultra和当贝X5 Ultra实测横评
随着过去一年投影仪的不断进步,高端型号在2024年初的选择变得更加多样。除了激光外混光已然成为“金字塔顶端”的一种全新光源选择。目前主流的就是作为Dual Light 2.0新升级的极米RS10 Ultra,以及ALPD5.0超级全色激光代表当贝X5 Ultra。很多人也肯定想知…...
java环境搭建
要搭建 Java 环境,你需要进行以下步骤: 1. 下载和安装 JDK(Java Development Kit):访问 Oracle 官方网站(https://www.oracle.com/java/technologies/javase-jdk14-downloads.html),…...
【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)
引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 本文快速帮助开发者修改为自己名称的一个国标平台 文章目录 一、 预期效果展示二、 源码修改-前端三、 验证修改效果一、 预期效果展示 二、 源码修改-前端 需要修改的文件位置: 项目工程下web_src目录…...
【lv15 day1 设备号申请和注销】
一、Linux内核对设备的分类 linux的文件种类: -:普通文件 d:目录文件 p:管道文件 s:本地socket文件 l:链接文件 c:字符设备 b:块设备Linux内核按驱动程序实现模型框架的不同&#…...
JVM对象创建与内存分配机制
JVM对象创建与内存分配机制 JVM对象创建与内存分配机制 JVM对象创建与内存分配机制对象的创建过程内存分配对象栈上分配对象逃逸分析标量替换 对象在Eden区分配大对象直接进入老年代长期存活的对象将进入老年代对象年龄动态判断老年代空间分配担保机制 对象头与指针压缩对象头利…...
《TCP/IP详解 卷一》第10章 UDP和IP分片
目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子:IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…...
Android进阶之路 - RecyclerView停止滑动后Item自动居中(SnapHelper辅助类)
之前一直没注意 SnapHelper 辅助类的功能,去年的时候看到项目中仅通过俩行代码设置 RecyclerView 后就提升了用户体验,觉得还是很有必要了解一下,尝试过后才发现其 PagerSnapHelper、LinearSnapHelper 子类可以作用于不同场景,且听…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
