使用Jenkins部署前端Vue项目和后端Java服务

news2024/11/18 15:26:01

Jenkins安装相关插件,供后续使用(Dashboard - Manage Jenkins - Plugins)

Maven Integration plugin  icon-default.png?t=N7T8https://plugins.jenkins.io/maven-plugin

CloudBees Docker Build and Publish pluginicon-default.png?t=N7T8https://plugins.jenkins.io/docker-build-publishNodeJS Pluginicon-default.png?t=N7T8https://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/profile

AppHome=/app/api/
AppName=api.jar
LogPath=logs/sys-info.log

echo "应用程序 $AppName 执行停止"

PID=""
query(){
	PID=`ps -ef | grep java | grep $AppName | grep -v grep | awk '{print $2}'`
}

query
if [ x"$PID" != x"" ]; then
	kill -TERM $PID
	
	while [ x"$PID" != x"" ]
	do
		echo "应用程序 $AppName (pid:$PID) 正在停止"
		sleep 1
		query
	done
	echo "应用程序 $AppName 停止成功"
else
	echo "应用程序 $AppName 已经停止"
fi


sleep 1


echo "应用程序 $AppName [test] 执行启动"

if [ ! -d $AppHome ]; then
	echo "创建目录 $AppHome"
	mkdir $AppHome
fi

if [ ! -d ${AppHome}logs ]; then
	echo "创建目录 ${AppHome}logs"
    mkdir ${AppHome}logs
    
    echo "创建文件 $AppHome$LogPath"
    touch $AppHome$LogPath
fi

mv $WORKSPACE/target/*.jar $AppHome$AppName

echo "正在启动"
if [ -f $AppHome$AppName ]; then 
	BUILD_ID=KeepAlive
	nohup java -jar $AppHome$AppName --spring.profiles.active=prod --server.port=$port > /dev/null 2>&1 &

	sleep 5
    tail -50 $AppHome$LogPath
    
    sleep 5
    tail -50 $AppHome$LogPath
    
    sleep 5
    tail -50 $AppHome$LogPath
else
	echo "应用程序 $AppName 启动失败:文件不存在"
fi

(2)Vue项目

Post Steps - Execute shell  

#!/bin/bash
source /etc/profile

AppHome=/app/ui/

echo "开始重新打包"
npm install

echo "清理工作区缓存"
rm -rf $WORKSPACE/dist/*

echo "开始打包:prod"
npm run build:prod

echo "删除上次复制的文件"
rm -rf $AppHome

if [ ! -d $AppHome ]; then
	echo "创建目录 $AppHome"
	mkdir $AppHome
fi

echo "开始重新复制"
cp -rf $WORKSPACE/dist/* $AppHome 

echo "部署成功"

 二、使用Docker + Pipline

Dockerfile参考上文。

(1)Java项目

流水线 Pipeline script

pipeline {
    agent any
    
    environment {
        // 在 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 container
                    sh "docker stop ${ctName} || true"
                    sh "docker rm ${ctName} || true"
                    sh "docker rmi ${imageName} || true"

                    // Build Docker image
                    sh "docker build -f Dockerfile -t ${imageName} ."

                    // Start a new container
                    sh "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 any
    
    environment {
        // 在 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 container
                    sh "docker stop ${ctName} || true"
                    sh "docker rm ${ctName} || true"
                    sh "docker rmi ${imageName} || true"

                    // Build Docker image
                    sh "docker build -f Dockerfile -t ${imageName} ."

                    // Start a new container
                    sh "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两个文件

 

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

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

相关文章

Unity中的UI系统之GUI

目录 概述工作原理和主要作用基础控件重要参数及文本和按钮多选框和单选框输入框和拖动条图片绘制和框 复合控件工具栏和选择网络滚动视图和分组窗口 自定义整体样式自定义皮肤样式 概述 什么是UI系统 UI是User Interface(用户界面)的简称,用…

【pytorch】函数记录

你好你好! 以下内容仅为当前认识,可能有不足之处,欢迎讨论! 文章目录 torch.sum()torch.argmax()torch.nn.Parametertorch.unbindtorch.optim.Adam()[^adam]torch.cattorch.unsqueeze()torch.normalize()[^l2]torch.eyetorch.mmto…

网站https证书申请方式

网站HTTPS证书,也称为SSL证书或TLS证书,是一种数字证书,用于在用户浏览器与网站服务器之间建立安全的加密连接。当网站安装了HTTPS证书后,用户访问该网站时,浏览器地址栏会显示为"https://"开头,…

NoSQL--虚拟机网络配置

目录 1.初识NoSQL 1.1 NoSQL之虚拟机网络配置 1.1.1 首先,导入预先配置好的NoSQL版本到VMware Workstation中 1.1.2 开启虚拟机操作: 1.1.2.1 点击开启虚拟机: 1.1.2.2 默认选择回车CentOS Linux(3.10.0-1127.e17.x86_64) 7 …

微服务架构 SpringCloud

单体应用架构 将项目所有模块(功能)打成jar或者war,然后部署一个进程--医院挂号系统; > 优点: > 1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。 > 2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的…

STM32标准库开发—硬件SPI外设

SPI外设简介 SPI1与SPI2所挂载的总线位置不一样,所以时钟频率也不一样,SPI2挂载在APB1时钟频率为36MHZ是SPI1的一半 I2S是一种音频传输协议,适用于STM32大容量产品 一般来说串口发送数据时是低位先行,SPI通信是高位先行 SPI框图 发…

173基于matlab的经典STAP处理机载雷达信号

基于matlab的经典STAP处理机载雷达信号,空时自适应信号处理的典型算法、滤波器和相关参数的仿真,程序已调通,可直接运行。 173 matlab 空时自适应信号处理 STAR (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d9cf11000000000102b…

谷歌seo推广好还是竞价排名好?

事实上seo跟sem竞价并没有任何冲突,也并没有哪个更好的说法,关键在于理解它们各自的优势与局限性,并根据你的业务,预算来配合 Seo推广的优势在于成本,只要你的网站在搜索结果获得高排名,就能有源源不断的点…

GaN建模:强大但富有挑战性

来源:Modeling GaN: Powerful but Challenging(10年) 文章的研究内容 这篇文章主要研究了氮化镓(GaN)高电子迁移率晶体管(HEMTs)的建模问题。GaN HEMTs是微波频段高功率发射器设计中的关键技术…

azure devops工具实践分析

对azure devops此工具的功能深挖,结合jira的使用经验的分析 1、在backlog的功能描述,可理解为需求项,这里包括了bug,从开发的角度修复bug也是个工作项,所以需求的范围是真正的需求(开发接收到的已经确认的…

【Kubernetes】k8s中容器之间、pod之间如何进行网络通信?

目录 PodKubernetes 网络模型同一Pod上的容器之间进行通信同一Node上的不同Pod之间进行通信不同Node上的Pod之间进行通信Service参考 Pod 首先来回顾一下Pod: Pod 是用于构建应用程序的最小可部署对象。单个 Pod 代表集群中正在运行的工作负载,并封装一…

Spring 事务传播机制

事务传播机制:多个事务⽅法存在调⽤关系时, 事务是如何在这些⽅法间进⾏传播的。 ⽐如:有两个⽅法A,B都被 Transactional 修饰,,A⽅法调⽤B⽅法 A⽅法运⾏时, 会开启⼀个事务。当A调⽤B时, B⽅法本⾝也有事务&#xf…

Golang Base64 编码:Go语言编码全面指南

在编码和解码数据的领域中,Base64作为一种广泛使用的方案脱颖而出,它提供了二进制数据的紧凑表示形式。Golang凭借其强大的标准库,提供了一种无缝且高效的方式来执行Base64编码。在这篇博客文章中,我们将通过Golang的Base64编码能…

mysql修改字段的长度锁表问题

mysql修改字段的长度锁表问题 背景 MySQL(这里指5.6及其后续版本)修改字段的长度锁表会锁表吗?答案是可能会但不一定会 具体原理 MySQL 5.6 及以后版本扩大字段长度 支持 online ddl in-place 模式,而这将不会锁表。varchar 表示…

链表之“带头双向循环链表”

目录 ​编辑 1.链表的分类 2.带头双向循环链表的实现 1.创建结构体 2.创建返回链表的头节点 3.双向链表销毁 4.双向链表打印 5.双向链表尾插 6.双向链表尾删 7.双向链表头插 8.双向链表头删 9.双向链表查找 10.双向链表在pos的前面进行插入 11.双向链表删除pos位…

Java+SpringBoot+Vue+MySQL:狱内罪犯危险性评估系统全栈开发

✍✍计算机毕业编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java、…

抖音短视频提取器|视频内容批量提取软件

抖音短视频提取器是一款功能强大的工具,旨在解决用户获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们希望用户能够通过简单的关键词搜索,实现自动批量抓取视频,并根据需要进行选择性批量下载。基于C#开发的这款工具不仅支持通过关键词…

进程的通信以及信号的学习

一,进程的通信: 种类:1.管道 2.信号 3.消息队列 4.共享内存 5.信号灯 6.套接字 1.管道: 1.无名管道 无名管道只能用于具有亲缘关系的进程间通信 pipe int pipe(int pipefd[2]); 功能: 创建一个无名管道 …

美创科技荣获“2023年网络安全国家标准优秀实践案例”

近日,全国网络安全标准化技术委员会正式公布2023年网络安全国家标准优秀实践案例获奖名单。 杭州美创科技股份有限公司(以下简称:美创科技)申报的“GB/T 20281-2020《信息安全技术 防火墙安全技术要求和测试评价方法》在政企领域数…

2023年清洁纸品行业分析报告:线上市场销额突破124亿,湿厕纸为重点增长类目

如今,清洁纸品早已经成为人们日常生活的必需品,其市场规模也比较庞大。从销售数据来看,尽管2023年清洁纸品市场整体的销售成绩呈现下滑,但其市场体量仍非常大。 鲸参谋数据显示,2023年京东平台上清洁纸品市场的销量将…