[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而,在实际操作中,尤其是在需要跨越不同操作系统边界时——例如将基于Linux的构建服务器上的Java应用程序部署到Windows Server环境中——可能会遇到一系列挑战。本文聚焦于这一特定场景,详细介绍如何使用Jenkins来创建和管理Jobs,以便从GitLab仓库中拉取最新的Java项目源码,经过自动化的构建过程,最终将其部署到Windows Server上运行。

jenkins 部署 : [笔记] Jenkins 安装与配置全攻略:Ubuntu 从零开始搭建持续集成环境
前端项目部署 :[笔记] 使用 Jenkins 和 Nginx 实现前端项目的持续集成与部署 (CICD) : 从 GitLab 拉取 前端项目并部署至 Windows Server


一. 安装 jenkins 插件

1. GitLab 相关插件

用于与 GitLab 仓库集成,支持拉取代码、触发构建等。

  • GitLab
    提供 GitLab 与 Jenkins 的集成,支持 GitLab Webhook、MR 触发构建等功能。

  • Git Plugin
    用于从 Git 仓库(包括 GitLab)拉取代码。

  • GitLab API
    提供与 GitLab API 的交互支持(可选,根据需求安装)。

2. 构建工具插件

用于构建 Java 项目。

  • Maven Integration Plugin
    如果使用 Maven 构建 Java 项目,需要安装此插件。

  • Gradle Plugin
    如果使用 Gradle 构建 Java 项目,需要安装此插件。

3. SSH 相关插件

用于通过 SSH 连接到 Windows Server 2019 并部署应用。

  • SSH Build Agents Plugin
    允许 Jenkins 使用 SSH 密钥进行身份验证。

  • Publish Over SSH
    支持通过 SSH 将构建产物传输到远程服务器(Windows Server 2019)。

在这里插入图片描述


二. 全局工具配置

在这里插入图片描述

1. Maven 配置

在这里插入图片描述

2. Maven 安装

在这里插入图片描述


三. 配置代码仓库

我的代码仓库是使用的 极狐 gitlab

1. 获取 gitlab 的访问令牌(Access tokens)

在这里插入图片描述

期间 read_repository 必须勾选

  • 仅需拉取代码:
    如果 Jenkins 只需要从 GitLab 拉取代码(例如通过 Git-over-HTTP 或 Repository Files API),那么只需授予 read_repository 权限即可。
  • 需要与 GitLab API 交互:
    如果 Jenkins 需要调用 GitLab API 来进行其他操作(比如获取项目详细信息、触发构建、管理合并请求等),你将需要授予 read_api 权限。这包括对所有群组和项目的读访问权、容器镜像库和软件包库的访问权等。
  • 高级集成:
    在某些情况下,你可能还需要更多的权限,例如推送代码、创建标签或分支等。这些情况通常需要更高的权限级别,如 write_repository 或自定义权限设置。

在这里插入图片描述

2. 配置 jenkins 凭证

  • 进入凭证管理
    在这里插入图片描述
  • 配置全局凭证

在这里插入图片描述

  • 添加凭证
    在这里插入图片描述
  • 选择类型 Username with password
    在这里插入图片描述

三. (win服务器使用) Windows Server 2019 启动 OpenSSH Server

1. 安装 OpenSSH Server

# 以管理员身份运行 PowerShell# 安装 OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0# 设置自动启动
Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic# 启动 SSH 服务
Start-Service sshd
Start-Service ssh-agent# 确认服务状态
Get-Service sshd

2. 配置 SSH 服务

编辑 C:\ProgramData\ssh\sshd_config 文件,添加或修改以下内容:

# 编辑 C:\ProgramData\ssh\sshd_config 文件,添加或修改以下内容:
PasswordAuthentication yes
PermitRootLogin yes
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe
KexAlgorithms diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256
HostKeyAlgorithms ssh-rsa,rsa-sha2-512,rsa-sha2-256

3. 重启 SSH 服务

Restart-Service sshd

4. 配置防火墙

# 添加防火墙规则
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

四. 配置 SSH Servers

在这里插入图片描述

1. 使用账号密码

注意 : windows 服务器的配置 Remote Directory 只能使用基础目录 , 不可修改

在这里插入图片描述

2. 使用秘钥

a. 生成SSH密钥对

  • 打开终端或命令提示符。
  • 运行以下命令生成SSH密钥对:
# 生成 RSA 密钥对
ssh-keygen -t rsa -b 4096 -C "jenkins@example.com"# 密钥默认保存在:
# - 私钥:C:\Users\jenkins\.ssh\id_rsa
# - 公钥:C:\Users\jenkins\.ssh\id_rsa.pub
  • ssh-keygen : 用于生成、管理和转换认证密钥对的命令行工具,主要用于SSH协议。通常位于 /usr/bin/ssh-keygen/usr/local/bin/ssh-keygen
  • -t rsa-t 指定要生成的密钥类型。rsa 表示生成RSA类型的密钥。RSA是一种非对称加密算法,广泛用于SSH连接。其他常见的密钥类型包括 dsa(较少使用)、ecdsaed25519
  • -b 4096-b 指定密钥的位数。4096 表示生成的RSA密钥长度为4096位。默认情况下,ssh-keygen 生成的RSA密钥长度为2048位。增加密钥长度可以提高安全性,但也会稍微增加计算开销。4096位是一个常用的、安全的选择。
  • -C "your_email@example.com" : -C 添加一个注释(comment)到生成的公钥中。"your_email@example.com" 是你提供的注释内容,通常是你的电子邮件地址。
  • 按照提示操作,可以接受默认路径和文件名(通常是 ~/.ssh/id_rsa~/.ssh/id_rsa.pub)。
    在这里插入图片描述

  • Enter passphrase (empty for no passphrase):系统会提示你输入一个密码短语(passphrase)。如果你设置了密码短语,每次使用私钥时都需要输入它。这增加了安全性,但也增加了使用的复杂性。(如果你不希望设置密码短语,直接按回车键即可。)
    在这里插入图片描述
    在这里插入图片描述

b. 将公钥复制到 Windows Server

  • 将生成的公钥文件(通常是 ~/.ssh/id_rsa.pub)的内容复制到剪贴板。
  • 将公钥内容添加到 authorized_keys 文件
# 创建 authorized_keys 文件并添加公钥内容
# 将 Jenkins 服务器上 id_rsa.pub 的内容复制到这个文件
Add-Content -Path C:\Users\Administrator\.ssh\authorized_keys -Value "ssh-rsa AAAA..."

-Value 是你的 ~/.ssh/id_rsa.pub 的内容

在这里插入图片描述

c. 编辑 C:\ProgramData\ssh\sshd_config

# 启用公钥认证
PubkeyAuthentication yes# 指定授权密钥文件位置
AuthorizedKeysFile .ssh/authorized_keys# 可选:禁用密码认证(更安全)
PasswordAuthentication no

在这里插入图片描述

d. 设置文件权限

# 设置 .ssh 目录的权限
icacls "C:\Users\Administrator\.ssh" /inheritance:r
icacls "C:\Users\Administrator\.ssh" /grant "SYSTEM:(F)"
icacls "C:\Users\Administrator\.ssh" /grant "ADMINISTRATORS:(F)"
icacls "C:\Users\Administrator\.ssh" /grant "Administrator:(F)"# 设置 authorized_keys 文件的权限
icacls "C:\Users\Administrator\.ssh\authorized_keys" /inheritance:r
icacls "C:\Users\Administrator\.ssh\authorized_keys" /grant "SYSTEM:(F)"
icacls "C:\Users\Administrator\.ssh\authorized_keys" /grant "ADMINISTRATORS:(F)"
icacls "C:\Users\Administrator\.ssh\authorized_keys" /grant "Administrator:(F)"

e. 重启 SSH 服务

# 重启 SSH 服务
Restart-Service sshd

f. 在 Jenkins 中配置 SSH Publisher:

path to key 与 key 只需要配置一个就可以

在这里插入图片描述

3. 测试连接

在这里插入图片描述


四. 编写 jobs

在这里插入图片描述
在这里插入图片描述

1. 配置源码管理

在这里插入图片描述

2. 配置 构建完成后 上传产物与运行脚本

注意:

  1. 可以选择 构建环境中的 Send files or execute commands over SSH after the build runs 也可以选择 构建后操作中的Send build artifacts over SSH
  2. Remote directory : 我使用的是环境参数,在 Jenkins 中使用环境参数使用 必须是 ${FOLDER_NAME} 的格式。
  3. windows 服务器 运行脚本的话,只能运行服务器上的脚本。
> Exec command : 
> ${DEPLOY_BAT_PATH} "${FOLDER_NAME}" "${DEPLOY_LOG_PATH}" "${BASE_SOURCE_PATH}" "${BASE_TARGET_PATH}" "${JAR_NAME}"

在这里插入图片描述

3. 配置环境变量

在 Jenkins 中使用环境参数使用 必须是 ${FOLDER_NAME} 的格式。

parameters {// 1. 部署文件夹名称string(name: 'FOLDER_NAME',defaultValue: 'sc-wms',description: '部署文件夹名称')// 2. 日志文件路径string(name: 'DEPLOY_LOG_PATH',defaultValue: 'D:\CICD\deploy\backend\deploy.log',description: '日志文件路径')// 3. 源代码基础路径string(name: 'BASE_SOURCE_PATH',defaultValue: 'C:\Users\Administrator',description: '源代码基础路径')// 4. 目标基础路径string(name: 'BASE_TARGET_PATH',defaultValue: 'D:\CICD\project\backend',description: '目标基础路径')// 5. JAR文件名称string(name: 'JAR_NAME',defaultValue: 'mada-admin.jar',description: 'JAR文件名称')// 6. 部署脚本路径string(name: 'DEPLOY_BAT_PATH',defaultValue: 'D:\CICD\deploy\backend\deploy.bat',description: '部署脚本路径')}

在这里插入图片描述

4. 服务器项目目录结构

D:\CICD\                            # Windows 服务器上的自动化部署目录
├── deploy/                         # 部署相关
│    ├── web/                       # 前端部署相关内容
│    │    ├── deploy.bat            # 前端部署脚本
│    │    └── nginx.conf.template   # 前端项目 Nginx 配置模板
│    └── backend/                   # 后端部署相关内容
│         └── deploy.bat            # 后端部署脚本
├── nginx/                          # nginx 安装目录
│    ├── conf/                      # nginx 配置目录
│    │    ├── mime.types            # MIME 类型配置
│    │    ├── nginx.conf            # nginx 主配置
│    │    └── project_conf/         # 项目配置目录
│    ├── contrib/                   # 第三方贡献
│    ├── docs/                      # 文档
│    ├── html/                      # 网站文件目录
│    │    └── sc-wms/               # sc-wms 前端文件
│    ├── logs/                      # 日志目录
│    │    ├── access.log            # 访问日志
│    │    └── error.log             # 错误日志
│    ├── temp/                      # 临时文件目录
│    │    ├── client_body_temp/     # 客户端请求体临时文件
│    │    ├── proxy_temp/           # 代理临时文件
│    │    ├── fastcgi_temp/         # FastCGI 临时文件
│    │    ├── uwsgi_temp/           # uWSGI 临时文件
│    │    └── scgi_temp/            # SCGI 临时文件
│    └── nginx.exe                  # nginx 可执行文件
└── project/                        # 项目相关├── web/                       # 前端项目目录│    ├── sc-wms/               # sc-wms 前端项目│    │    └── dist/            # 前端构建文件│    ├── other-project/        # 其他前端项目│    └── ...                   # 更多前端项目└── backend/                   # 后端项目目录├── sc-wms/               # sc-wms 后端项目│    ├── sc-wms.jar       # 后端 jar 包│    └── start.bat        # 启动脚本├── other-project/        # 后端其他项目└── ...                   # 更多后端项目

5. 编写脚本

部分内容声明 :

# 因为一些要求 , 要生成启动的脚本 , java -jar 换成 javaw -jar 也是一样的
echo Creating start script... >> %DEPLOY_LOG%
(echo @echo offecho cd /d "%TARGET_PATH%"echo java -jar "%JAR_NAME%" ^> "%TARGET_PATH%\app.log" 2^>^&1
) > "%TARGET_PATH%\start.bat"# 这里因为...用的盗版系统,环境变量被魔改过,start不会起作用.所以用 call 了,如果可以用start用start,call会等待。导致Jenkins超时
if exist "%TARGET_PATH%\%JAR_NAME%" (:: 启动应用cd /d "%TARGET_PATH%"call start.batecho Application started successfully >> %DEPLOY_LOG%
) else (echo WARNING: JAR file not found after deployment >> %DEPLOY_LOG%
)

完整脚本:

@echo off
setlocal EnableDelayedExpansion:: 检查参数
if "%~1"=="" (echo Error: folder_name parameter is missinggoto :usage
)
if "%~2"=="" (echo Error: deploy_log_path parameter is missinggoto :usage
)
if "%~3"=="" (echo Error: base_source_path parameter is missinggoto :usage
)
if "%~4"=="" (echo Error: base_target_path parameter is missinggoto :usage
)
if "%~5"=="" (echo Error: jar_name parameter is missinggoto :usage
):: 检查并创建日志文件目录
for %%I in ("%~2") do set "LOG_DIR=%%~dpI"
if not exist "!LOG_DIR!" (echo Creating log directory: !LOG_DIR!md "!LOG_DIR!" 2>nulif errorlevel 1 (echo Error: Failed to create log directorygoto :usage)
):: 设置日志文件和基础变量
set "FOLDER_NAME=%~1"
set "DEPLOY_LOG=%~2"
set "SOURCE_PATH=%~3\%FOLDER_NAME%"
set "TARGET_PATH=%~4\%FOLDER_NAME%"
set "JAR_NAME=%~5":: 记录部署开始
echo %date% %time% - Starting Jenkins deployment > %DEPLOY_LOG%
echo Configuration: >> %DEPLOY_LOG%
echo SOURCE_PATH=%SOURCE_PATH% >> %DEPLOY_LOG%
echo TARGET_PATH=%TARGET_PATH% >> %DEPLOY_LOG%
echo JAR_NAME=%JAR_NAME% >> %DEPLOY_LOG%:: 停止现有进程
echo %date% %time% - Attempting to stop existing process... >> %DEPLOY_LOG%
taskkill /F /IM java.exe /T >> %DEPLOY_LOG% 2>&1 || echo No Java processes found >> %DEPLOY_LOG%
echo %date% %time% - Process stop attempt completed >> %DEPLOY_LOG%:: 等待进程完全停止
echo %date% %time% - Waiting for processes to stop... >> %DEPLOY_LOG%
ping -n 11 127.0.0.1 > nul
echo %date% %time% - Wait completed >> %DEPLOY_LOG%:: 清理目标目录 - 即使失败也继续
echo Cleaning target directory... >> %DEPLOY_LOG%
if exist "%TARGET_PATH%" (rd /s /q "%TARGET_PATH%" >> %DEPLOY_LOG% 2>&1
):: 创建必要目录
md "%~4" 2>nul
md "%TARGET_PATH%" 2>nul:: 复制文件
echo Moving files... >> %DEPLOY_LOG%
robocopy "%SOURCE_PATH%" "%TARGET_PATH%" /E /MOVE /R:1 /W:1 >> %DEPLOY_LOG% 2>&1:: 创建启动脚本
echo Creating start script... >> %DEPLOY_LOG%
(echo @echo offecho cd /d "%TARGET_PATH%"echo java -jar "%JAR_NAME%" ^> "%TARGET_PATH%\app.log" 2^>^&1
) > "%TARGET_PATH%\start.bat":: 验证部署
if exist "%TARGET_PATH%\%JAR_NAME%" (:: 启动应用cd /d "%TARGET_PATH%"call start.batecho Application started successfully >> %DEPLOY_LOG%
) else (echo WARNING: JAR file not found after deployment >> %DEPLOY_LOG%
)echo Deployment completed at %date% %time% >> %DEPLOY_LOG%endlocal
exit /b 0:usage
echo Usage: deploy.bat [folder_name] [deploy_log_path] [base_source_path] [base_target_path] [jar_name]
echo Example: %%FOLDER_NAME%% %%DEPLOY_LOG_PATH%% %%BASE_SOURCE_PATH%% %%BASE_TARGET_PATH%% %%JAR_NAME%%
exit /b 1

五. 运行 jobs

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于“大型园区”网络设计

基于“大型园区”网络设计 目 录 第1章 项目概述1 1.1 项目背景1 1.2 公司概况1 1.3 网络现状2 第2章 需求分析4 2.1 部门需求4 2.2 配置需求4 2.3 网络功能需求5 第3章 网络设计6 3.1 建设原则6 3.2 网络拓扑结构6 3.3 IP地址和VLAN划分8 3.4 核心层设计9 3.5 …

回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测

回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测 目录 回归预测 | MATLAB实RVM-Adaboost相关向量机集成学习多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 RVM-Adaboost相关向量机集成学习多输入单输出回归预测是一种先进…

力扣经典练习题之70.爬楼梯

今天继续给大家分享一道力扣的做题心得今天这道题目是70.爬楼梯 题目如下: 题目链接:70.爬楼梯 1,题目分析 这个题目是一个经典的动态规划问题,它帮助我们理解如何通过分解问题来找到解决方案。在现实生活中,很多复杂…

Vue学习二——创建登录页面

前言 以一个登录页面为例子,这篇文章简单介绍了vue,element-plus的一些组件使用,vue-router页面跳转,pinia及持久化存储,axios发送请求的使用。后面的页面都大差不差,也都这么实现,只是内容&am…

ZYNQ初识10(zynq_7010)UART通信实验

基于bi站正点原子讲解视频: 系统框图(基于串口的数据回环)如下: 以下,是串口接收端的波形图,系统时钟和波特率时钟不同,为异步时钟,,需要先延时两拍,将时钟同…

java小知识点总结

一、比特流的本质就是数组 二、位运算 位运算就是CPU的底层原理&#xff0c;半导体电路进行位运算 位运算涉及一些算法&#xff0c;&和^ ^ 异或 两变量交换值&#xff0c;不依赖第三个变量 x^s k 异或知道两者就能推另一个 a a<<2就是乘以2的多少次方 相反 a…

vue3后台系统动态路由实现

动态路由的流程&#xff1a;用户登录之后拿到用户信息和token&#xff0c;再去请求后端给的动态路由表&#xff0c;前端处理路由格式为vue路由格式。 1&#xff09;拿到用户信息里面的角色之后再去请求路由表&#xff0c;返回的路由为tree格式 后端返回路由如下&#xff1a; …

贪心算法笔记

贪心算法笔记 大概内容 贪心就是对于一个问题有很多个步骤,我们在每一个步骤中都选取最优的那一个,最后得出答案。就是在一些函数中可行,但是有些比如二次函数,因为它的转折点不一定最优,就是不可行的。那么如何判断贪心呢?有这么几种 看时间复杂度,一般的就是 O ( n…

CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞

漏洞描述 GiveWP 插件中发现了一个严重漏洞&#xff0c;该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777&#xff0c;CVSS 评分为 9.8&#xff0c;表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装&#xff0c;为全球无数捐赠平…

ubuntu官方软件包网站 字体设置

在https://ubuntu.pkgs.org/22.04/ubuntu-universe-amd64/xl2tpd_1.3.16-1_amd64.deb.html搜索找到需要的软件后&#xff0c;点击&#xff0c;下滑&#xff0c; 即可在Links和Download找到相关链接&#xff0c;下载即可&#xff0c; 但是找不到ros的安装包&#xff0c; 字体设…

细说STM32F407单片机以DMA方式读写外部SRAM的方法

目录 一、工程配置 1、时钟、DEBUG、GPIO、CodeGenerator 2、USART3 3、NVIC 4、 FSMC 5、DMA 2 &#xff08;1&#xff09;创建MemToMem类型DMA流 &#xff08;2&#xff09;开启DMA流的中断 二、软件设计 1、KEYLED 2、fsmc.h、fsmc.c、dma.h、dma.c 3、main.h…

二分查找算法——山脉数组的峰顶索引

一.题目描述 852. 山脉数组的峰顶索引 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 题目给了我们一个山脉数组&#xff0c;山脉数组的值分布就如下面的样子&#xff1a; 然后我们只需要返回数组的峰值元素的下标即可。 三.算法原理 1.暴力解法 因为题目明确说明…

重塑视频创作的格局!ComfyUI-Mochi本地部署教程

一、介绍 mochi是近期Genmo公司开源的先进视频生成模型&#xff0c;具有高保真运动和强大的提示遵循性。此模型的发布极大的缩小了闭源和开源视频生成系统之间的差距。 目前&#xff0c;视频生成模型与现实之间存在巨大差距。其中最影响视频生成的两个关键功能也就是运动质量和…

Docker 安装开源的IT资产管理系统Snipe-IT

一、安装 1、创建docker-compose.yaml version: 3services:snipeit:container_name: snipeitimage: snipe/snipe-it:v6.1.2restart: alwaysports:- "8000:80"volumes:- ./logs:/var/www/html/storage/logsdepends_on:- mysqlenv_file:- .env.dockernetworks:- snip…

Oracle重启后业务连接大量library cache lock

一、现象 数据库和前段应用重启后&#xff0c;出现大量library cache lock等待事件。 二、分析解决 本次异常原因是&#xff1a;原因定位3&#xff1a; 库缓存对象无效 Library cache object Invalidations 三、各类情况具体分析如下 原因定位1&#xff1a;由于文字导致的非…

硬件设计-七位半电压表硬件方案(下)

目录 摘要 简介 解决方案和评估系统简介 应用聚焦&#xff1a;高准确度数据采集器 结论 摘要 本文探讨了为仪器仪表应用设计高准确度设备所涉及的挑战&#xff0c;并介绍了由低INL SAR ADC、全集成式超低温漂精密基准电压源、四通道匹配电阻网络和零漂移低噪声放大器构建的…

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…

Termora 一个开源的 SSH 跨平台客户端工具

Termora 是一个终端模拟器和 SSH 客户端&#xff0c;支持 Windows&#xff0c;macOS 和 Linux。 功能特性 支持 SSH 和本地终端支持 SFTP 文件传输支持 Windows、macOS、Linux 平台支持 Zmodem 协议支持 SSH 端口转发支持配置同步到 Gist支持宏&#xff08;录制脚本并回放&…

TypeScript Jest 单元测试 搭建

NPM TypeScript 项目搭建 创建目录 mkdir mockprojectcd mockproject初始化NPM项目 npm init -y安装TypeScript npm i -D typescript使用VSCode 打开项目 创建TS配置文件tsconfig.json {"compilerOptions": {"target": "es5","module&…

sql模糊关联匹配

需求目标&#xff1a; 建立临时表 drop table grafana_bi.zbj_gift_2024;USE grafana_bi; CREATE TABLE zbj_gift_2024 (id INT AUTO_INCREMENT PRIMARY KEY,userName VARCHAR(255),giftName VARCHAR(255),giftNum INT,points INT,teacher VARCHAR(255),sendDate DATETIME,…