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

news2024/11/29 12:33:10

各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用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 any

    tools {
        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 --version
                    mvn 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 "构建新镜像成功"
fi

echo "正在停止并删除之前运行的容器..."
# 2.停止并删除之前运行的容器
runningContainerId=$(docker ps | grep "$projectName" | awk '{print $1}')
if [ -n "$runningContainerId" ]; then
docker stop "$runningContainerId" && echo "容器已停止: $runningContainerId"
docker rm "$runningContainerId" && echo "容器已删除: $runningContainerId"
fi

echo "正在删除旧镜像..."
# 删除除最新外的所有旧镜像
oldImageTags=$(docker images | grep "$projectName" | awk '{print $2}' | grep -v "$timestamp" | sort | uniq)
for tag in $oldImageTags; do
    docker rmi "${projectName}:${tag}" && echo "旧镜像已删除: ${projectName}:${tag}";
done

echo "创建日志目录..."
# 在宿主机上创建logs目录,用于容器挂载,这样查看日志可以直接在宿主机查看,比较方便
mkdir -p ~/kim/project/auth/logs

echo "正在运行新的镜像..."
# 3.运行新的镜像
docker run -d -p 9200:9200 --restart=always -v ~/kim/project/auth/logs:/kim/logs $newImageName

if [ $? -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" ]; then
   sudo 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.coloradmin.cn/o/2059933.html

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

相关文章

水凝胶结机器人咋自主运动?利用拓扑调用的自我调节!

大家好,今天我们来聊聊一项有趣的研究 —— 水凝胶结机器人。这篇文章《Animating hydrogel knotbots with topology-invoked self-regulation》发表于《Nature Communications》。想象一下,小小的机器人能够像生物一样自主运动,这是不是很神…

极空间Z4Pro,最懂中国人的NAS,为了极影视值得入手

极空间Z4Pro,最懂中国人的NAS,为了极影视值得入手 小伙伴们大家好,我的极空间Z4Pro是在首发的时候交定金购买的,到目前为止也算是用了很长一段时间了,说一下自己的使用体验吧。 首先是这个极空间的外观,并…

【流媒体】RTMPDump—主流程简单分析

目录 1. main函数1.1 初始化socket(InitSockets)1.2 初始化RTMP(RTMP_Init)1.3 解析URL(RTMP_ParseURL)1.4 配置流信息(RTMP_SetupStream) RTMP协议相关: 【流媒体】RTMP…

MySQL基础操作探秘

ok,前面两个文章介绍了MySQL的安装与配置环境,以及如何进行删除。 那么,接下来探寻数据库的一些基本操作。 首先我们登录上数据库先: 我们要对数据库进行操作,那我们要用到有些命令,这些命令在这里称为&a…

企业财务自动化:RPA机器人的优势与挑战

随着数字化浪潮的推进,企业财务自动化已成为企业提升效率和降低成本的关键策略。在这一背景下,RPA以其独特的优势,正逐渐成为企业财务自动化的重要工具,然而,RPA在实际应用中也面临着一些挑战。本文金智维将围绕RPA机器…

VBA技术资料MF187:写入文件属性及自定义属性

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

英伟达与联发科合作生产支持G-SYNC完整功能的显示器 不需要英伟达专有模块

英伟达的 G-SYNC 同步技术在推出多年后终于出现比较让人关注的改动:英伟达宣布与联发科合作,将所有当前和未来的 G-SYNC 功能集成到联发科的缩放器中。 简单来说就是未来显示器直接使用联发科的缩放器技术即可,不需要再配备英伟达专有的 G-SY…

表达式求值 - 整形提升和截断

文章目录 一、整形提升二、为什么要整形提升?三、截断四、示例1,23① c1 c2② c3 c1 c2 4 一、整形提升 C语言的整形算数运算总是至少以缺省整形类型的精度来进行的。 为了获得这个精度,表达式中的字符类型和短整型操作数在使用之前被转换…

【pip镜像设置】pip使用清华镜像源安装

文章目录 问题:问题描述原因分析:PyPI(Python Package Index) PypI 镜像列表解决方案: 问题: 大家经常会使用 pip 进行python 的第三方库安装,但是,有时会出现 ERROR: Could not f…

【小程序开发】答案之书——引子

《答案之书》小程序开发之旅 项目灵感&概述 在生活中,我们时常会面临各种选择和困惑:今天的工作会顺利吗?这次旅行会给我带来惊喜吗? 《答案之书》便是在这样一种灵感下诞生的。 它是一款带有神秘色彩的小程序,旨…

【JavaEE初阶】TCP/IP之应用层

📕 应用层 🎄 外卖软件 考虑一个场景,开发一款外卖软件,通过你的定位信息响应相应的商家列表。 🚩 基于行文本的方式传输 🚩 基于xml的方式传输 🚩 基于json的方式传输 这是当前最流行&#x…

网络工程师学习笔记(三)

第二章__数据通信基础 网络通信基本单位:二进制 一个比特位可以用0或1来表示 Byte(字节) bit(比特) 1Byte8bit Byte(字节用于计算存储容量的一种计量单位)一般来说网络中1Kb1000b 存储容量1…

AMD推出全新AI工具:Amuse 2.0,可通过Stable Diffusion XL生成图像

AMD最近推出了Amuse 2.0,一款创新的AI图像生成工具,旨在简化PC用户创建高质量自定义图像的过程。Amuse 2.0的核心优势在于其用户友好的界面和根据文本描述或现有图像生成新图像的能力。用户还可以从草图开始创建图像,或应用个性化的AI滤镜来改…

avalonia学习之按钮

Button 按钮是一个对指针动作做出反应的控件(并且有一些键盘等效物)。当指针向下时,它以按下状态的形式呈现视觉反馈。 指向指针释放序列的指针被解释为点击;并且这种行为是可配置的。 在确定用户是否按下按钮时,始终…

linux PXE批量网络装机及Kickstart无人值守安装

目录 一、PXE基本概述 1.1 什么是PXE 1.2 PXE批量部署的优点 1.3 PXE部署的前置条件 二、部署PXE远程安装服务器 2.1 安装并启动TFTP服务 2.2 安装并启动DHCP服务 2.3 准备linux内核、初始化镜像文件 2.4 准备PXE引导程序 2.5 安装FTP服务,准备CentOS 7 安…

Cornerstone渲染CT+PET融合影像及相关应用场景

⛳️ 引言 在我们日常开发中,可能需要在一个 Viewport 中显示多个 Volume,即既要显示一个 CT 片也要显示一个 PET 片,同时可能还要能够调整融合效果中某个 Volume 的透明度、优先显示某个 Volume 、既能修改 CT 的窗宽窗距又要能够修改 PET …

SAP STMS 每次传输的时候 目标客户断都要输入以下 做个增强 直接带出当前的

在对应200屏幕的 事件中 加入如下 FIELD-SYMBOLS <FS> TYPE any.assign ((SAPLTMSU)WTMSU-CLIENT) to <FS>.if <FS> is ASSIGNED.<FS> sy-mandt.endif. 每次stms 传输的时候默认你登录的client 写于20240821 台州 又偷懒了

【NI国产替代】PXIe‑4330国产替代24位,8通道PXI应变/桥输入模块

25 kS/s&#xff0c;24位&#xff0c;8通道PXI应变/桥输入模块 PXIe‑4330是一款同步输入模块&#xff0c;为基于桥接的传感器提供集成数据采集和信号调理。 PXIe‑4330具有更高的准确性、高数据吞吐量和同步特性&#xff0c;使其成为高密度测量系统的理想选择。\n\n为了消除噪…

如何用一种SQL注入姿势在src斩获30w+赏金?

参考:如何用一种SQL注入姿势在src斩获30w赏金&#xff1f; 前言 团队师傅在国内外SRC的clickhouse的sql注入挖掘中&#xff0c;累计金额已超30w&#xff0c;秉持一个技术forfree的思想&#xff0c;还是抽时间整理了一些技术点&#xff0c;希望能够对各位师傅带来一些帮助。 …

[ETL趋势」DB表输出支持事务、循环容器次数无限制、实时数据同步目的地StarRocks和Doris支持DDL等

FineDataLink作为一款市场上的顶尖ETL工具&#xff0c;集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具&#xff0c;进行了新的维护迭代。本文把FDL4.1.10最新功能作了介绍&#xff0c;方便大家对比&#xff1a;&#xff08;产品更新详情&#xff1a…