当前位置: 首页 > news >正文

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

文章目录

  • 概述
    • 部署前端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 anyenvironment {APP_NAME = 'vue-web'APP_PROFILE = 'prod'APP_IMAGE = 'vue-web:dev'APP_PORT = 88}stages {stage('vue环境准备') {steps {sh """# 下载依赖 & 构建distcnpm 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 anyenvironment {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/shopizer.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'}}}
}

相关文章:

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

文章目录 概述部署前端Vue应用一、环境准备1、Dockerfile2、.dockerignore3、nginx.conf4、Jenkinsfile 二、Jenkins部署1、新建任务2、流水线3、Build Now 构建 & 访问 Springboot后端应用1. 准备工作2. 创建项目结构3. 编写 Dockerfile后端 Dockerfile (backend/Dockerfi…...

【Apache Paimon】-- 4 -- Flink 消费 kafka 数据,然后写入 paimon

目录 1、本地开发环境 2、kafka2paimon 实现流程 3、代码实现 3.1、项目名称 3.2、项目结构 3.3、Pom.xml 和 log4j.properties 文件 3.4、代码核心类 3.4.1、入口类:Kafka2PaimonDemo.java 3.4.2、参数解析类 3.4.2.1、JobParameterUtil.java( flink job schedule…...

【成功解决】:VS2019(Visual Studio 2019)遇到E2870问题:此配置中不支持 128 位浮点类型

起因:项目中需要用json来操作数据,就引了cJSON库(cJSON.h和cJSON.c文件),但是发现编译报错如下 E2870 此配置中不支持 128 位浮点类型 test0 ...\usr\include\x86_64-linux-gnu\bits\floatn.h 75 然后先新建了个工程来检查问题(甚至在这之前还以为是cjson…...

什么是TCP的三次握手?

TCP的三次握手:深入理解建立可靠连接的过程 引言 在计算机网络中,传输控制协议(TCP)是确保数据可靠传输的核心协议之一。TCP通过三次握手机制来建立一个稳定的、双向的连接,这对于确保数据的完整性和顺序至关重要。本…...

SQL教程(2):SQL基础语法及用途

在上一篇文章中,我们介绍了 SQL(结构化查询语言)的基本概念,以及它在用户研究中的重要作用。今天,我们将深入了解 SQL 的基本语法,并通过实际应用场景帮助你更好地理解如何使用 SQL 提取和分析数据。对于刚…...

在Ubuntu22.04 jammy下用qemu模型riscv32环境装鸿蒙(待续)

在使用实体ESP32C3 安装鸿蒙失败后,就是这个:完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)-CSDN博客转向用qemu模拟环境装鸿蒙 学习手册riscv32_virt/README_zh.md OpenHar…...

C++:基本-union是没有构造函数和析构函数的

今天发现当我在union中包含了多个结构体时,结构体有默认构造函数时,编译报错。 问题点: union不支持构造函数和析构函数union中的元素本身也是不支持构造函数和析构函数的。包含union的结构体也不支持构造函数和析构函数。 出错代码如下&a…...

报错 JSON.parse: expected property name or ‘}‘,JSON数据中对象的key值不为字符串

报错 JSON.parse: expected property name or ‘}’ 原因 多是因为数据转换时出错,可能是存在单引号或者对象key值不为string导致 这里记录下我遇见的问题(后端给的JSON数据里,对象key值不为string) 现在后端转换JSON数据大多…...

LeetCode 热题 100_旋转图像(20_48_中等_C++)(原地旋转;翻转)

LeetCode 热题 100_旋转图像(20_48) 题目描述:输入输出样例:题解:解题思路:思路一(原地旋转):思路二(翻转): 代码实现(思路…...

mysql查询所有用户及删除用户

查询用户 select user, host, password_expired from mysql.user;删除用户 DROP USER [username]localhost ;刷新权限 FLUSH PRIVILEGES;查询所有用户/账号设置/日志/开启日志 select user,host,password_expired,password_last_changed,password_li…...

Vue 鼠标滚轮缩放图片的实现

wheel"handleZoom" 监听鼠标滚轮事件 event.deltaY < 0 代表向上滚动 event.deltaY > 0 代表向下滚动 使用computed处理scale比例的变化 const imageStyle computed(() > ({ transform: translate(-50%, -50%…...

全景图 与 6面图转换

目录 全景图转6面图&#xff1a; 6面图转全景图 全景图转6面图&#xff1a; https://github.com/springcheese/panoramic_to_cubemap_generation # Necessary Imports import math import argparse import numpy as np from PIL import Image# Dictionary for CUBEMAP FACES…...

深入浅出:PHP 文件操作

文章目录 引言文件的基本操作打开文件读取文件逐行读取读取整个文件 写入文件追加写入覆盖写入 关闭文件 文件和目录的管理检查文件或目录是否存在创建和删除文件创建和删除目录复制和移动文件 处理文件权限设置文件权限获取文件权限 处理文件属性获取文件大小获取文件最后修改…...

116. UE5 GAS RPG 实现击杀掉落战利品功能

这一篇&#xff0c;我们实现敌人被击败后&#xff0c;掉落战利品的功能。首先&#xff0c;我们将创建一个新的结构体&#xff0c;用于定义掉落体的内容&#xff0c;方便我们设置掉落物。然后&#xff0c;我们实现敌人死亡时的掉落函数&#xff0c;并在蓝图里实现对应的逻辑&…...

【批处理脚本】更改Windows系统中的 hosts 解析文件

概述 作用 修改 Windows 系统中的 hosts 文件&#xff0c;可以实现 插入 或 删除 条目。该脚本允许用户以管理员权限执行&#xff0c;将特定的域名解析到指定的 IP 地址 应用场景 非常适用于需要频繁或批量修改 hosts 文件的场景&#xff1a; 屏蔽网站、域名重定向、DNS 污染防…...

fastDFS

docker 部署fastDFS docker pull delron/fastdfs docker-compose.yml version: 3services:fastdfs_tracker:image: delron/fastdfs:latestcontainer_name: trackerhostname: trackernetwork_mode: hostports:- "22122:22122"volumes:- ./data/tracker:/var/fdfsco…...

【Linux】存储

声明&#xff1a;以下内容均来学习自《Linux就该这么学》一书 Linux系统中的一切文件都是从“根(/)”目录开始的&#xff0c;并按照文件系统层次化标准&#xff08;FHS&#xff09;采用树形结构来存放文件&#xff0c;以及定义了常见目录的用途。此外&#xff0c;Linux系统中的…...

hadoop单机安装

步骤 1:安装 Java 安装 OpenJDK bash sudo yum install -y java-1.8.0-openjdk 验证 Java 安装 bash java -version 输出类似以下内容表示成功: arduino openjdk version “1.8.0_xxx” 步骤 2:下载 Hadoop 下载 Hadoop 安装包 前往 Hadoop 官方下载页面,获取最新稳…...

产品批量分类设置——未来之窗行业应用跨平台架构

一、批量统计分类 提高效率 节省时间&#xff1a;当商品数量庞大时&#xff0c;手动逐个修改商品分类是一项极其耗时的任务。例如&#xff0c;一个电商平台有数千种商品&#xff0c;如果手动操作&#xff0c;可能需要花费数天甚至数周的时间来完成分类转移。而批量设置功能可以…...

2024年中国各省份碳相关投资分析:区域差异与未来趋势

随着中国“双碳”目标的推进&#xff0c;各省份的碳相关投资逐渐成为推动绿色经济转型的关键力量。2024年&#xff0c;各地的双碳项目进入了快速发展阶段&#xff0c;尤其是在清洁能源、绿色技术和碳捕集领域。本文将分析中国各省份在碳减排、碳中和目标实现过程中的投资重点和…...

【六足机器人】03步态算法

温馨提示&#xff1a;此部分内容需要较强的数学能力&#xff0c;包括但不限于矩阵运算、坐标变换、数学几何。 一、数学知识 1.1 正逆运动学&#xff08;几何法&#xff09; 逆运动学解算函数 // 逆运动学-->计算出三个角度 void inverse_caculate(double x, double y, …...

路由VueRouter的基本使用

1.下载VueRouter到当前工程。 vue2&#xff1a;VueRouter3.x Vuex3.x。 vue3&#xff1a;VueRouter4.x Vuex4.x。 在终端使用命令&#xff1a; year add vue-router3.6.5 2.引入。 import VueRouter from vue-router 3,安装注册。 Vue.use(VueRouter) 4…...

Guiding a Diffusion Model with a Bad Version of Itself

Guiding a Diffusion Model with a Bad Version of Itself Abstract1. Introduction2. Background3. Why does CFG improve image quality?Score matching leads to outliers.CFG 消除异常值Discussion 4 Our method Abstract 在图像生成扩散模型中&#xff0c;主要关注的轴心…...

快速上手!低功耗Air724UG模组软件指南:FTP示例

Air724UG模组集成了高性能处理器和丰富的外设接口&#xff0c;支持多种通信协议&#xff0c;包括FTP&#xff08;文件传输协议&#xff09;。通过Air724UG模组&#xff0c;开发者可以轻松实现设备的远程文件管理功能。一起接着看下去吧&#xff01; 一、简介 FTP&#xff08;…...

GAMES101 完结篇(笔记和作业)

写在前面 我已经把笔记和作业代码放在了GitHub上&#xff0c;欢迎访问GAMES101笔记及作业 (github.com)&#xff0c;如果对你有帮助&#xff0c;欢迎fork or star 下面我想简单介绍一下这里面的东西 Homework Homework文件夹里有0~8的作业框架&#xff0c;参考的其他大佬的代…...

3D Slicer与MONAI人工智能三维影像处理

如何又快又高效的做三维影像&#xff1f;勾画roi&#xff1f; 案例1 患者腹腔占位半月余&#xff0c;完善CT增强扫描&#xff0c;使用Slicer 对肿瘤&#xff0c;胰腺&#xff0c;动脉&#xff0c;静脉进行三维重建。重建时间1-5分钟。 案例2 胸部CT平扫&#xff0c;使用 slic…...

NC65客开单据自定义项处理以及自定义项相关介绍(超级详细带图以及代码NC65自定义项大全)

自定义项教程 自定义项和物料辅助属性简介 自定义档案的概念&#xff1a; NC系统中有大量的档案&#xff0c;这些档案中有相当一部分为系统预置的&#xff0c;鉴于用户对系统应用的个性化需求&#xff0c;系统支持用户自定用户自己的档案&#xff0c;并对其进行维护管理&…...

责任链模式的理解和实践

责任链模式&#xff08;Chain of Responsibility&#xff09;是行为型设计模式之一&#xff0c;它通过将多个对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有对象处理它为止。这个模式的主要目的是将请求的发送者和接收者解耦&#xff0c;使请求沿着处理链传…...

【大模型-向量库】详解向量库管理:连接管理、集合管理、向量管理

在向量数据库&#xff08;Vector Database&#xff09;中&#xff0c;向量库管理的概念是非常重要的&#xff0c;因为它涉及到如何高效地存储、索引和检索大规模的向量数据。向量库管理通常包括三个主要方面&#xff1a;连接管理、集合管理和向量管理。以下是对这三者的详细解释…...

MySQL书籍推荐

《高性能MySQL&#xff08;第4版&#xff09;》-西尔维亚博特罗斯 系统层次 Mysql性能优化和高可用架构实践 2020 系统基础 MySQL性能调优与架构设计 系统基础 Mysql技术大全 2021 综合 MySQL数据库应用案例教程 综合实战 从入门到项目实践 综合实战 丰富 超值 MySQ…...