当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • uniapp在线视频监控开发
  • 精通推荐算法27:行为序列建模之BST— 代码实现
  • 开学季好物分享,精选五款开学必备的数码好物推荐!
  • 第二十六届中国机器人及人工智能大赛(智能驾驶)思路
  • 基于JavaEE的农产品销售管理系统设计与实现(源码+lw+部署文档+讲解等)
  • 随机涂鸦 pil
  • 小琳AI课堂 - AIGC在不同行业的应用潜力与未来发展深度解析
  • 2024精选骨传导耳机推荐,选这五款可以帮你避坑!
  • Java数组怎么转List,Stream的基本方法使用教程
  • FPGA硬件扑克牌比赛报名倒计时~!
  • 视频教程:自研低代码拖拽图形编辑器底层库moveable示例学习
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • BUG——imx6u开发_结构体导致的死机问题(未解决)
  • Redis 有序集合【实现排行榜】
  • 【ARM+Codesys 客户案例 】基于RK3568/A40i/STM32+CODESYS开发的控制器在自动输送分拣系统上的应用,支持定制
  • 2017-08-04 前端日报
  • input的行数自动增减
  • JavaScript异步流程控制的前世今生
  • Java-详解HashMap
  • maya建模与骨骼动画快速实现人工鱼
  • Tornado学习笔记(1)
  • Travix是如何部署应用程序到Kubernetes上的
  • Vim Clutch | 面向脚踏板编程……
  • vue中实现单选
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 蓝海存储开关机注意事项总结
  • 如何优雅地使用 Sublime Text
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 数据科学 第 3 章 11 字符串处理
  • 小程序01:wepy框架整合iview webapp UI
  • 学习ES6 变量的解构赋值
  • 学习使用ExpressJS 4.0中的新Router
  • 2017年360最后一道编程题
  • 数据库巡检项
  • ​zookeeper集群配置与启动
  • ​用户画像从0到100的构建思路
  • # 透过事物看本质的能力怎么培养?
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (06)Hive——正则表达式
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (3) cmake编译多个cpp文件
  • (30)数组元素和与数字和的绝对差
  • (7) cmake 编译C++程序(二)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (备份) esp32 GPIO
  • (苍穹外卖)day03菜品管理
  • (分类)KNN算法- 参数调优
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (新)网络工程师考点串讲与真题详解
  • (转) Android中ViewStub组件使用
  • ./configure,make,make install的作用(转)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...