devops-Jenkins一键部署多台实例

news/2025/2/24 6:59:34

Deckerfile


# 第一阶段:构建阶段
FROM maven:3.8.4-openjdk-17 AS build
# 设置工作目录
WORKDIR /app
# 复制项目的 pom.xml 文件,先下载依赖以利用缓存
COPY pom.xml .
RUN mvn dependency:go-offline
# 复制项目源代码
COPY src ./src
# 打包项目
RUN mvn package -DskipTests

# 第二阶段:运行阶段
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 从构建阶段复制打包好的 jar 包
COPY --from=build /app/target/your-spring-boot-app.jar app.jar
# 复制 lib 目录(如果有必要)
COPY lib/ lib/
# 暴露应用程序端口,使用环境变量控制
ENV APP_PORT=8080
EXPOSE $APP_PORT

#定义时区环境变量
ENV  TIME_ZONE Asiz/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone
# 启动 Spring Boot 应用程序,使用环境变量配置端口
ENTRYPOINT java -Xms256m -Xmx256m $JAVA_OPTS -DSW_AGENT_NAME=$svcname -jar -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE$SPRING_PROFILES *.jar



build.sh

#!/bin/bash
# 声明脚本使用的解释器为bash,这是大多数Linux系统默认的shell,它能识别和执行各种常见的命令和脚本语法

# 定义Spring Boot项目的jar包名称和Docker镜像名称
# JAR_FILE 变量存储Spring Boot项目打包后生成的jar包文件名
# 在实际使用时,需要将其替换为你项目真正生成的jar包名称
JAR_FILE="your-spring-boot-app.jar"
# IMAGE_NAME 变量定义了要构建的Docker镜像的名称和标签
# 这里使用 "latest" 作为标签,通常表示该镜像是最新版本
IMAGE_NAME="your-spring-boot-app:latest"

# 定义目标服务器列表
# SERVERS 是一个数组,数组中的每个元素表示一个目标服务器的连接信息
# 格式为 "用户名@服务器地址",实际使用时要替换为真实的服务器信息
SERVERS=(
    "user1@server1.example.com"
    "user2@server2.example.com"
)

# 定义服务器密码(如果使用密码认证)
# PASSWORD 变量存储连接目标服务器时使用的密码
# 不过使用密码认证存在安全风险,建议使用SSH密钥认证
# 实际使用时要替换为真实的服务器登录密码
PASSWORD="your-server-password"

# 构建Docker镜像
# docker build 是Docker用于构建镜像的核心命令
# -t $IMAGE_NAME 选项用于为构建的镜像指定名称和标签,这里使用前面定义的 IMAGE_NAME 变量
# . 表示使用当前目录下的 Dockerfile 来构建镜像,当前目录是脚本执行时所在的目录
docker build -t $IMAGE_NAME .

# 标记镜像并推送到Docker Hub
# docker tag 命令用于为本地的Docker镜像添加一个新的标签
# 这里将之前构建的镜像标记为 your-dockerhub-username/$IMAGE_NAME 的格式
# 这样做是为了将镜像推送到指定的 Docker Hub 账号下,需要替换为真实的 Docker Hub 用户名
docker tag $IMAGE_NAME your-dockerhub-username/$IMAGE_NAME
# docker push 命令用于将本地标记好的镜像推送到 Docker Hub 仓库
# 这样其他服务器就可以从 Docker Hub 拉取这个镜像了
docker push your-dockerhub-username/$IMAGE_NAME

# 登录到目标服务器并拉取运行镜像
# 这是一个 for 循环,用于遍历 SERVERS 数组中的每个服务器
# "${SERVERS[@]}" 表示获取数组中的所有元素
for server in "${SERVERS[@]}"; do
    # 输出一条信息,提示正在向当前服务器进行部署
    # $server 是当前循环到的服务器连接信息
    echo "Deploying to $server..."
    
    # 登录到目标服务器
    # sshpass 是一个工具,用于在命令行中传递 SSH 密码
    # -p "$PASSWORD" 指定 SSH 登录时使用的密码,即前面定义的 PASSWORD 变量
    # ssh $server 表示使用 SSH 协议连接到目标服务器
    # "docker login -u your-dockerhub-username -p your-dockerhub-password" 是在目标服务器上执行的命令
    # 该命令用于登录到 Docker Hub,需要替换为真实的 Docker Hub 用户名和密码
    sshpass -p "$PASSWORD" ssh $server "docker login -u your-dockerhub-username -p your-dockerhub-password"
    
    # 在目标服务器上拉取并运行容器
    # 这里再次使用 sshpass 和 ssh 连接到目标服务器
    # "docker pull your-dockerhub-username/$IMAGE_NAME" 是在目标服务器上执行的拉取镜像命令
    # 从 Docker Hub 拉取之前推送的镜像
    sshpass -p "$PASSWORD" ssh $server "docker pull your-dockerhub-username/$IMAGE_NAME"
    # "docker run -d -p 8080:8080 your-dockerhub-username/$IMAGE_NAME" 是在目标服务器上执行的运行容器命令
    # -d 选项表示以守护进程模式运行容器,即容器在后台运行
    # -p 8080:8080 选项将容器内部的 8080 端口映射到宿主机的 8080 端口
    sshpass -p "$PASSWORD" ssh $server "docker run -d -p 8080:8080 your-dockerhub-username/$IMAGE_NAME"
    
    # 输出一条信息,提示对当前服务器的部署已完成
    echo "Deployment to $server completed."
done

同理使用相同的Dockerfile, 参考上面的build.sh, 编辑Jenkins 部署


http://www.niftyadmin.cn/n/5864055.html

相关文章

3D Gaussian Splatting(3DGS)的核心原理

3D Gaussian Splatting(3DGS)的核心原理 1. 基本概念 3D Gaussian Splatting(3DGS) 是一种基于 高斯分布的点云表示与渲染技术,核心思想是将三维场景建模为一系列 可学习的高斯分布,每个高斯分布具有以下…

使用 Promptic 进行对话管理需要具备python技术中的那些编程能力?

使用 Promptic 进行对话管理时,需要掌握一些基础的编程知识和技能,以下是详细说明: 1. Python 编程基础 Promptic 是一个基于 Python 的开发框架,因此需要具备一定的 Python 编程能力,包括: 函数定义与使用:了解如何定义函数、使用参数和返回值。类型注解:熟悉 Python…

【三十四周】文献阅读:DeepPose: 通过深度神经网络实现人类姿态估计

目录 摘要AbstractDeepPose: 通过深度神经网络实现人类姿态估计研究背景创新点方法论归一化网络结构级联细化流程 代码实践局限性实验结果总结 摘要 人体姿态估计旨在通过图像定位人体关节,是计算机视觉领域的核心问题之一。传统方法多基于局部检测与图模型&#x…

Rocky8 源码安装 HAProxy

HAProxy 是一款开源的高性能 负载均衡器 和 反向代理 软件,专注于处理高并发流量分发,广泛应用于企业级架构中提升服务的可用性、扩展性和安全性。 一、HAProxy 简介 1.1.HAProxy 是什么? 本质: 基于 C 语言开发 的轻量级工具&a…

FunAudioLLM:用语音大模型解锁智能语音交互的无限可能

摘要 随着人工智能技术的飞速发展,语音处理已成为人机交互的核心领域之一。本文将介绍 FunAudioLLM 模型家族中的两个重要成员:SenseVoiceSmall 和 CosyVoice2-0.5B,探讨它们在语音识别、语音合成和情感分析中的应用,并提供实用的…

详细介绍嵌入式硬件设计

嵌入式硬件设计详解 一、嵌入式硬件设计核心概念 嵌入式硬件设计是针对特定应用场景,将处理器、存储器、外设接口等电子元件集成到电路板上,实现特定功能的系统开发过程。其核心目标是 高可靠性、低功耗、小体积 和 成本优化。 二、设计流程与关键步骤…

【简单】209.长度最小的子数组

题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回0。 示例 1: 输入&am…

vim 多个关键字高亮插件介绍

在 Vim 中,可以通过以下方法实现多个关键字的高亮: 1. 使用插件:vim.mark vim.mark 是一个专门用于高亮多个关键字的插件,支持不同颜色的高亮,并提供便捷的跳转功能。 安装方法: 下载插件文件并放入 ~/…