使用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 子类可以作用于不同场景,且听…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
