devops-Dockerfile+Jenkinsfile方式部署Java前后端应用

news2024/12/26 19:09:40

文章目录

  • 概述
    • 部署前端Vue应用
      • 一、环境准备
        • 1、Dockerfile
        • 2、.dockerignore
        • 3、nginx.conf
        • 4、Jenkinsfile
      • 二、Jenkins部署
        • 1、新建任务
        • 2、流水线
        • 3、`Build Now` 构建 & 访问
  • Springboot后端应用
      • 1. 准备工作
      • 2. 创建项目结构
      • 3. 编写 Dockerfile
        • 后端 Dockerfile (`backend/Dockerfile`)
      • 4. 创建 Jenkinsfile
        • Jenkinsfile 示例:
      • 5. 设置 Jenkins Job
      • 6. 运行 Pipeline
      • 7. 持续集成与交付
      • 8. 监控与维护
    • 其他Jenkinsfile示例

概述

本文介绍如何使用Dockerfile+Jenkinsfile方式部署Java前后端应用

部署前端Vue应用

一、环境准备

项目中新增Docker文件夹

在这里插入图片描述

1、Dockerfile
# 拉取nginx基础镜像
FROM nginx:1.21.1

# 维护者信息
MAINTAINER zhengqingya

# 将dist文件中的内容复制到 `/usr/share/nginx/html/` 这个目录下面
COPY dist/  /usr/share/nginx/html/
# 用本地配置文件来替换nginx镜像里的默认配置
COPY nginx/nginx.conf /etc/nginx/nginx.conf

# 对外暴漏的端口号
# [注:EXPOSE指令只是声明容器运行时提供的服务端口,给读者看有哪些端口,在运行时只会开启程序自身的端口!!]
EXPOSE 80

# 启动nginx容器
CMD ["nginx", "-g", "daemon off;"]
2、.dockerignore
node_modules
3、nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    # include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  localhost; # 服务器地址或绑定域名

        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;

        # =========================================================
        # ================== ↓↓↓↓↓↓ start ↓↓↓↓↓↓ ==================
        # =========================================================

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        # =========================================================
        # ================== ↑↑↑↑↑↑ end ↑↑↑↑↑↑ ==================
        # =========================================================

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

    }
}
4、Jenkinsfile

在项目根目录下新建Jenkinsfile文件

pipeline {
    agent any
    environment {
        APP_NAME = 'vue-web'
        APP_PROFILE = 'prod'
        APP_IMAGE = 'vue-web:dev'
        APP_PORT = 88
    }

    stages {

        stage('vue环境准备') {
            steps {
                sh """
                # 下载依赖 & 构建dist
                cnpm install && cnpm run build:${APP_PROFILE}
                # 拷贝dist到Docker目录下
                cp -r dist Docker/
                """
            }
        }

        stage('构建Docker镜像') {
            steps {
                sh """
                    # 删除旧容器
                    docker ps -a | grep ${APP_NAME} | awk '{print \$1}' | xargs -i docker stop {} | xargs -i docker rm {}
                    # 删除旧镜像
                    docker images | grep ${APP_NAME} | awk '{print \$3}' | xargs -i docker rmi {}
                    # 进入Docker目录
                    cd Docker
                    # 构建镜像
                    docker build -f Dockerfile -t ${APP_IMAGE} . --no-cache
                """
            }
        }

        stage('运行容器') {
            steps {
                sh """
                    docker run -d -p ${APP_PORT}:80 --restart=always --name ${APP_NAME} ${APP_IMAGE}
                """
            }
        }

    }
}

二、Jenkins部署

1、新建任务

选择Pipeline

在这里插入图片描述

2、流水线

在这里插入图片描述

脚本路径:

Jenkinsfile

保存配置

3、Build Now 构建 & 访问

ip:88

Springboot后端应用

使用 Dockerfile 和 Jenkinsfile 的方式来部署 Java 前端和后端应用,可以实现一个高效的 CI/CD 流程。这个流程包括构建、测试、打包、创建 Docker 镜像、推送镜像到仓库以及部署到目标环境。下面是详细的步骤指南,涵盖了前后端分离的 Java 应用的部署。

1. 准备工作

  • 安装和配置 Jenkins:确保你已经安装了 Jenkins,并且它能够访问你的代码仓库(如 GitHub 或 GitLab)。
  • 安装必要的插件
    • Git Plugin:用于从 Git 仓库拉取代码。
    • Docker Pipeline Plugin:用于在 Jenkins Pipeline 中操作 Docker。
    • Docker Hub / 私有仓库凭证:如果你打算将 Docker 镜像推送到 Docker Hub 或其他私有仓库,请确保 Jenkins 已经配置好相应的凭证。
  • Docker 安装:确保 Jenkins 节点上安装并配置了 Docker。

2. 创建项目结构

假设你有一个包含后端的应用,目录结构如下:

my-java-app/
├── backend/
│   ├── src/
│   ├── pom.xml (或 build.gradle)
│   └── Dockerfile

3. 编写 Dockerfile

后端 Dockerfile (backend/Dockerfile)
# 使用官方的 OpenJDK 镜像作为基础镜像
FROM eclipse-temurin:17-jdk-alpine

# 维护者信息 (可选)
LABEL maintainer="your-email@example.com"

# 设置工作目录
WORKDIR /app

# 将本地的 myapp.jar 复制到容器中的 /app 目录下
COPY target/myapp.jar /app/myapp.jar

# 暴露应用监听的端口 (默认为8080)
EXPOSE 8080

# 启动命令,使用 java 命令来运行 jar 文件
ENTRYPOINT ["java", "-jar", "/app/myapp.jar"]

4. 创建 Jenkinsfile

在项目的根目录下创建 Jenkinsfile 来定义 CI/CD 流程。

Jenkinsfile 示例:
pipeline {
    agent any

    environment {
        DOCKER_IMAGE_BACKEND = 'my-backend-app'
        DOCKER_TAG_BACKEND = "latest"
  
        DOCKER_HUB_CREDENTIALS_ID = 'docker-hub-credentials-id' // 替换为你的凭证 ID
    }

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/your-repo-url.git'
            }
        }

        stage('Build Backend') {
            steps {
                dir('backend') {
                    sh './mvnw clean package -DskipTests' // 使用 Maven 构建,如果使用 Gradle,则改为 ./gradlew build -x test
                }
            }
        }    

        stage('Build Docker Images') {
            parallel {
                stage('Backend Image') {
                    steps {
                        script {
                            docker.build("${env.DOCKER_IMAGE_BACKEND}:${env.DOCKER_TAG_BACKEND}", 'backend')
                        }
                    }
                }
               
            }
        }

        stage('Push Docker Images') {
            parallel {
                stage('Push Backend Image') {
                    steps {
                        script {
                            docker.withRegistry('https://registry.hub.docker.com', "${env.DOCKER_HUB_CREDENTIALS_ID}") {
                                docker.image("${env.DOCKER_IMAGE_BACKEND}:${env.DOCKER_TAG_BACKEND}").push()
                            }
                        }
                    }
                }
              
            }
        }

        stage('Deploy') {
            steps {
                script {
                    // 这里可以根据实际情况添加部署逻辑,例如通过 Docker Compose 或 Kubernetes 部署
                    // 下面是一个简单的示例,直接运行容器
                    def backendContainer = docker.run("-d --name my-backend-container -p 8080:8080 ${env.DOCKER_IMAGE_BACKEND}:${env.DOCKER_TAG_BACKEND}")
                  
                }
            }
        }
    }

    post {
        always {
            // 清理工作空间或其他清理任务
            cleanWs()
        }
    }
}

5. 设置 Jenkins Job

  • 在 Jenkins 中创建一个新的 Pipeline Job。
  • Pipeline script from SCM 选项设置为 Git,并指定你的仓库 URL 和分支。
  • 如果你在仓库中有 Jenkinsfile,选择它作为 Pipeline 的定义文件。
  • 配置构建触发器(例如,基于 Git 提交或定时触发)。

6. 运行 Pipeline

一旦所有配置完成,点击“立即构建”按钮来手动触发一次构建,或者等待自动触发条件满足时自动执行。

7. 持续集成与交付

  • 持续集成 (CI):每次代码提交后,Jenkins 会自动拉取最新代码并运行测试,确保代码质量。
  • 持续交付 (CD):构建成功后,Jenkins 会自动创建 Docker 镜像并将其推送到仓库,然后根据配置部署到目标环境。

8. 监控与维护

  • 日志查看:通过 Jenkins UI 查看构建和部署的日志输出,以便快速定位问题。
  • 健康检查:为应用设置健康检查端点,并在 Jenkins 中配置相应检查以确保服务正常运行。
  • 回滚策略:考虑实现回滚机制,以便在新版本出现问题时能够迅速恢复到上一个稳定版本。

其他Jenkinsfile示例


pipeline{
    agent {
        label 'MVN3'
    }
    stages{
        stage('clone'){
            steps{
                git url: 'https://github.com/tarunkumarpendem/shopi
                zer.git',
                    branch: 'master'
            }
        }
        stage ('build') {
            steps {
               sh 'mvn clean package'
           }
        }
        stage('Build the Code') {
            steps {
                withSonarQubeEnv('sonarcloud') {
                    sh script: 'mvn clean package sonar:sonar'
                }
            }
        stage('archiving-artifacts'){
            steps{
                archiveArtifacts artifacts: '**/target/*.jar', followSymlinks: false
            }
        }
        stage('junit_reports'){
            steps{
                junit '**/surefire-reports/*.xml'
            }
        }
    }    

pipeline {
    agent {label 'OPENJDK-11-JDK'}
    triggers {
        pollSCM('0 17 * * *')
    }
    stages {
        stage('vcs') {
            steps {
                git branch: 'release', url: 'https://github.com/longflewtinku/shopizer.git'         
            }
        }
        stage('merge') {
            steps {
                sh 'git checkout devops'
                sh 'git merge release --no-ff'
            }
        }
        stage('build') {
            steps {
                sh 'mvn clean install'
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2254221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VTK编程指南<三>:基于VTK入门程序解析来理解VTK基础知识

1、VTK入门程序 下面是一个完整的Vtk入门程序&#xff0c;我们基于这个程序来对VTK的基本知识进行一个初步了解。 #include <iostream>#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2);// VTK was built with vtkRenderingOpenGL2 VTK_MODULE_INI…

十二、消息队列-MQ

文章目录 前言一、MQ介绍1. 背景2. 解决思路3. 解决方案 二、应用场景三、常见的MQ产品四、MQ选型总结五、相关知识1. AMQP2. JMS 五、如何设计实现一个消息队列1. 设计消息队列的思路2. 实现队列基本功能1. RPC通信协议2. 高可用3. 服务端承载消息堆积的能力4. 存储子系统的选…

新手如何做好一份技术文档

对于新手来说&#xff0c;编写技术文档可能是一项挑战&#xff0c;但这也是一个提升自己技术写作能力的绝佳机会。技术文档不仅仅是代码的补充说明&#xff0c;它更是团队协作和项目成功的基石。本文将为你提供一些实用的指导和建议&#xff0c;帮助你编写出一份高质量的技术文…

如何设置PPT以“只读方式”打开?3种简单方法!

在PPT中设置文件为“只读”模式&#xff0c;可以防止自己意外修改&#xff0c;也可以防止他人对文件内容进行修改&#xff0c;确保文件的安全性。根据需求不同&#xff0c;PPT可以设置3种不同的”只读方式“&#xff0c;一起来看看吧&#xff01; 方式1&#xff1a;设置文件为只…

DICOM医学影象应用篇——多平面重建(MPR)在DICOM医学影像中的应用详解

目录 MPR(多平面重建)概述 基本原理 具体实现 代码详解 总结 MPR(多平面重建)概述 多平面重建&#xff08;MPR, Multi-Planar Reconstruction&#xff09;是一项用于从三维医学影像数据集中生成不同平面的二维切片的技术。通常应用于CT或MRI数据集&#xff0c;MPR可以帮助医…

Vue前端开发-多级路由配置

在Vue 路由数组中&#xff0c;允许配置多级的路由对象结构&#xff0c;可以是二级、三级或者更多级别&#xff0c;最大级别原则上没有限制&#xff0c;但通常最大的是三或四级&#xff0c;这种路由结构&#xff0c;称之为多级路由。 例如&#xff1a;一级路由地址/list&#x…

【二分查找】力扣 875. 爱吃香蕉的珂珂

一、题目 二、思路 速度 k&#xff08;单位&#xff1a;根/小时&#xff09;是存在一个取值范围的。 速度越大肯定在规定的时间之内一定会吃完全部的香蕉&#xff0c;但也是可以确定出一个上界的。由于只要保证一小时之内&#xff0c;可以吃完香蕉数目最多的那一堆的香蕉&…

C语言——指针基础

1 指针基础 怎么获得变量地址 1 如何产生一个指针变量——>类型* 标识符;int* p1;char* p2;double* p3;//不同类型的基本指针占用内存是一样的都是4个字节&#xff08;32位&#xff09;/8个字节&#xff08;64位&#xff09;&#xff0c;都是存的地址2 数组名是数组首地址…

Leetcode day1.两数相加(2) 2.整数反转(7)

注意点&#xff1a;1.链表会出现其中一个已经为空&#xff0c;另一个缺还是有数据 2.相加时会出现进位操作 解法一、 利用队列的性质&#xff08;基础不好 第一时间想到的&#xff09; 很像队列的性质&#xff0c;先进先出&#xff0c;逐步计算。但是最后要换成链表样式。 …

在Ubuntu-22.04 [WSL2]中配置Docker

文章目录 0. 进入Ubuntu-22.041. 更新系统软件包2. 安装Docker相关依赖包3. 添加Docker官方GPG密钥4. 添加Docker软件源5. 安装Docker Engine5.1 更新软件包列表5.2 安装Docker相关软件包 6. 验证Docker安装是否成功6.1 查看Docker版本信息6.2 启动Docker6.3 配置镜像加速器6.4…

51单片机应用开发(进阶)---串口接收字符命令

实现目标 1、巩固UART知识&#xff1b; 2、掌握串口接收字符数据&#xff1b; 3、具体实现目标&#xff1a;&#xff08;1&#xff09;上位机串口助手发送多字符命令&#xff0c;单片机接收命令作相应的处理&#xff08;如&#xff1a;openled1 即打开LED1;closeled1 即关…

【查询基础】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

基于Matlab BP神经网络的电力负荷预测模型研究与实现

随着电力系统的复杂性和规模的不断增长&#xff0c;准确的电力负荷预测对于电网的稳定性和运行效率至关重要。传统的负荷预测方法依赖于历史数据和简单的统计模型&#xff0c;但这些方法在处理非线性和动态变化的负荷数据时&#xff0c;表现出较大的局限性。近年来&#xff0c;…

LeetCode - #150 逆波兰表达式求值

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

mysql基础学习1

useradd -r -g mysql -s /bin/false mysql (-r)系统用户 不能登录 A temporary password is generated for rootlocalhost: d>#jT7rfoaz) 看是否启动 看进程 端口 直接连接 看日志 varchar (20) char(20)更耗空间 create table student_info(id int,name varchar(20),s…

PPT怎样做的更加精美

目录 PPT怎样做的更加精美 3D的GIF图片 3维空间图​编辑 结果有明显的对比 阅读高质量文献,采用他们的图 PPT怎样做的更加精美 3D的GIF图片 3维空间图 结果有明显的对比

Marvell第四季度营收预计超预期,定制芯片需求激增

芯片制造商Marvell Technology&#xff08;美满电子科技&#xff09;&#xff08;MRVL&#xff09;在周二发布了强劲的业绩预告&#xff0c;预计第四季度的营收将超过市场预期&#xff0c;得益于企业对其定制人工智能芯片的需求激增。随着人工智能技术的快速发展&#xff0c;特…

爬虫第四篇:Xpath 路径表达式全解析:从网页基础到爬取百度贴吧图片实战

简介&#xff1a;本文围绕 Xpath 路径表达式展开讲解&#xff0c;先是介绍了网页相关基础如 html、css、vue 以及前后端分离的概念与示例&#xff0c;包括各部分的结构、作用及简单代码展示&#xff0c;随后详细阐述了 xml 的节点关系、选取节点、谓语等理论知识&#xff0c;最…

使用lumerical脚本语言创建弯曲波导并进行数据分析(纯代码实现)

本文使用lumerical脚本语言创建弯曲波导、设置有限差分时域(FDTD)模拟、改变波导弯曲半径计算损耗、绘制图像展示电场强度分布情况及对具有不同弯曲半径的波导进行一系列模拟和分析操作(代码均有注释讲解)。 一、创建弯曲波导 1.1 基本结构讲解 (1)包层(Clad) 在波导结…

HarmonyOS4+NEXT星河版入门与项目实战(23)------实现手机游戏摇杆功能

文章目录 1、案例效果2、案例实现1、代码实现2、代码解释4、总结1、案例效果 2、案例实现 1、代码实现 代码如下(示例): import router from @ohos.router import {ResizeDirection } from @ohos.UiTest import curves