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

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.mfbz.cn/a/414712.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第64天/最后一天 | 84.柱状图中最大的矩形

今日任务 84.柱状图中最大的矩形 84.柱状图中最大的矩形 - Hard 题目链接:. - 力扣(LeetCode) 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾…

Opencv实战(3)详解霍夫变换

霍夫变换 Opencv实战系列指路前文: Opencv(1)读取与图像操作 Opencv(2)绘图与图像操作 文章目录 霍夫变换1.霍夫线变换1.1 原理1.2 HoughLines() 2.霍夫圆变换2.1 原理2.2 HoughCircles() 最基本的霍夫变换是从黑白图像中检测直线(线段) 霍夫变换(Hough Transform…

第三百七十回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容,本章回中将介绍timezone包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在…

Unity中URP下实现水体(水面反射)

文章目录 前言一、原理1、法一:使用立方体纹理 CubeMap,作为反射纹理使用2、法二:使用反射探针生成环境反射图,所谓反射的采样纹理 二、实现水面反射1、定义和申明CubeMap2、反射向量需要什么3、计算 N ⃗ \vec{N} N 4、计算 V ⃗…

linux服务器调度数据库的存储过程

1、需要安装数据库的客户端 2、安装sqlplus 3、编写sh脚本 脚本内容如下: 4、设置调度任务

React UI框架Antd 以及 如何按需引入css样式配置(以及过程中各种错误处理方案)

一、react UI框架Antd使用 1.下载模块 npm install antd -S 2.引入antd的样式 import ../node_modules/antd/dist/reset.css; 3.局部使用antd组件 import {Button, Calendar} from antd; import {PieChartTwoTone} from ant-design/icons; {/* 组件汉化配置 */} import l…

[机器视觉]halcon应用实例 边缘检测2

一个学习找边的实例2,用于练习相关算子,这个版本比较简单,少了一些对图像的处理。所以主要是用于练习思路和相关算子。只有用了,练了你在脑子里心才有收获。 边缘检测的步骤图解 代码 *直线找边 *清空屏幕,显式控制图…

express+mysql+vue,从零搭建一个商城管理系统5--用户注册

提示:学习express,搭建管理系统 文章目录 前言一、新建user表二、安装bcryptjs、MD5、body-parser三、修改config/db.js四、新建config/bcrypt.js五、新建models文件夹和models/user.js五、index.js引入使用body-parser六、修改routes/user.js七、启动项…

Linux------进程地址空间

目录 一、进程地址空间 二、地址空间本质 三、什么是区域划分 四、为什么要有地址空间 1.让进程以统一的视角看到内存 2.进程访问内存的安全检查 3.将进程管理与内存管理进行解耦 一、进程地址空间 在我们学习C/C的时候,一定经常听到数据存放在堆区、栈区、…

Linux shell:补充命令的使用

目录 一.导读 二.正文 三.结语 一.导读 上一篇介绍了脚本的简单概念以及使用,现在补充一些命令。 二.正文 目前处于全局目录,通过mkdir创建名我为day01的文件。 通过cd命令day01 切换至day01文件当中。 使用vim文本编辑器文件名(firstdir&…

Dledger部署RocketMQ高可用集群(9节点集群)

文章目录 🔊博主介绍🥤本文内容规划集群准备工作节点0配置(ip地址为192.168.80.101的机器)节点1配置(ip地址为192.168.80.102的机器)节点2配置(ip地址为192.168.80.103的机器)在所有…

基于springboot实现鞋类商品购物商城系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现鞋类商品购物商城系统演示 摘要 时代的变化速度实在超出人类的所料,21世纪,计算机已经发展到各行各业,各个地区,它的载体媒介-计算机,大众称之为的电脑,是一种特高速的科学仪器&#xf…

05|Mysql锁分类

1. 锁分类 1.1根据性能 乐观锁 ● 版本号 ● 读多场景 ● 第二次循环需要读取到最新的数据统计 示例 while{ // 1.调用方法获取当前版本号 getCurrentBalanceAndVersion(accountId); // 2.Java运算newBalance Balance 500; updateAccountBalance(account…

LVS+Keepalived高可用群集

一、Keepalived简介 Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务&…

低代码平台与MES:智能制造的新篇章

随着工业4.0和智能制造的兴起,企业对于生产过程的数字化、智能化需求日益迫切。传统的MES系统实施周期长、成本高,成为许多企业数字化转型的瓶颈。而低代码开发平台的出现为这一问题提供了新的解决思路。 一、万界星空科技低代码平台的优势: …

【项目管理】CMMI-质量保证过程

质量保证过程(PQA):通过质量保证活动,确保过程与产品满足过程、规程及相应的要求,确保问题得到关注与解决,使工作人员和管理者能够客观地了解过程与相关的工作产品。QA工程师应实施质量保证策划活动,客观地…

Leetcode—64. 最小路径和【中等】

2024每日刷题&#xff08;116&#xff09; Leetcode—64. 最小路径和 实现代码 class Solution { public:int minPathSum(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();vector<vector<int>> dp(m 1, vector<int&g…

代理ip并发是不是越大越好?为何对代理IP做出并发请求限制?

随着网络技术的不断发展&#xff0c;代理IP已成为许多人在上网时保护隐私和突破地域限制的重要手段。然而&#xff0c;在选择和使用代理IP时&#xff0c;有一个问题常常被人们提及&#xff1a;代理IP的并发数是不是越大越好&#xff1f;为何对代理IP做出并发请求限制&#xff1…

C++ 高频考点

1. C/C内存有哪几种类型&#xff1f; C中&#xff0c;内存分为5个区&#xff1a;堆(malloc)、栈(如局部变量、函数参数)、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#xff09;和常量存储区&#xff08;常量&…

言语理解与表达-郭熙-01

1、听课小贴上 2、 言语理解与表达-题型分类&#xff08;章就是类&#xff09; 国考&#xff1a;40道题 时间建议&#xff1a;30分钟 目标正确率&#xff1a;80% 3、课程安排 4、第一章-片段阅读 看问题---> 带着问题读文段----> 确定选项 4.1 中心理解题 关联词&…