如何使用 Jenkins + Docker 自动化部署 Java Jar 包?

举报
bug菌 发表于 2024/12/31 10:06:16 2024/12/31
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。@TOC ✨ 前言在现代开发和运维实践中,持续集成(CI)和持续交付(CD)是 DevOps 的核心理念,而 Jenkins 是其中最流行的 CI/CD 工具之一。通过结合 Docker,我们可以实现自动化构建、打包、部署 Java Jar 包,并极大提高部署效率和...

🏆本文收录于「滚雪球学SpringBoot」专栏,专业攻坚指数级提升持续更新中,up!up!up!!欢迎点赞&&收藏&&订阅。

@TOC

✨ 前言

在现代开发和运维实践中,持续集成(CI)持续交付(CD)是 DevOps 的核心理念,而 Jenkins 是其中最流行的 CI/CD 工具之一。通过结合 Docker,我们可以实现自动化构建、打包、部署 Java Jar 包,并极大提高部署效率和可靠性。

本文将从环境配置、Jenkins 管道设计到实际案例,手把手带你实现 Jenkins + Docker 部署 Java Jar 包 的全过程。


📌 实现目标

  1. 使用 Jenkins 从代码仓库(如 GitHub/GitLab)拉取代码。
  2. 使用 Maven 构建和打包 Java 项目为 Jar 文件。
  3. 基于 Docker 部署 Jar 包为容器服务。
  4. 实现完整的 CI/CD 自动化流程。

📌 环境准备

  1. 安装 Jenkins

    • 安装 Jenkins,可以参考 官方文档
    • 确保 Jenkins 安装了以下插件:
      • Pipeline Plugin:支持 Jenkinsfile 管道。
      • Git Plugin:支持 Git 代码库集成。
      • Docker Pipeline Plugin:支持 Docker 操作。
  2. 安装 Docker

    • 在 Jenkins 服务器上安装 Docker(包括 Docker CLI 和 Daemon)。
    • 确保 Jenkins 用户对 Docker Daemon 拥有操作权限(执行 usermod -aG docker jenkins,然后重启 Jenkins)。
  3. Git 仓库

    • 确保 Java 项目已上传至 GitHub/GitLab,项目中需包含 pom.xml(Maven 构建文件)。
  4. 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 项目

  1. 登录 Jenkins,创建一个新的 Pipeline 项目。
  2. 在项目配置中,选择从 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 详细解析

  1. 环境变量

    • REGISTRY:Docker 镜像仓库地址。
    • IMAGE_NAME:镜像名称。
    • VERSION:镜像版本号(可动态调整)。
  2. Stages

    • Checkout:从 Git 仓库拉取代码。
    • Build:使用 Maven 构建项目并生成 Jar 包。
    • Docker Build:基于项目目录下的 Dockerfile 构建 Docker 镜像。
    • Docker Push:将镜像推送到 Docker 仓库(如 Docker Hub)。
    • Deploy:运行容器并暴露服务端口。
  3. Post 清理阶段

    • 清理工作区,避免遗留文件占用磁盘空间。

📌 测试与运行

  1. 运行 Pipeline

    • 配置好 Jenkins 项目后,点击 “Build Now” 启动流水线。
  2. 查看构建日志

    • 在 Jenkins 控制台查看每个阶段的日志输出,确保任务顺利完成。
  3. 验证服务

    • 部署完成后,访问 http://<Jenkins-Server-IP>:8080 确保服务已成功运行。

📌 CI/CD 流程演示

完整的 Jenkins + Docker 流程如下:

  1. 开发者将代码提交至 Git 仓库(如 GitHub)。
  2. Jenkins 自动触发构建任务。
  3. Maven 构建项目并生成 Jar 包。
  4. 基于 Dockerfile 构建镜像。
  5. 推送镜像到 Docker Registry。
  6. Jenkins 在目标服务器上启动容器,完成服务部署。

📌 进阶优化

  1. 集成单元测试

    • Build 阶段添加测试步骤:
      sh 'mvn test'
      
  2. 版本控制

    • 使用 Git 提交的哈希值动态生成镜像版本号:
      def commitId = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
      environment {
          VERSION = commitId
      }
      
  3. 分布式部署

    • 配合 Kubernetes 或 Docker Swarm,实现多实例自动部署。
  4. 自动回滚

    • 在部署失败时,回滚到上一个稳定版本:
      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
              """
          }
      }
      

🔮 未来展望

  1. 蓝绿部署/金丝雀部署

    • 实现无缝切换和逐步上线,提高部署的可靠性。
  2. CI/CD Pipeline 自动化管理

    • 使用 GitOps 工具(如 ArgoCD)实现更高效的 CI/CD 流程。
  3. 监控与告警

    • 集成 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-

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。