jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

news/2024/9/18 12:07:30/ 标签: jenkins, spring cloud, 微服务

各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目,之前没怎么搞过部署相关的,以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题,特写此篇,用于个人记录与分享。

一 、基础插件安装

1.1 安装与配置Maven插件
安装Maven 插件。

在这里插入图片描述

搜索 maven,选中 Maven Integration 进行安装。

在这里插入图片描述

配置maven工具

安装完成后,需要配置Maven工具,我们的自动化构建任务是使用 Maven 构建的,需要告知Jenkins Maven的安装位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 安装与配置ndoe插件
安装NodeJS插件

在这里插入图片描述

配置NodeJS工具

在这里插入图片描述

1.3 安装与配置ssh插件
安装ssh插件

这个插件的作用就是将 Jenkins 构建的 SpringBoot 项目的 jar 包发布的业务服务器上。

在这里插入图片描述

配置业务服务器

找到系统配置
在这里插入图片描述

拉到最下面找到 Publish over SSH,安装完 SSH 插件才有这个选项。

在这里插入图片描述

Server是可以有多个的,新增一个 SSH Server。
在这里插入图片描述
在这里插入图片描述

在最下面有个测试的按钮,可以测试一下配置有没有问题,没有问题,保存配置。

二 、构建微服务项目流水线

2.1 创建构建任务

在这里插入图片描述

编写流水线脚本,依照需求实现不同的步骤,这里贴出博主的一个配置仅供参考
在这里插入图片描述

2.2 shell脚本

1、jenkins脚本命令,这里博主的服务器和jenkins是在一台服务器上,所以在jar发送阶段直接使用的shell命令,如果不在一台服务器上则使用ssh插件,这里不在赘述

pipeline {agent anytools {maven 'maven3'}stages {stage('拉取代码') {steps {git branch: 'dev', credentialsId: '20250730-853d-40dc-be30-xxxxxxxx', url: 'https://gitee.com/xxx/xxx.git'echo '拉取代码完成!'}}stage('执行构建') {steps {dir('kingoffice-auth') {sh """mvn --versionmvn clean package -DskipTests"""echo '执行构建成功!'}}}stage('执行更新安装包文件进程') {steps {script {def currentTime = new Date().format("yyyyMMddHHmmss")def jarFile = 'kingoffice-auth/target/kingoffice-auth.jar'def targetDir = '/kim/project/auth/'def targetFile = "${targetDir}kingoffice-auth.jar"def dockerFile = 'docker/kim/auth/Dockerfile'def deployScript = 'docker/kim/auth/deploy.sh'// 检查并创建目标目录sh "sudo mkdir -p ${targetDir}"// 检查目标目录是否存在同名 JAR 文件if (fileExists(targetFile)) {// 重命名 JAR 文件def newTargetFile = "${targetDir}kingoffice-auth-${currentTime}.jar"sh "sudo mv ${targetFile} ${newTargetFile}"echo "已重命名文件为: ${newTargetFile}"}// 复制新生成的 JAR 文件sh "sudo cp ${jarFile} ${targetDir}"echo '发送 JAR 文件成功!'// 删除目标目录下的同名 Dockerfile 和 deploy.sh 文件sh "sudo rm -f ${targetDir}Dockerfile"sh "sudo rm -f ${targetDir}deploy.sh"// 复制新的 Dockerfile 和 deploy.sh 文件sh "sudo cp ${dockerFile} ${targetDir}"sh "sudo cp ${deployScript} ${targetDir}"echo '发送 Dockerfile 和 deploy.sh 成功!'}}}stage('构建并启动容器') {steps {script {def targetDir = '/kim/project/auth/'def deployScriptPath = "${targetDir}deploy.sh"// 确保 deploy.sh 脚本具有执行权限sh "sudo chmod +x ${deployScriptPath}"// 执行 deploy.sh 脚本sh "sudo ${deployScriptPath}"echo '执行启动容器完成!'}}}}
}
2.3 部署脚本 deploy.sh

#!/bin/bash# 项目名称
projectName=kingoffice-auth# 年月日时分的时间戳
timestamp=$(date +%Y%m%d%H%M)# 新镜像的名称
newImageName=$projectName:$timestamp# 切换到包含Dockerfile的目录
echo "切换到包含Dockerfile的目录 /kim/project/auth/"
cd /kim/project/auth/ || { echo "切换目录失败,退出脚本"; exit 1; }echo "开始构建新镜像: $newImageName"
# 1.首先使用Dockerfile打镜像
docker build -t $newImageName .
if [ $? -ne 0 ]; then
echo "构建新镜像失败"
exit 1
else
echo "构建新镜像成功"
fiecho "正在停止并删除之前运行的容器..."
# 2.停止并删除之前运行的容器
runningContainerId=$(docker ps | grep "$projectName" | awk '{print $1}')
if [ -n "$runningContainerId" ]; then
docker stop "$runningContainerId" && echo "容器已停止: $runningContainerId"
docker rm "$runningContainerId" && echo "容器已删除: $runningContainerId"
fiecho "正在删除旧镜像..."
# 删除除最新外的所有旧镜像
oldImageTags=$(docker images | grep "$projectName" | awk '{print $2}' | grep -v "$timestamp" | sort | uniq)
for tag in $oldImageTags; dodocker rmi "${projectName}:${tag}" && echo "旧镜像已删除: ${projectName}:${tag}";
doneecho "创建日志目录..."
# 在宿主机上创建logs目录,用于容器挂载,这样查看日志可以直接在宿主机查看,比较方便
mkdir -p ~/kim/project/auth/logsecho "正在运行新的镜像..."
# 3.运行新的镜像
docker run -d -p 9200:9200 --restart=always -v ~/kim/project/auth/logs:/kim/logs $newImageNameif [ $? -eq 0 ]; then
echo "新容器运行成功"
else
echo "新容器运行失败"
exit 1
fi
2.4 使用沙盒生成命令

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

上述配置完毕后,点击生成流水线脚本,即生成对应的脚本语言,复制到脚本文件中即可。

在这里插入图片描述

流水线创建完成后,就可以进行第一次构建尝试了。

三 、部署vue项目

3.1 创建构建任务创建任务

选择构建一个自由风格的软件项目
在这里插入图片描述

3.2 源码管理

与上述添加远程仓库步骤一致。
在这里插入图片描述

3.3构建环境

勾选 Provider Node & npm bin/folder to PATH
在这里插入图片描述

3.4 构建步骤:

执行构建的时候,执行 npm 命令进行构建就可以了,所以在 Build Step 选择执行 shell:
在这里插入图片描述

3.5 shell命令
# 安装依赖
npm install --registry=https://registry.npmmirror.com
# 构建项目
npm run build:prod
# 将构建结果打包
zip -r dist.zip dist
echo "打包成功"
# 检查/kim/nginx/html/目录下是否存在dist.zip文件,并进行重命名处理
if [ -f "/kim/nginx/html/dist.zip" ]; thensudo mv /kim/nginx/html/dist.zip "/kim/nginx/html/dist_$(date +%Y%m%d%H%M%S).zip"
fi
# 将dist.zip文件移动到/kim/nginx/html/目录下
sudo mv dist.zip /kim/nginx/html/
# 删除/kim/nginx/html/目录下的dist文件夹
sudo rm -rf /kim/nginx/html/dist
# 解压dist.zip至/kim/nginx/html/目录,完成部署
sudo unzip /kim/nginx/html/dist.zip -d /kim/nginx/html/
echo "部署成功"

四 、问题总结

4.1 构建时间 相差八个小时

系统管理->脚本命令行->运行下面代码

在这里插入图片描述

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone','Asia/Shanghai')
4.2 构建过程报错 找不到maven

查看构建脚本 是否有此命令,此命令是告知jenkins使用哪个maven进行构建,博主使用的版本,不输此命令,会报mvn找不到的错误。

 tools {maven 'maven3'}
4.3 微服务私有jar找不到

博主最初maven使用的是阿里云的公开镜像,但是在微服务中有些依赖使我们项目生成的关系依赖jar,这在公共平台是不可能找到的,博主想到的办法是搭建个人私服仓库,但是这个成本过大,于是就使用了阿里云免费提供的私人云效仓库。创建过程不再赘述,这里只讲重点遇到的问题。
1、maven配置文件,直接使用阿里settings文件即可,或者按需配置。

在这里插入图片描述

2、第一次推送成功,第二次推送取失败
1、私有jar上传前改一下版本号
2、开启允许覆盖指令。

在这里插入图片描述

4.4 执行shell命令脚本权限不够

jenkins使用的用户一般默认是jenkins,有两种解决方案
1、将jenkins改成root 一般配置文件是在这个目录下 /etc/sysconfig/jenkins
2、赋予jenkins用户权限
编辑 /etc/sudoers 文件,在文件最下为 Jenkins 用户赋予无密码执行 sudo 的权限
jenkins ALL=(ALL) NOPASSWD:ALL


http://www.ppmy.cn/news/1515269.html

相关文章

如何使用Python Flask构建地震爬虫预测系统?

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

笔记整理—uboot启动过程(3)栈的二次设置以及常用名词解析,BL1部分完

前文说到了uboot的lowlevel_init都干了些什么,也就是经过了这项初期的低级启动,使得我们能在串口监视器上看见机器打印出的第一句话“OK”。当lowlevel_init结束后,uboot去做了另一件事情,那就是栈的再次设置。 第一次栈设置发生在…

【GH】【EXCEL】P6: Shapes

文章目录 componentslinepicture components line picture Picture A Picture object Input parameters: Worksheet (Generic Data) A Worksheet, Workbook, Range Object, Excel Application, or Text Worksheet NameName (Text) An optional object nameLocation (Point) A p…

华为OD机试 - 空栈压数 - 栈(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

iOS18升级出现白苹果、无法重启等问题,要怎么解决

随着苹果iOS 18系统beta版本的推出,不少用户在私信说升级后遇到了白苹果和无法重启等问题。这些问题不仅影响了大家的正常使用,还会导致数据丢失和系统崩溃。本文将详细介绍iOS 18升级后出现白苹果、无法重启等问题的原因及解决方法,帮助大家…

EmguCV学习笔记 C# 6.3 轮廓外接多边形

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

MyBatis-Plus分页插件使用详解

一、简述 在使用mybatis开发项目的时候我们通常使用pagehelper来进行分页操作, 但是我们在使用MyBatis-Plus 开发时,MyBatis-Plus内置已经有分页功能了,其实不需要在额外引入pagehelper依赖了,而且两者同时引入有时候还会导致分页…

基于.net的外卖点单系统的设计与实现/基于asp.net的外卖系统

基于.net的外卖点单系统的设计与实现 摘 要 国内餐饮行业的快速发展,人们为了能够更加方便地管理用户点单,外卖点单系统被人们开发出来从而更好地方便管理用户点单,一个完美的外卖点单系统已经成为各个餐饮店的追求目标。 本系统asp.net利用…

MYSQL————数据库的约束

1.约束类型 1.not null:指示某列不能存储null值 2.unique:保证某列的每行必须有唯一值 3.default:规定没有给列赋值时的默认值 4.primary key:not null和unique的结合。确保某列(或两个或多个列的结合)有唯…

常见分布式ID解决方案的优缺点

分布式系统之所以难,很重要的原因之一是“没有一个全局时钟,难以保证绝对的时序”。 一、分布式ID的特性或要求: 唯一性:确保生成的ID是应用系统内唯一。高可用性:确保任何时候都能正确的生成ID。有意义:或者说包含更多信息,例如时间、业务等信息。如:有序性,通常都需…

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中,ThreadLocal 类提供了一种方式,使得每个线程可以独立地持有自己的变量副本,而…

C#:Bitmap类使用方法—第1讲

首先看一下Bitmap定义:封装 GDI 位图,此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。 下面介绍一下使用的例子: Bitmap image1; private void Button1_Click(System.Object sender, System.Eve…

计算机毕业设计 高校学术交流平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【C++ Primer Plus习题】4.5

问题: 解答: #include <iostream> using namespace std;typedef struct _CandyBar {string brand;float weight;int calorie; }CandyBar;int main() {CandyBar snack { "德芙",2.1,20};cout << "品牌:" << snack.brand << endl;…

el-scrollbar搭配el-backtop滚动到最顶/最底 el-scrollbar在focus时出现黑框的解决办法

如何搭配 el-scrollbar 和 el-backtop&#xff0c;使其点击后滚动到底部&#xff1a; <template><!-- 一个el-scrollbar区域&#xff0c;其ref是chatArea --><el-scrollbar scroll"(e: any) > { tempHeight e.scrollTop }" ref"chatArea&qu…

C#面:ASP.NET MVC 中如何用表单认证?

在 ASP.NET MVC 中&#xff0c;可以使用表单认证来验证用户的身份。 表单认证是一种基于 Cookie 的认证方式&#xff0c;它通过在用户登录成功后生成一个包含用户身份信息的加密 Cookie&#xff0c;并将该 Cookie 发送给客户端保存。 当用户发送请求时&#xff0c;服务器会验…

稚晖君智元机器人远程机器人系列发布:引领具身智能新高度

在最近的发布会上&#xff0c;前华为“天才少年”稚晖君及其团队亮相了他们的最新作品——智元机器人的第二代远程机器人系列。这次发布会不仅展示了丰富的产品线&#xff0c;还揭示了其未来的发展路线以及开源计划。本文将详细解析本次发布会的亮点和技术背后的创新。 一、发…

如何使用ssm实现电脑配件销售系统的设计与实现

TOC ssm128电脑配件销售系统的设计与实现jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于电脑配件销售系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;主页、个人中心、用户管理、商品分类管理、商…

Kafka的基本概念

目录 1.Kafka的介绍 1.1介绍 1.2Kafka的概念 1.3.Kafka实现的日志聚合 1.4简单的收发消息 1.5其他消费模式 1.5.1指定消费进度 1.5.2分组消费 1.5.3查看消费者组的偏移量 1.6基于Zookeeper的Kafka集群 1.6.1使用集群的原因 1.6.2Kafka集群架构 1.6.3Topic下的Part…

你是如何克服编程学习中的挫折感的?

你是如何克服编程学习中的挫折感的&#xff1f; 编程学习之路上&#xff0c;挫折感就像一道道难以逾越的高墙&#xff0c;让许多人望而却步。然而&#xff0c;真正的编程高手都曾在这条路上跌倒过、迷茫过&#xff0c;却最终找到了突破的方法。你是如何在Bug的迷宫中找到出口的…