如何使用 Jenkins + Docker 自动化部署 Java Jar 包?
🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。
@TOC
✨ 前言
在现代开发和运维实践中,持续集成(CI)和持续交付(CD)是 DevOps 的核心理念,而 Jenkins 是其中最流行的 CI/CD 工具之一。通过结合 Docker,我们可以实现自动化构建、打包、部署 Java Jar 包,并极大提高部署效率和可靠性。
本文将从环境配置、Jenkins 管道设计到实际案例,手把手带你实现 Jenkins + Docker 部署 Java Jar 包 的全过程。
📌 实现目标
- 使用 Jenkins 从代码仓库(如 GitHub/GitLab)拉取代码。
- 使用 Maven 构建和打包 Java 项目为 Jar 文件。
- 基于 Docker 部署 Jar 包为容器服务。
- 实现完整的 CI/CD 自动化流程。
📌 环境准备
-
安装 Jenkins
- 安装 Jenkins,可以参考 官方文档。
- 确保 Jenkins 安装了以下插件:
- Pipeline Plugin:支持 Jenkinsfile 管道。
- Git Plugin:支持 Git 代码库集成。
- Docker Pipeline Plugin:支持 Docker 操作。
-
安装 Docker
- 在 Jenkins 服务器上安装 Docker(包括 Docker CLI 和 Daemon)。
- 确保 Jenkins 用户对 Docker Daemon 拥有操作权限(执行
usermod -aG docker jenkins
,然后重启 Jenkins)。
-
Git 仓库
- 确保 Java 项目已上传至 GitHub/GitLab,项目中需包含
pom.xml
(Maven 构建文件)。
- 确保 Java 项目已上传至 GitHub/GitLab,项目中需包含
-
Java 环境
- 安装 JDK 8+(与项目要求一致),并配置 Jenkins 全局工具中的 Java 环境。
📌 项目目录结构
假设 Java 项目代码目录结构如下:
project-root/
├── src/
├── pom.xml # Maven 配置文件
└── Dockerfile # Docker 镜像配置文件
Dockerfile 示例
在项目根目录下创建 Dockerfile
:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
📌 Jenkins Pipeline 脚本实现
以下是基于 Jenkinsfile 的完整 CI/CD 管道脚本。
1. 创建 Jenkins Pipeline 项目
- 登录 Jenkins,创建一个新的 Pipeline 项目。
- 在项目配置中,选择从 Git 拉取代码,并指定仓库地址和分支。
2. Jenkinsfile 脚本
在项目根目录下创建一个名为 Jenkinsfile
的文件,内容如下:
pipeline {
agent any
environment {
// 定义全局环境变量
REGISTRY = 'your-docker-registry' // Docker 镜像仓库地址
IMAGE_NAME = 'your-java-app' // Docker 镜像名称
VERSION = "latest" // 镜像版本号
}
stages {
// Stage 1: 拉取代码
stage('Checkout') {
steps {
echo 'Cloning source code...'
git branch: 'main', url: 'https://github.com/your-repo.git'
}
}
// Stage 2: Maven 构建
stage('Build') {
steps {
echo 'Building the project with Maven...'
sh 'mvn clean package -DskipTests' // 跳过测试
}
}
// Stage 3: 构建 Docker 镜像
stage('Docker Build') {
steps {
echo 'Building Docker image...'
sh """
docker build -t ${REGISTRY}/${IMAGE_NAME}:${VERSION} .
"""
}
}
// Stage 4: 推送 Docker 镜像到仓库
stage('Docker Push') {
steps {
echo 'Pushing Docker image to registry...'
sh """
docker login -u your-username -p your-password ${REGISTRY}
docker push ${REGISTRY}/${IMAGE_NAME}:${VERSION}
"""
}
}
// Stage 5: 部署到 Docker 容器
stage('Deploy') {
steps {
echo 'Deploying the application as a Docker container...'
sh """
docker stop ${IMAGE_NAME} || true
docker rm ${IMAGE_NAME} || true
docker run -d --name ${IMAGE_NAME} -p 8080:8080 ${REGISTRY}/${IMAGE_NAME}:${VERSION}
"""
}
}
}
// 清理工作区
post {
always {
echo 'Cleaning up workspace...'
cleanWs()
}
}
}
📌 Jenkinsfile 详细解析
-
环境变量
REGISTRY
:Docker 镜像仓库地址。IMAGE_NAME
:镜像名称。VERSION
:镜像版本号(可动态调整)。
-
Stages
Checkout
:从 Git 仓库拉取代码。Build
:使用 Maven 构建项目并生成 Jar 包。Docker Build
:基于项目目录下的Dockerfile
构建 Docker 镜像。Docker Push
:将镜像推送到 Docker 仓库(如 Docker Hub)。Deploy
:运行容器并暴露服务端口。
-
Post 清理阶段
- 清理工作区,避免遗留文件占用磁盘空间。
📌 测试与运行
-
运行 Pipeline
- 配置好 Jenkins 项目后,点击 “Build Now” 启动流水线。
-
查看构建日志
- 在 Jenkins 控制台查看每个阶段的日志输出,确保任务顺利完成。
-
验证服务
- 部署完成后,访问
http://<Jenkins-Server-IP>:8080
确保服务已成功运行。
- 部署完成后,访问
📌 CI/CD 流程演示
完整的 Jenkins + Docker 流程如下:
- 开发者将代码提交至 Git 仓库(如 GitHub)。
- Jenkins 自动触发构建任务。
- Maven 构建项目并生成 Jar 包。
- 基于
Dockerfile
构建镜像。 - 推送镜像到 Docker Registry。
- Jenkins 在目标服务器上启动容器,完成服务部署。
📌 进阶优化
-
集成单元测试
- 在
Build
阶段添加测试步骤:sh 'mvn test'
- 在
-
版本控制
- 使用 Git 提交的哈希值动态生成镜像版本号:
def commitId = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim() environment { VERSION = commitId }
- 使用 Git 提交的哈希值动态生成镜像版本号:
-
分布式部署
- 配合 Kubernetes 或 Docker Swarm,实现多实例自动部署。
-
自动回滚
- 在部署失败时,回滚到上一个稳定版本:
stage('Rollback') { steps { echo 'Rolling back to previous version...' sh """ docker stop ${IMAGE_NAME} || true docker rm ${IMAGE_NAME} || true docker run -d --name ${IMAGE_NAME} -p 8080:8080 ${REGISTRY}/${IMAGE_NAME}:previous-version """ } }
- 在部署失败时,回滚到上一个稳定版本:
🔮 未来展望
-
蓝绿部署/金丝雀部署:
- 实现无缝切换和逐步上线,提高部署的可靠性。
-
CI/CD Pipeline 自动化管理:
- 使用 GitOps 工具(如 ArgoCD)实现更高效的 CI/CD 流程。
-
监控与告警:
- 集成 Prometheus 和 Grafana,实时监控容器运行状态,并在故障时自动通知。
✨ 总结
通过 Jenkins 和 Docker 的结合,Java 项目可以实现一套高效、灵活的 CI/CD 部署流程。这不仅简化了开发和运维工作,还提高了系统的稳定性和可扩展性。希望本文的详细流程和示例代码能为你的实际项目提供参考!
如果你有更多问题或想法,欢迎随时交流!😊
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-
- 点赞
- 收藏
- 关注作者
评论(0)