devops-Jenkins一键部署多台实例

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 部署

相关推荐
数据库那些事儿1 小时前
阿里云DMS Data Copilot——高效智能的数据助手,助力企业实现数据驱动的未来
运维·数据库·agent
摇滚侠1 小时前
Linux 系统重置用户密码指南
linux·运维·服务器
linT_T2 小时前
研发团队看板协作中的自动化实践:集成CI/CD与任务流转
运维·ci/cd·自动化
中科米堆2 小时前
中科米堆CASAIM自动化三维扫描系统自动测量压铸件尺寸
运维·自动化·视觉检测
小嵌同学2 小时前
Meson:开源的自动化构建系统
linux·运维·开源·自动化·meson
果子⌂3 小时前
Zabbix 企业级高级应用
linux·运维·nginx·zabbix
钱彬 (Qian Bin)3 小时前
解决docker load加载tar镜像报json no such file or directory的错误
运维·docker·容器·错误·tar·docker load
明月心9524 小时前
NFS CENTOS系统 安装配置
linux·运维·centos
Raymond运维5 小时前
MySQL 8.0源码编译安装(二)
linux·运维·mysql
延凡科技5 小时前
延凡科技光伏清洗预测系统
大数据·运维·人工智能·科技·无人机·智慧城市